diff --git a/BUILD.gn b/BUILD.gn
index e5ff9ce..b80ac2e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1308,6 +1308,7 @@
     testonly = true
     data_deps = [
       "chrome/browser/resources:closure_compile",
+      "chrome/test:closure_compile",
       "components/neterror/resources:closure_compile",
       "components/security_interstitials/core/common/resources:closure_compile",
       "components/sync/driver/resources:closure_compile",
diff --git a/DEPS b/DEPS
index 1c420090..66c1818 100644
--- a/DEPS
+++ b/DEPS
@@ -172,11 +172,11 @@
   # 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': '714f8cc3ff4be40ced5183a171816bef30665fbd',
+  'skia_revision': 'c4420ef3dc6c5688193da062d6ce81e84eb385ab',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '640360886bc99483214d3497865bf2ea884e6d5a',
+  'v8_revision': '67d4bf7ade77f8a3910c6861ad512b6f0fcbe4fa',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -184,7 +184,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': '322220a0b2055d5460c0176ed83c09914e5f459c',
+  'angle_revision': '8542baee0645c9f1787c2412690209e19d2c1b0e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -192,7 +192,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '762f11932e2419d59c3b0ecdc5c65817ec09d148',
+  'pdfium_revision': '636832d9a6668392ecea50fd43fcd06c4a3a2b79',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -235,7 +235,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '1944f6e6df687cc33511a9bdfa7622aadda94d1f',
+  'catapult_revision': '6d6b9a1ca930357ace8e8ebeebc01d69824c12f1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -243,7 +243,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': 'ab8035da9c1a9050b84971f177d54b5516000205',
+  'devtools_frontend_revision': 'e66080e9a1ff79cba8130169c16ebcd222747510',
   # 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.
@@ -291,7 +291,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': 'd9fbf0234869c4dda0bbe70e04f8f31d86c55ee5',
+  'spv_tools_revision': 'dc59b4b075e957e36cbecf4d754adc9b67ad1c9c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -303,15 +303,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'shaderc_revision': '13adddb32ef092b5beef3bae5e4582c8721aa92c',
+  'shaderc_revision': '76ee91e12642e2be731aac3f0f21401b0e7d9d16',
   # 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': 'f8045a095cc1c33b23025a465f347ce7cc32d696',
+  'dawn_revision': '64cfaeac4c5d9eaf3876a648258a1eefce912410',
   # 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': 'dfbd3df888652d8c9b8a945bcad16c5fbbaecc36',
+  'quiche_revision': '7a4d20901fbbf2cf46e84d363350608873f2594f',
   # 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.
@@ -871,7 +871,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'c1501a6caf64b27d29618757411840b2d7c53aa5',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'c2ef0f867b79e344bcbab6466a07297d75519598',
       'condition': 'checkout_linux',
   },
 
@@ -1311,7 +1311,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'ed392790fed14fdca3f95d0d739dfe2c005f8fb8',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '1af507800d72e284c139ba42cc8cedec27e63bfd',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1512,7 +1512,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'dd55f3ca8f2ea716ca917a4aaf36f0729fe902b1',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '4dffa04d4f00c35414a75eb01f39cdfff024dd32',
+    Var('webrtc_git') + '/src.git' + '@' + '70ec48ca281c360be46e093c4c2cc5f801e8224e',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -1579,7 +1579,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b4b80864f88f23297d9745cd805e654e562ab590',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@12e6d18c4860140a01518d5f269976319010b9f1',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index c609a31..19aa2c1 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -837,7 +837,9 @@
         'std::shared_ptr should not be used. Use scoped_refptr instead.',
       ),
       True,
-      [_THIRD_PARTY_EXCEPT_BLINK],  # Not an error in third_party folders.
+      [_THIRD_PARTY_EXCEPT_BLINK,
+       '^third_party/blink/renderer/core/typed_arrays/array_buffer/' +
+         'array_buffer_contents\.(cc|h)'],
     ),
     (
       r'/\bstd::weak_ptr\b',
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 6abadc7..ae93f48 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -503,7 +503,7 @@
     storage::OptionalQuotaSettingsCallback callback) {
   storage::GetNominalDynamicSettings(
       partition->GetPath(), context->IsOffTheRecord(),
-      storage::GetDefaultDiskInfoHelper(), std::move(callback));
+      storage::GetDefaultDeviceInfoHelper(), std::move(callback));
 }
 
 content::GeneratedCodeCacheSettings
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 34e22815..f5bb92c 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -138,6 +138,16 @@
   UMA_HISTOGRAM_ENUMERATION(kAppListToggleMethodHistogram, show_source);
 }
 
+base::Optional<TabletModeAnimationTransition>
+GetTransitionFromMetricsAnimationInfo(
+    base::Optional<HomeScreenDelegate::AnimationInfo> animation_info) {
+  if (!animation_info.has_value())
+    return base::nullopt;
+
+  return CalculateAnimationTransitionForMetrics(animation_info->trigger,
+                                                animation_info->showing);
+}
+
 }  // namespace
 
 AppListControllerImpl::AppListControllerImpl()
@@ -825,17 +835,27 @@
 void AppListControllerImpl::UpdateYPositionAndOpacityForHomeLauncher(
     int y_position_in_screen,
     float opacity,
+    base::Optional<AnimationInfo> animation_info,
     UpdateAnimationSettingsCallback callback) {
+  DCHECK(!animation_info.has_value() || !callback.is_null());
+
   presenter_.UpdateYPositionAndOpacityForHomeLauncher(
-      y_position_in_screen, opacity, std::move(callback));
+      y_position_in_screen, opacity,
+      GetTransitionFromMetricsAnimationInfo(std::move(animation_info)),
+      std::move(callback));
 }
 
 void AppListControllerImpl::UpdateScaleAndOpacityForHomeLauncher(
     float scale,
     float opacity,
+    base::Optional<AnimationInfo> animation_info,
     UpdateAnimationSettingsCallback callback) {
-  presenter_.UpdateScaleAndOpacityForHomeLauncher(scale, opacity,
-                                                  std::move(callback));
+  DCHECK(!animation_info.has_value() || !callback.is_null());
+
+  presenter_.UpdateScaleAndOpacityForHomeLauncher(
+      scale, opacity,
+      GetTransitionFromMetricsAnimationInfo(std::move(animation_info)),
+      std::move(callback));
 }
 
 void AppListControllerImpl::UpdateAfterHomeLauncherShown() {
@@ -981,7 +1001,8 @@
                                              int event_flags,
                                              AppListLaunchedFrom launched_from,
                                              AppListLaunchType launch_type,
-                                             int suggestion_index) {
+                                             int suggestion_index,
+                                             bool launch_as_default) {
   SearchResult* result = search_model_.FindSearchResult(result_id);
   if (!result)
     return;
@@ -1044,7 +1065,8 @@
   } else {
     if (client_)
       client_->OpenSearchResult(result_id, event_flags, launched_from,
-                                launch_type, suggestion_index);
+                                launch_type, suggestion_index,
+                                launch_as_default);
   }
 
   ResetHomeLauncherIfShown();
@@ -1576,18 +1598,6 @@
   model_->RemoveObserver(this);
 }
 
-void AppListControllerImpl::NotifyHomeLauncherAnimationTransition(
-    AnimationTrigger trigger,
-    bool launcher_will_show) {
-  // The AppListView may not exist if this is happening after tablet mode
-  // has started, but before the view is created.
-  if (!presenter_.GetView())
-    return;
-
-  presenter_.GetView()->OnTabletModeAnimationTransitionNotified(
-      CalculateAnimationTransitionForMetrics(trigger, launcher_will_show));
-}
-
 bool AppListControllerImpl::IsHomeScreenVisible() {
   return IsTabletMode() && IsVisible();
 }
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h
index ba187ec..457f3e391 100644
--- a/ash/app_list/app_list_controller_impl.h
+++ b/ash/app_list/app_list_controller_impl.h
@@ -167,7 +167,8 @@
                         int event_flags,
                         AppListLaunchedFrom launched_from,
                         AppListLaunchType launch_type,
-                        int suggestion_index) override;
+                        int suggestion_index,
+                        bool launch_as_default) override;
   void LogResultLaunchHistogram(SearchResultLaunchLocation launch_location,
                                 int suggestion_index) override;
   void LogSearchAbandonHistogram() override;
@@ -275,15 +276,15 @@
   void UpdateYPositionAndOpacityForHomeLauncher(
       int y_position_in_screen,
       float opacity,
+      base::Optional<AnimationInfo> animation_info,
       UpdateAnimationSettingsCallback callback) override;
   void UpdateScaleAndOpacityForHomeLauncher(
       float scale,
       float opacity,
+      base::Optional<AnimationInfo> animation_info,
       UpdateAnimationSettingsCallback callback) override;
   void UpdateAfterHomeLauncherShown() override;
   base::Optional<base::TimeDelta> GetOptionalAnimationDuration() override;
-  void NotifyHomeLauncherAnimationTransition(AnimationTrigger trigger,
-                                             bool launcher_will_show) override;
   void OnHomeLauncherAnimationComplete(bool shown, int64_t display_id) override;
   void OnHomeLauncherTargetPositionChanged(bool showing,
                                            int64_t display_id) override;
diff --git a/ash/app_list/app_list_presenter_impl.cc b/ash/app_list/app_list_presenter_impl.cc
index e50fbd6..5618a7c 100644
--- a/ash/app_list/app_list_presenter_impl.cc
+++ b/ash/app_list/app_list_presenter_impl.cc
@@ -36,6 +36,12 @@
 namespace ash {
 namespace {
 
+constexpr std::array<int, 6> kIdsOfContainersThatWontHideAppList = {
+    kShellWindowId_AppListContainer,     kShellWindowId_HomeScreenContainer,
+    kShellWindowId_MenuContainer,        kShellWindowId_SettingBubbleContainer,
+    kShellWindowId_ShelfBubbleContainer, kShellWindowId_ShelfContainer,
+};
+
 inline ui::Layer* GetLayer(views::Widget* widget) {
   return widget->GetNativeView()->layer();
 }
@@ -60,12 +66,6 @@
 
 }  // namespace
 
-constexpr std::array<int, 6> kIdsOfContainersThatWontHideAppList = {
-    kShellWindowId_AppListContainer,     kShellWindowId_HomeScreenContainer,
-    kShellWindowId_MenuContainer,        kShellWindowId_SettingBubbleContainer,
-    kShellWindowId_ShelfBubbleContainer, kShellWindowId_ShelfContainer,
-};
-
 AppListPresenterImpl::AppListPresenterImpl(
     std::unique_ptr<AppListPresenterDelegate> delegate)
     : delegate_(std::move(delegate)) {
@@ -241,6 +241,7 @@
 void AppListPresenterImpl::UpdateYPositionAndOpacityForHomeLauncher(
     int y_position_in_screen,
     float opacity,
+    base::Optional<TabletModeAnimationTransition> transition,
     UpdateHomeLauncherAnimationSettingsCallback callback) {
   if (!view_)
     return;
@@ -270,12 +271,14 @@
     settings.emplace(layer->GetAnimator());
     callback.Run(&settings.value());
   }
+
+  // The animation metrics reporter will run for opacity and transform
+  // animations separately - to avoid reporting duplicated values, add the
+  // reported for transform animation only.
   layer->SetOpacity(opacity);
 
-  // Only record animation metrics for transformation animation. Because the
-  // animation triggered by setting opacity should have the same metrics values
-  // with the transformation animation.
-  if (settings.has_value()) {
+  if (settings.has_value() && transition.has_value()) {
+    view_->OnTabletModeAnimationTransitionNotified(transition.value());
     settings->SetAnimationMetricsReporter(
         view_->GetStateTransitionMetricsReporter());
   }
@@ -289,6 +292,7 @@
 void AppListPresenterImpl::UpdateScaleAndOpacityForHomeLauncher(
     float scale,
     float opacity,
+    base::Optional<TabletModeAnimationTransition> transition,
     UpdateHomeLauncherAnimationSettingsCallback callback) {
   if (!view_)
     return;
@@ -315,11 +319,20 @@
     callback.Run(&settings.value());
   }
 
+  // The animation metrics reporter will run for opacity and transform
+  // animations separately - to avoid reporting duplicated values, add the
+  // reported for transform animation only.
+  layer->SetOpacity(opacity);
+
+  if (settings.has_value() && transition.has_value()) {
+    view_->OnTabletModeAnimationTransitionNotified(*transition);
+    settings->SetAnimationMetricsReporter(
+        view_->GetStateTransitionMetricsReporter());
+  }
+
   gfx::Transform transform =
       gfx::GetScaleTransform(gfx::Rect(layer->size()).CenterPoint(), scale);
   layer->SetTransform(transform);
-
-  layer->SetOpacity(opacity);
 }
 
 void AppListPresenterImpl::ShowEmbeddedAssistantUI(bool show) {
diff --git a/ash/app_list/app_list_presenter_impl.h b/ash/app_list/app_list_presenter_impl.h
index 53467c9b..22839cd0 100644
--- a/ash/app_list/app_list_presenter_impl.h
+++ b/ash/app_list/app_list_presenter_impl.h
@@ -105,17 +105,27 @@
   // Updates the y position and opacity of the full screen app list. The changes
   // are slightly different than UpdateYPositionAndOpacity. If |callback| is non
   // null the this will animate using the animation settings in |callback|.
+  // |transition| - The tablet mode animation type. Used to report animation
+  // metrics if the home launcher change is animated. Should be set only if
+  // |callback| is non-null. If not set, the animation smoothness metrics will
+  // not be reported.
   void UpdateYPositionAndOpacityForHomeLauncher(
       int y_position_in_screen,
       float opacity,
+      base::Optional<TabletModeAnimationTransition> transition,
       UpdateHomeLauncherAnimationSettingsCallback callback);
 
   // Scales the home launcher view maintaining the view center point, and
   // updates its opacity. If |callback| is non-null, the update should be
   // animated, and the |callback| should be called with the animation settings.
+  // |transition| - The tablet mode animation type. Used to report animation
+  // metrics if the home launcher change is animated. Should be set only if
+  // |callback| is non-null. If not set, the animation smoothness metrics will
+  // not be reported.
   void UpdateScaleAndOpacityForHomeLauncher(
       float scale,
       float opacity,
+      base::Optional<TabletModeAnimationTransition> transition,
       UpdateHomeLauncherAnimationSettingsCallback callback);
 
   // Shows or hides the Assistant page.
diff --git a/ash/app_list/app_list_view_delegate.h b/ash/app_list/app_list_view_delegate.h
index 43c77efa..588252c 100644
--- a/ash/app_list/app_list_view_delegate.h
+++ b/ash/app_list/app_list_view_delegate.h
@@ -62,11 +62,14 @@
   // chrome/browser/ui/app_list/app_launch_event_logger.proto. |launch_type| is
   // either kAppSearchResult or kSearchResult and is used to determine which
   // histograms to log to.
+  // |launch_as_default|: True if the result is launched as the default result
+  // by user pressing ENTER key.
   virtual void OpenSearchResult(const std::string& result_id,
                                 int event_flags,
                                 ash::AppListLaunchedFrom launched_from,
                                 ash::AppListLaunchType launch_type,
-                                int suggestion_index) = 0;
+                                int suggestion_index,
+                                bool launch_as_default) = 0;
 
   // Called to log UMA metrics for the launch of an item either in the app tile
   // list or the search result list. The |launch_location| argument determines
diff --git a/ash/app_list/test/app_list_test_view_delegate.cc b/ash/app_list/test/app_list_test_view_delegate.cc
index 63fcde7..a7cdd828 100644
--- a/ash/app_list/test/app_list_test_view_delegate.cc
+++ b/ash/app_list/test/app_list_test_view_delegate.cc
@@ -42,7 +42,8 @@
     int event_flags,
     ash::AppListLaunchedFrom launched_from,
     ash::AppListLaunchType launch_type,
-    int suggestion_index) {
+    int suggestion_index,
+    bool launch_as_default) {
   const SearchModel::SearchResults* results = search_model_->results();
   for (size_t i = 0; i < results->item_count(); ++i) {
     if (results->GetItemAt(i)->id() == result_id) {
diff --git a/ash/app_list/test/app_list_test_view_delegate.h b/ash/app_list/test/app_list_test_view_delegate.h
index 5ee49ce..3675c76 100644
--- a/ash/app_list/test/app_list_test_view_delegate.h
+++ b/ash/app_list/test/app_list_test_view_delegate.h
@@ -66,7 +66,8 @@
                         int event_flags,
                         ash::AppListLaunchedFrom launched_from,
                         ash::AppListLaunchType launch_type,
-                        int suggestion_index) override;
+                        int suggestion_index,
+                        bool launch_as_default) override;
   void LogResultLaunchHistogram(SearchResultLaunchLocation launch_location,
                                 int suggestion_index) override {}
   void LogSearchAbandonHistogram() override {}
diff --git a/ash/app_list/test/test_app_list_client.h b/ash/app_list/test/test_app_list_client.h
index dc85bd5..a4aaf625 100644
--- a/ash/app_list/test/test_app_list_client.h
+++ b/ash/app_list/test/test_app_list_client.h
@@ -29,7 +29,8 @@
                         int event_flags,
                         ash::AppListLaunchedFrom launched_from,
                         ash::AppListLaunchType launch_type,
-                        int suggestion_index) override {}
+                        int suggestion_index,
+                        bool launch_as_default) override {}
   void InvokeSearchResultAction(const std::string& result_id,
                                 int action_index,
                                 int event_flags) override {}
diff --git a/ash/app_list/views/app_list_view_unittest.cc b/ash/app_list/views/app_list_view_unittest.cc
index d1ee41b..c5f2539 100644
--- a/ash/app_list/views/app_list_view_unittest.cc
+++ b/ash/app_list/views/app_list_view_unittest.cc
@@ -1224,7 +1224,7 @@
     contents_view()
         ->search_results_page_view()
         ->result_selection_controller()
-        ->ResetSelection(nullptr);
+        ->ResetSelection(nullptr, false);
   }
 
   if (app_list_features::IsSearchBoxSelectionEnabled()) {
diff --git a/ash/app_list/views/result_selection_controller.cc b/ash/app_list/views/result_selection_controller.cc
index d5a9b27..79424d6 100644
--- a/ash/app_list/views/result_selection_controller.cc
+++ b/ash/app_list/views/result_selection_controller.cc
@@ -51,7 +51,7 @@
 
   ResultLocationDetails next_location;
   if (!selected_location_details_) {
-    ResetSelection(&event);
+    ResetSelection(&event, false /* default_selection */);
     return MoveResult::kResultChanged;
   }
 
@@ -61,7 +61,8 @@
   return result;
 }
 
-void ResultSelectionController::ResetSelection(const ui::KeyEvent* key_event) {
+void ResultSelectionController::ResetSelection(const ui::KeyEvent* key_event,
+                                               bool default_selection) {
   // Prevents crash on start up
   if (result_selection_model_->size() == 0)
     return;
@@ -99,16 +100,22 @@
 
   selected_result_ = new_selection;
 
-  if (selected_result_)
+  // Set the state of the new selected result.
+  if (selected_result_) {
     selected_result_->SetSelected(true, is_shift_tab);
+    selected_result_->set_is_default_result(default_selection);
+  }
 
   selection_change_callback_.Run();
 }
 
 void ResultSelectionController::ClearSelection() {
   selected_location_details_ = nullptr;
-  if (selected_result_)
+  if (selected_result_) {
+    // Reset the state of the previous selected result.
     selected_result_->SetSelected(false, base::nullopt);
+    selected_result_->set_is_default_result(false);
+  }
   selected_result_ = nullptr;
 }
 
@@ -231,6 +238,10 @@
   ClearSelection();
 
   selected_result_ = GetResultAtLocation(location);
+  // SetSelection is only called by MoveSelection when user changes
+  // selected result, therefore, the result selected by user is not
+  // a default result.
+  selected_result_->set_is_default_result(false);
   selected_location_details_ =
       std::make_unique<ResultLocationDetails>(location);
   selected_result_->SetSelected(true, reverse_tab_order);
diff --git a/ash/app_list/views/result_selection_controller.h b/ash/app_list/views/result_selection_controller.h
index 8295ca6ea..0f92bc2 100644
--- a/ash/app_list/views/result_selection_controller.h
+++ b/ash/app_list/views/result_selection_controller.h
@@ -102,7 +102,9 @@
   // Resets the selection to the first result.
   // |key_event| - The key event that triggered reselect, if any. Used to
   //     determine whether selection should start at the last element.
-  void ResetSelection(const ui::KeyEvent* key_event);
+  // |default_selection| - True if it resets the first result as default
+  //     selection.
+  void ResetSelection(const ui::KeyEvent* key_event, bool default_selection);
 
   // Clears the |selected_result_|, |selected_location_details_|.
   void ClearSelection();
diff --git a/ash/app_list/views/result_selection_controller_unittest.cc b/ash/app_list/views/result_selection_controller_unittest.cc
index f386291a..c308a832 100644
--- a/ash/app_list/views/result_selection_controller_unittest.cc
+++ b/ash/app_list/views/result_selection_controller_unittest.cc
@@ -460,7 +460,7 @@
     };
 
     // Initialize the RSC for test.
-    result_selection_controller_->ResetSelection(nullptr);
+    result_selection_controller_->ResetSelection(nullptr, false);
     EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
     ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -656,7 +656,7 @@
   containers_.emplace_back(vertical_container.get());
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestSingleAxisTraversal(&down_arrow_, &up_arrow_);
@@ -673,7 +673,7 @@
   containers_.emplace_back(vertical_container.get());
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestSingleAxisTraversal(&tab_key_, &shift_tab_key_);
@@ -693,7 +693,7 @@
   containers_.emplace_back(horizontal_container.get());
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestSingleAxisTraversal(forward, backward);
@@ -710,7 +710,7 @@
   containers_.emplace_back(vertical_container.get());
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(false);
@@ -727,7 +727,7 @@
   containers_.emplace_back(vertical_container.get());
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(true);
@@ -739,7 +739,7 @@
   SetContainers(vertical_containers);
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(false);
@@ -751,7 +751,7 @@
   SetContainers(vertical_containers);
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(true);
@@ -764,7 +764,7 @@
   SetContainers(horizontal_containers);
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(false);
@@ -777,7 +777,7 @@
   SetContainers(horizontal_containers);
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(true);
@@ -789,7 +789,7 @@
   SetContainers(containers);
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(false);
@@ -801,7 +801,7 @@
   SetContainers(containers);
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(false);
@@ -813,7 +813,7 @@
   SetContainers(containers);
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(false);
@@ -825,7 +825,7 @@
   SetContainers(containers);
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   TestMultiAxisTraversal(false);
@@ -855,7 +855,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -918,7 +918,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -954,7 +954,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -1002,7 +1002,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -1043,7 +1043,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ui::KeyEvent* forward = is_rtl_ ? &left_arrow_ : &right_arrow_;
@@ -1103,7 +1103,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -1159,7 +1159,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -1175,7 +1175,7 @@
   // Reset selection - reset selects the new first result, i.e. the same result
   // as before reset. The selected action should remain the same.
   TestResultView* pre_reset_selection = GetCurrentSelection();
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(pre_reset_selection, GetCurrentSelection());
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
   EXPECT_TRUE(CurrentResultActionSelected(0));
@@ -1198,7 +1198,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -1220,7 +1220,7 @@
 
   // Reset selection.
   TestResultView* pre_reset_selection = GetCurrentSelection();
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
   EXPECT_TRUE(CurrentResultActionNotSelected());
@@ -1244,7 +1244,7 @@
   };
 
   // Initialize the RSC for test.
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -1332,7 +1332,7 @@
   };
 
   // Set up non default selection,
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   result_selection_controller_->MoveSelection(down_arrow_);
   EXPECT_EQ(2, GetAndResetSelectionChangeCount());
   ASSERT_EQ(create_test_location(0, 1), GetCurrentLocation());
@@ -1341,7 +1341,7 @@
   // not change the selected result.
   result_selection_controller_->set_block_selection_changes(true);
 
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(0, GetAndResetSelectionChangeCount());
   ASSERT_EQ(create_test_location(0, 1), GetCurrentLocation());
   EXPECT_TRUE(result_selection_controller_->selected_result());
@@ -1349,7 +1349,7 @@
   // Reset should be enabled once selection changes are unblocked.
   result_selection_controller_->set_block_selection_changes(false);
 
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
@@ -1367,7 +1367,7 @@
   // Test that calling reset selection while selection changes are blocked does
   // not set the selected result.
   result_selection_controller_->set_block_selection_changes(true);
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(0, GetAndResetSelectionChangeCount());
 
   EXPECT_FALSE(result_selection_controller_->selected_result());
@@ -1376,7 +1376,7 @@
   // Reset should be enabled once selection changes are unblocked.
   result_selection_controller_->set_block_selection_changes(false);
 
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
 
   EXPECT_TRUE(result_selection_controller_->selected_result());
@@ -1397,7 +1397,7 @@
                                  false /*container_is_horizontal*/);
   };
 
-  result_selection_controller_->ResetSelection(nullptr);
+  result_selection_controller_->ResetSelection(nullptr, false);
   EXPECT_EQ(1, GetAndResetSelectionChangeCount());
   ASSERT_EQ(create_test_location(0, 0), GetCurrentLocation());
 
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index 1c2f18c3..75be5191 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -634,7 +634,8 @@
         selection_controller->selected_result();
     if (selected_result && selected_result->result())
       selected_result->OnKeyEvent(&event);
-    selection_controller->ResetSelection(nullptr);
+    // Reset the selected result to the default result.
+    selection_controller->ResetSelection(nullptr, true /* default_selection */);
     search_box()->SetText(base::string16());
     return true;
   }
diff --git a/ash/app_list/views/search_result_answer_card_view.cc b/ash/app_list/views/search_result_answer_card_view.cc
index 8a85c180..b1708105 100644
--- a/ash/app_list/views/search_result_answer_card_view.cc
+++ b/ash/app_list/views/search_result_answer_card_view.cc
@@ -198,8 +198,8 @@
       // Shouldn't eat Space; we want Space to go to the search box.
       return false;
     }
-
-    return Button::OnKeyPressed(event);
+    ActivateResult(event.flags(), false /* by_button_press */);
+    return true;
   }
 
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
@@ -217,17 +217,22 @@
   // views::ButtonListener overrides:
   void ButtonPressed(views::Button* sender, const ui::Event& event) override {
     DCHECK(sender == this);
+    ActivateResult(event.flags(), true /* by_button_press */);
+  }
+
+ private:
+  void ActivateResult(int event_flags, bool by_button_press) {
     if (result()) {
       RecordSearchResultOpenSource(result(), view_delegate_->GetModel(),
                                    view_delegate_->GetSearchModel());
       view_delegate_->OpenSearchResult(
-          result()->id(), event.flags(),
+          result()->id(), event_flags,
           ash::AppListLaunchedFrom::kLaunchedFromSearchBox,
-          ash::AppListLaunchType::kSearchResult, -1 /* suggestion_index */);
+          ash::AppListLaunchType::kSearchResult, -1 /* suggestion_index */,
+          !by_button_press && is_default_result() /* launch_as_default */);
     }
   }
 
- private:
   // content::NavigableContentsObserver overrides:
   void DidFinishNavigation(
       const GURL& url,
diff --git a/ash/app_list/views/search_result_base_view.h b/ash/app_list/views/search_result_base_view.h
index 684d307..af7b3cd 100644
--- a/ash/app_list/views/search_result_base_view.h
+++ b/ash/app_list/views/search_result_base_view.h
@@ -71,6 +71,12 @@
     return result_display_start_time_;
   }
 
+  void set_is_default_result(bool is_default) {
+    is_default_result_ = is_default;
+  }
+
+  bool is_default_result() const { return is_default_result_; }
+
   // views::Button:
   bool SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) override;
 
@@ -114,6 +120,9 @@
   // The starting time when |result_| is being displayed.
   base::TimeTicks result_display_start_time_;
 
+  // True if |result_| is selected as the default result which can be
+  // activated by user by pressing ENTER key.
+  bool is_default_result_ = false;
   SearchResult* result_ = nullptr;  // Owned by SearchModel::SearchResults.
 
   DISALLOW_COPY_AND_ASSIGN(SearchResultBaseView);
diff --git a/ash/app_list/views/search_result_list_view.cc b/ash/app_list/views/search_result_list_view.cc
index 976e027f..70ed407 100644
--- a/ash/app_list/views/search_result_list_view.cc
+++ b/ash/app_list/views/search_result_list_view.cc
@@ -310,7 +310,8 @@
 }
 
 void SearchResultListView::SearchResultActivated(SearchResultView* view,
-                                                 int event_flags) {
+                                                 int event_flags,
+                                                 bool by_button_press) {
   if (view_delegate_ && view->result()) {
     RecordSearchResultOpenSource(view->result(), view_delegate_->GetModel(),
                                  view_delegate_->GetSearchModel());
@@ -323,7 +324,8 @@
     view_delegate_->OpenSearchResult(
         view->result()->id(), event_flags,
         AppListLaunchedFrom::kLaunchedFromSearchBox,
-        AppListLaunchType::kSearchResult, -1 /* suggestion_index */);
+        AppListLaunchType::kSearchResult, -1 /* suggestion_index */,
+        !by_button_press && view->is_default_result() /* launch_as_default */);
   }
 }
 
diff --git a/ash/app_list/views/search_result_list_view.h b/ash/app_list/views/search_result_list_view.h
index 27f3d3d..5bdc0f3 100644
--- a/ash/app_list/views/search_result_list_view.h
+++ b/ash/app_list/views/search_result_list_view.h
@@ -31,7 +31,9 @@
                        AppListViewDelegate* view_delegate);
   ~SearchResultListView() override;
 
-  void SearchResultActivated(SearchResultView* view, int event_flags);
+  void SearchResultActivated(SearchResultView* view,
+                             int event_flags,
+                             bool by_button_press);
 
   void SearchResultActionActivated(SearchResultView* view,
                                    size_t action_index,
diff --git a/ash/app_list/views/search_result_page_view.cc b/ash/app_list/views/search_result_page_view.cc
index b07a5c2..7feb135 100644
--- a/ash/app_list/views/search_result_page_view.cc
+++ b/ash/app_list/views/search_result_page_view.cc
@@ -386,9 +386,11 @@
   AppListPage::contents_view()->GetSearchBoxView()->ProcessAutocomplete();
 
   if (app_list_features::IsSearchBoxSelectionEnabled()) {
-    // Reset selection to first when things change.
+    // Reset selection to first when things change. The first result is set as
+    // as the default result.
     result_selection_controller_->set_block_selection_changes(false);
-    result_selection_controller_->ResetSelection(nullptr /*key_event*/);
+    result_selection_controller_->ResetSelection(nullptr /*key_event*/,
+                                                 true /* default_selection */);
   } else {
     // Highlight the first result after search results are updated. Note that
     // the focus is not set on the first result to prevent frequent focus switch
diff --git a/ash/app_list/views/search_result_suggestion_chip_view.cc b/ash/app_list/views/search_result_suggestion_chip_view.cc
index e821b504..5bf0f36 100644
--- a/ash/app_list/views/search_result_suggestion_chip_view.cc
+++ b/ash/app_list/views/search_result_suggestion_chip_view.cc
@@ -106,7 +106,8 @@
   view_delegate_->OpenSearchResult(
       result()->id(), event.flags(),
       ash::AppListLaunchedFrom::kLaunchedFromSuggestionChip,
-      ash::AppListLaunchType::kAppSearchResult, index_in_container());
+      ash::AppListLaunchType::kAppSearchResult, index_in_container(),
+      false /* launch_as_default */);
 }
 
 const char* SearchResultSuggestionChipView::GetClassName() const {
diff --git a/ash/app_list/views/search_result_tile_item_view.cc b/ash/app_list/views/search_result_tile_item_view.cc
index da484ec..26a2bd36 100644
--- a/ash/app_list/views/search_result_tile_item_view.cc
+++ b/ash/app_list/views/search_result_tile_item_view.cc
@@ -247,7 +247,7 @@
 
 void SearchResultTileItemView::ButtonPressed(views::Button* sender,
                                              const ui::Event& event) {
-  ActivateResult(event.flags());
+  ActivateResult(event.flags(), true /* by_button_press */);
 }
 
 void SearchResultTileItemView::GetAccessibleNodeData(
@@ -275,7 +275,7 @@
     return true;
 
   if (event.key_code() == ui::VKEY_RETURN) {
-    ActivateResult(event.flags());
+    ActivateResult(event.flags(), false /* by_button_press */);
     return true;
   }
   return false;
@@ -387,7 +387,8 @@
   OnBlur();
 }
 
-void SearchResultTileItemView::ActivateResult(int event_flags) {
+void SearchResultTileItemView::ActivateResult(int event_flags,
+                                              bool by_button_press) {
   if (result()->result_type() == AppListSearchResultType::kPlayStoreApp) {
     UMA_HISTOGRAM_MEDIUM_TIMES(
         "Arc.PlayStoreSearch.ResultClickLatency",
@@ -404,7 +405,8 @@
                                view_delegate_->GetSearchModel());
   view_delegate_->OpenSearchResult(
       result()->id(), event_flags, AppListLaunchedFrom::kLaunchedFromSearchBox,
-      AppListLaunchType::kAppSearchResult, index_in_container());
+      AppListLaunchType::kAppSearchResult, index_in_container(),
+      is_default_result() && !by_button_press /* launch_as_default */);
   view_delegate_->LogResultLaunchHistogram(
       SearchResultLaunchLocation::kTileList, index_in_container());
 }
diff --git a/ash/app_list/views/search_result_tile_item_view.h b/ash/app_list/views/search_result_tile_item_view.h
index c16e2c1..eb19e60 100644
--- a/ash/app_list/views/search_result_tile_item_view.h
+++ b/ash/app_list/views/search_result_tile_item_view.h
@@ -74,7 +74,9 @@
 
  private:
   // Launch the result and log to various histograms.
-  void ActivateResult(int event_flags);
+  // |by_button_press|: True if |result_| is activated by button pressing;
+  //                    otherwise |result| is activated by ENTER key pressing.
+  void ActivateResult(int event_flags, bool by_button_press);
 
   // Bound by ShowContextMenuForViewImpl().
   void OnGetContextMenuModel(views::View* source,
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc
index 1c89db54..040b5df 100644
--- a/ash/app_list/views/search_result_view.cc
+++ b/ash/app_list/views/search_result_view.cc
@@ -231,7 +231,8 @@
                                           actions_view()->GetSelectedAction()),
                                       event.flags());
       } else {
-        list_view_->SearchResultActivated(this, event.flags());
+        list_view_->SearchResultActivated(this, event.flags(),
+                                          false /* by_button_press */);
       }
       return true;
     case ui::VKEY_UP:
@@ -370,7 +371,8 @@
 void SearchResultView::ButtonPressed(views::Button* sender,
                                      const ui::Event& event) {
   DCHECK(sender == this);
-  list_view_->SearchResultActivated(this, event.flags());
+  list_view_->SearchResultActivated(this, event.flags(),
+                                    true /* by_button_press */);
 }
 
 void SearchResultView::OnMetadataChanged() {
diff --git a/ash/home_screen/home_launcher_gesture_handler.cc b/ash/home_screen/home_launcher_gesture_handler.cc
index 9bd913a..36d40fd8 100644
--- a/ash/home_screen/home_launcher_gesture_handler.cc
+++ b/ash/home_screen/home_launcher_gesture_handler.cc
@@ -355,7 +355,8 @@
   mode_ = Mode::kSlideUpToShow;
 
   PauseBackdropUpdatesForActiveWindow();
-  UpdateWindowsForSlideUpOrDown(0.0, /*animate=*/false);
+  UpdateWindowsForSlideUpOrDown(0.0 /*progress*/,
+                                base::nullopt /*animation_trigger*/);
   AnimateToFinalState(AnimationTrigger::kLauncherButton);
   return true;
 }
@@ -378,7 +379,8 @@
   mode_ = Mode::kSlideDownToHide;
 
   PauseBackdropUpdatesForActiveWindow();
-  UpdateWindowsForSlideUpOrDown(1.0, /*animate=*/false);
+  UpdateWindowsForSlideUpOrDown(1.0 /*progress*/,
+                                base::nullopt /*animation_trigger*/);
   AnimateToFinalState(AnimationTrigger::kHideForWindow);
   return true;
 }
@@ -451,8 +453,8 @@
     if (secondary_window_)
       secondary_window_->StopAnimating();
 
-    UpdateWindowsForSlideUpOrDown(/*progress=*/IsFinalStateShow() ? 1.0 : 0.0,
-                                  /*animate=*/false);
+    UpdateWindowsForSlideUpOrDown(IsFinalStateShow() ? 1.0 : 0.0 /*progress*/,
+                                  base::nullopt /*animation_trigger*/);
     OnImplicitAnimationsCompleted();
   }
 }
@@ -482,7 +484,8 @@
   // animation.
   DCHECK(display_.is_valid());
   home_screen_delegate->UpdateYPositionAndOpacityForHomeLauncher(
-      display_.work_area().y(), home_launcher_opacity, base::NullCallback());
+      display_.work_area().y(), home_launcher_opacity,
+      base::nullopt /*metrics_reporter_info*/, base::NullCallback());
 
   if (!active_window_) {
     RemoveObserversAndStopTracking();
@@ -556,10 +559,8 @@
 
 void HomeLauncherGestureHandler::AnimateToFinalState(AnimationTrigger trigger) {
   const bool is_final_state_show = IsFinalStateShow();
-  GetHomeScreenDelegate()->NotifyHomeLauncherAnimationTransition(
-      trigger, is_final_state_show);
   UpdateWindowsForSlideUpOrDown(is_final_state_show ? 1.0 : 0.0,
-                                /*animate=*/true);
+                                trigger /**animation_trigger*/);
 
   if (!is_final_state_show && mode_ == Mode::kSlideDownToHide) {
     NotifyHomeLauncherTargetPositionChanged(false /*showing*/, display_.id());
@@ -589,8 +590,9 @@
       ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
 }
 
-void HomeLauncherGestureHandler::UpdateWindowsForSlideUpOrDown(double progress,
-                                                               bool animate) {
+void HomeLauncherGestureHandler::UpdateWindowsForSlideUpOrDown(
+    double progress,
+    base::Optional<AnimationTrigger> animation_trigger) {
   // Update full screen applist.
   DCHECK(display_.is_valid());
   const gfx::Rect work_area = display_.work_area();
@@ -610,11 +612,19 @@
   if (!home_screen_window->TargetVisibility())
     home_screen_delegate->GetHomeScreenWindow()->Show();
 
-  home_screen_delegate->UpdateYPositionAndOpacityForHomeLauncher(
-      y_position, opacity,
-      animate ? base::BindRepeating(&HomeLauncherGestureHandler::UpdateSettings,
-                                    base::Unretained(this))
-              : base::NullCallback());
+  const bool animate = animation_trigger.has_value();
+  if (animate) {
+    home_screen_delegate->UpdateYPositionAndOpacityForHomeLauncher(
+        y_position, opacity,
+        HomeScreenDelegate::AnimationInfo(*animation_trigger,
+                                          progress == 1.0 /*showing*/),
+        base::BindRepeating(&HomeLauncherGestureHandler::UpdateSettings,
+                            base::Unretained(this)));
+  } else {
+    home_screen_delegate->UpdateYPositionAndOpacityForHomeLauncher(
+        y_position, opacity, base::nullopt /*animation_info*/,
+        base::NullCallback());
+  }
 
   // Update the overview grid if needed. If |active_window_| is null, then
   // observe the animation of a window in overview.
@@ -917,7 +927,8 @@
     home_screen_delegate->OnHomeLauncherDragStart();
 
     PauseBackdropUpdatesForActiveWindow();
-    UpdateWindowsForSlideUpOrDown(/*progress=*/0.0, /*animate=*/false);
+    UpdateWindowsForSlideUpOrDown(0.0 /*progress*/,
+                                  base::nullopt /*animation_trigger*/);
   }
 }
 
@@ -933,7 +944,7 @@
 
     UpdateWindowsForSlideUpOrDown(
         GetHeightInWorkAreaAsRatio(location, display_.work_area()),
-        /*animate=*/false);
+        base::nullopt /*animation_trigger*/);
   }
 }
 
diff --git a/ash/home_screen/home_launcher_gesture_handler.h b/ash/home_screen/home_launcher_gesture_handler.h
index d83c8ca0..a2cc973 100644
--- a/ash/home_screen/home_launcher_gesture_handler.h
+++ b/ash/home_screen/home_launcher_gesture_handler.h
@@ -129,7 +129,11 @@
   // original opacity and transform, and 1.0 means the window will be faded out
   // and transformed offscreen. This function is used by kSlideUpToShow and
   // kSlideDownToHide mode.
-  void UpdateWindowsForSlideUpOrDown(double progress, bool animate);
+  // If and only if |animation_trigger| is set, the windows updates will be
+  // animated. |animation_trigger| should indicate what triggered the animation.
+  void UpdateWindowsForSlideUpOrDown(
+      double progress,
+      base::Optional<AnimationTrigger> animation_trigger);
 
   // Stop observing all windows and remove their local pointers.
   void RemoveObserversAndStopTracking();
diff --git a/ash/home_screen/home_screen_delegate.h b/ash/home_screen/home_screen_delegate.h
index 66f9f910..495a2e4 100644
--- a/ash/home_screen/home_screen_delegate.h
+++ b/ash/home_screen/home_screen_delegate.h
@@ -42,6 +42,21 @@
     kOverviewModeFade
   };
 
+  // Information used to configure animation metrics reporter when animating
+  // home screen using UpdateYPositionAndOpacityForHomeLauncher() or
+  // UpdateScaleAndOpacityForHomeLauncher().
+  struct AnimationInfo {
+    AnimationInfo(AnimationTrigger trigger, bool showing)
+        : trigger(trigger), showing(showing) {}
+    ~AnimationInfo() = default;
+
+    // The animation trigger.
+    const AnimationTrigger trigger;
+
+    // Whether the home screen will be shown at the end of the animation.
+    const bool showing;
+  };
+
   virtual ~HomeScreenDelegate() = default;
 
   // Shows the home screen view.
@@ -54,17 +69,25 @@
 
   // Updates the y position and opacity of the home launcher view. If |callback|
   // is non-null, it should be called with animation settings.
+  // |animation_info| - Information about the transition trigger that will be
+  // used to report animation metrics. Should be set only if |callback| is
+  // not null (otherwise the transition will not be animated).
   virtual void UpdateYPositionAndOpacityForHomeLauncher(
       int y_position_in_screen,
       float opacity,
+      base::Optional<AnimationInfo> animation_info,
       UpdateAnimationSettingsCallback callback) = 0;
 
   // Scales the home launcher view maintaining the view center point, and
   // updates its opacity. If |callback| is non-null, the update should be
   // animated, and the |callback| should be called with the animation settings.
+  // |animation_info| - Information about the transition trigger that will be
+  // used to report animation metrics. Should be set only if |callback| is
+  // not null (otherwise the transition will not be animated).
   virtual void UpdateScaleAndOpacityForHomeLauncher(
       float scale,
       float opacity,
+      base::Optional<AnimationInfo> animation_info,
       UpdateAnimationSettingsCallback callback) = 0;
 
   // Updates the home launcher view after its show animation has completed.
@@ -93,12 +116,6 @@
   virtual void OnHomeLauncherDragInProgress() {}
   virtual void OnHomeLauncherDragEnd() {}
 
-  // Propagates the home launcher animation transition. |trigger| is what
-  // triggers the home launcher animation; |launcher_will_show| indicates
-  // whether the launcher will show by the end of animation.
-  virtual void NotifyHomeLauncherAnimationTransition(AnimationTrigger trigger,
-                                                     bool launcher_will_show) {}
-
   // Called when the HomeLauncher has started to be dragged, or a positional
   // animation has begun.
   virtual void OnHomeLauncherTargetPositionChanged(bool showing,
diff --git a/ash/home_screen/home_screen_presenter.cc b/ash/home_screen/home_screen_presenter.cc
index 5559f69..a20bacb 100644
--- a/ash/home_screen/home_screen_presenter.cc
+++ b/ash/home_screen/home_screen_presenter.cc
@@ -5,6 +5,7 @@
 #include "ash/home_screen/home_screen_presenter.h"
 
 #include <string>
+#include <utility>
 
 #include "ash/home_screen/home_screen_controller.h"
 #include "ash/home_screen/home_screen_delegate.h"
@@ -13,14 +14,12 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/logging.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "ui/aura/window.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animator.h"
-#include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/animation/tween.h"
 
@@ -72,63 +71,31 @@
   }
 }
 
-void UpdateOverviewSettings(ui::AnimationMetricsReporter* reporter,
-                            base::TimeDelta duration,
+HomeScreenDelegate::AnimationTrigger GetAnimationTrigger(
+    HomeScreenPresenter::TransitionType transition) {
+  return (transition == HomeScreenPresenter::TransitionType::kSlideHomeIn ||
+          transition == HomeScreenPresenter::TransitionType::kSlideHomeOut)
+             ? HomeScreenDelegate::AnimationTrigger::kOverviewModeSlide
+             : HomeScreenDelegate::AnimationTrigger::kOverviewModeFade;
+}
+
+bool IsShowingHomeTransition(HomeScreenPresenter::TransitionType transition) {
+  return transition == HomeScreenPresenter::TransitionType::kSlideHomeIn ||
+         transition == HomeScreenPresenter::TransitionType::kScaleHomeIn;
+}
+
+void UpdateOverviewSettings(base::TimeDelta duration,
                             ui::ScopedLayerAnimationSettings* settings) {
   settings->SetTransitionDuration(duration);
   settings->SetTweenType(gfx::Tween::FAST_OUT_SLOW_IN);
   settings->SetPreemptionStrategy(
       ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
-
-  DCHECK(reporter);
-  settings->SetAnimationMetricsReporter(reporter);
 }
 
 }  // namespace
 
-class HomeScreenPresenter::OverviewAnimationMetricsReporter
-    : public ui::AnimationMetricsReporter {
- public:
-  OverviewAnimationMetricsReporter() = default;
-  ~OverviewAnimationMetricsReporter() override = default;
-
-  void Start(TransitionType transition) { transition_ = transition; }
-
-  void Report(int value) override {
-    DCHECK(transition_.has_value());
-
-    // Emit the correct histogram. Note that we have multiple macro instances
-    // since each macro instance should be called with a runtime constant.
-    switch (transition_.value()) {
-      case TransitionType::kSlideHomeOut:
-        UMA_HISTOGRAM_PERCENTAGE(
-            "Apps.StateTransition.AnimationSmoothness.EnterOverview", value);
-        break;
-      case TransitionType::kSlideHomeIn:
-        UMA_HISTOGRAM_PERCENTAGE(
-            "Apps.StateTransition.AnimationSmoothness.ExitOverview", value);
-        break;
-      case TransitionType::kScaleHomeOut:
-        UMA_HISTOGRAM_PERCENTAGE(
-            "Apps.StateTransition.AnimationSmoothness.FadeInOverview", value);
-        break;
-      case TransitionType::kScaleHomeIn:
-        UMA_HISTOGRAM_PERCENTAGE(
-            "Apps.StateTransition.AnimationSmoothness.FadeOutOverview", value);
-        break;
-    }
-  }
-
- private:
-  base::Optional<TransitionType> transition_;
-
-  DISALLOW_COPY_AND_ASSIGN(OverviewAnimationMetricsReporter);
-};
-
 HomeScreenPresenter::HomeScreenPresenter(HomeScreenController* controller)
-    : controller_(controller),
-      overview_animation_metrics_reporter_(
-          std::make_unique<OverviewAnimationMetricsReporter>()) {
+    : controller_(controller) {
   DCHECK(controller);
 }
 
@@ -137,19 +104,8 @@
 void HomeScreenPresenter::ScheduleOverviewModeAnimation(
     TransitionType transition,
     bool animate) {
-  const bool showing_home = transition == TransitionType::kSlideHomeIn ||
-                            transition == TransitionType::kScaleHomeIn;
   // If animating, set the source parameters first.
   if (animate) {
-    HomeScreenDelegate::AnimationTrigger trigger =
-        (transition == TransitionType::kSlideHomeIn ||
-         transition == TransitionType::kSlideHomeOut)
-            ? HomeScreenDelegate::AnimationTrigger::kOverviewModeSlide
-            : HomeScreenDelegate::AnimationTrigger::kOverviewModeFade;
-
-    controller_->delegate()->NotifyHomeLauncherAnimationTransition(
-        trigger, showing_home);
-
     // Force the home view into the expected initial state without animation,
     // except when transitioning out from home screen. Gesture handling for the
     // gesture to move to overview can update the scale before triggering
@@ -159,8 +115,6 @@
       SetFinalHomeTransformForTransition(GetOppositeTransition(transition),
                                          base::TimeDelta());
     }
-
-    overview_animation_metrics_reporter_->Start(transition);
   }
 
   // Hide all transient child windows in the app list (e.g. uninstall dialog)
@@ -169,6 +123,7 @@
   aura::Window* app_list_window =
       controller_->delegate()->GetHomeScreenWindow();
   if (app_list_window) {
+    const bool showing_home = IsShowingHomeTransition(transition);
     for (auto* child : wm::GetTransientChildren(app_list_window)) {
       if (showing_home)
         child->Show();
@@ -189,29 +144,37 @@
       animation_settings_updater =
           !animation_duration.is_zero()
               ? base::BindRepeating(&UpdateOverviewSettings,
-                                    overview_animation_metrics_reporter_.get(),
                                     animation_duration)
               : base::NullCallback();
 
+  base::Optional<HomeScreenDelegate::AnimationInfo> animation_info =
+      !animation_duration.is_zero()
+          ? base::make_optional<HomeScreenDelegate::AnimationInfo>(
+                GetAnimationTrigger(transition),
+                IsShowingHomeTransition(transition))
+          : base::nullopt;
+
   switch (transition) {
     case TransitionType::kSlideHomeIn:
       controller_->delegate()->UpdateYPositionAndOpacityForHomeLauncher(
           0 /*y_position_in_screen*/, 1.0 /*opacity*/,
-          animation_settings_updater);
+          std::move(animation_info), animation_settings_updater);
       break;
     case TransitionType::kSlideHomeOut:
       controller_->delegate()->UpdateYPositionAndOpacityForHomeLauncher(
           kOverviewSlideAnimationYOffset /*y_position_in_screen*/,
-          0.0 /*opacity*/, animation_settings_updater);
+          0.0 /*opacity*/, std::move(animation_info),
+          animation_settings_updater);
       break;
     case TransitionType::kScaleHomeIn:
       controller_->delegate()->UpdateScaleAndOpacityForHomeLauncher(
-          1.0 /*scale*/, 1.0 /*opacity*/, animation_settings_updater);
+          1.0 /*scale*/, 1.0 /*opacity*/, std::move(animation_info),
+          animation_settings_updater);
       break;
     case TransitionType::kScaleHomeOut:
       controller_->delegate()->UpdateScaleAndOpacityForHomeLauncher(
           kOverviewFadeAnimationScale /*scale*/, 0.0 /*opacity*/,
-          animation_settings_updater);
+          std::move(animation_info), animation_settings_updater);
       break;
   }
 }
diff --git a/ash/home_screen/home_screen_presenter.h b/ash/home_screen/home_screen_presenter.h
index 923ee87b..c796a434 100644
--- a/ash/home_screen/home_screen_presenter.h
+++ b/ash/home_screen/home_screen_presenter.h
@@ -53,8 +53,6 @@
   void ScheduleOverviewModeAnimation(TransitionType transition, bool animate);
 
  private:
-  class OverviewAnimationMetricsReporter;
-
   // Updates the home screen state to match the final state for |transition|.
   // If |animation_duration| is 0, the update will be immediate, otherwise the
   // update will be animated.
@@ -63,10 +61,6 @@
 
   HomeScreenController* controller_;
 
-  // Metric reporter for entering/exiting overview.
-  const std::unique_ptr<OverviewAnimationMetricsReporter>
-      overview_animation_metrics_reporter_;
-
   DISALLOW_COPY_AND_ASSIGN(HomeScreenPresenter);
 };
 
diff --git a/ash/home_screen/swipe_home_to_overview_controller.cc b/ash/home_screen/swipe_home_to_overview_controller.cc
index 404b4dc0..14a01e9 100644
--- a/ash/home_screen/swipe_home_to_overview_controller.cc
+++ b/ash/home_screen/swipe_home_to_overview_controller.cc
@@ -135,6 +135,7 @@
       ->home_screen_controller()
       ->delegate()
       ->UpdateScaleAndOpacityForHomeLauncher(scale, 1.0f /*opacity*/,
+                                             base::nullopt /*animation_info*/,
                                              base::NullCallback());
 }
 
@@ -161,7 +162,7 @@
       ->home_screen_controller()
       ->delegate()
       ->UpdateScaleAndOpacityForHomeLauncher(
-          1.0f /*scale*/, 1.0f /*opacity*/,
+          1.0f /*scale*/, 1.0f /*opacity*/, base::nullopt /*animation_info*/,
           base::BindRepeating(&UpdateHomeAnimationForGestureCancel));
 }
 
diff --git a/ash/public/cpp/app_list/app_list_client.h b/ash/public/cpp/app_list/app_list_client.h
index ee141a8..b2af2563 100644
--- a/ash/public/cpp/app_list/app_list_client.h
+++ b/ash/public/cpp/app_list/app_list_client.h
@@ -51,11 +51,14 @@
   // |suggestion_index|: the position of the result as a suggestion chip in
   // the AppsGridView or the position of the result in the zero state search
   // page.
+  // |launch_as_default|: True if the result is launched as the default result
+  // by user pressing ENTER key.
   virtual void OpenSearchResult(const std::string& result_id,
                                 int event_flags,
                                 ash::AppListLaunchedFrom launched_from,
                                 ash::AppListLaunchType launch_type,
-                                int suggestion_index) = 0;
+                                int suggestion_index,
+                                bool launch_as_default) = 0;
   // Invokes a custom action on a result with |result_id|.
   // |action_index| corresponds to the index of an action on the search result,
   // for example, installing. They are stored in SearchResult::actions_.
diff --git a/ash/public/cpp/app_list/app_list_metrics.cc b/ash/public/cpp/app_list/app_list_metrics.cc
index b0ffc16..50d0c3b 100644
--- a/ash/public/cpp/app_list/app_list_metrics.cc
+++ b/ash/public/cpp/app_list/app_list_metrics.cc
@@ -24,6 +24,8 @@
     "Apps.AppListSuggestedChipOpenType.TabletMode";
 const char kAppListZeroStateSuggestionOpenTypeHistogram[] =
     "Apps.AppList.ZeroStateSuggestionOpenType";
+const char kAppListDefaultSearchResultOpenTypeHistogram[] =
+    "Apps.AppListDefaultSearchResultOpenType";
 // The UMA histogram that logs the length of user typed queries app list
 // launcher issues to the search providers.
 constexpr char kAppListLauncherIssuedSearchQueryLength[] =
@@ -84,6 +86,15 @@
   }
 }
 
+void RecordDefaultSearchResultOpenTypeHistogram(SearchResultType type) {
+  if (type == SEARCH_RESULT_TYPE_BOUNDARY) {
+    NOTREACHED();
+    return;
+  }
+  UMA_HISTOGRAM_ENUMERATION(kAppListDefaultSearchResultOpenTypeHistogram, type,
+                            SEARCH_RESULT_TYPE_BOUNDARY);
+}
+
 void RecordZeroStateSuggestionOpenTypeHistogram(SearchResultType type) {
   UMA_HISTOGRAM_ENUMERATION(kAppListZeroStateSuggestionOpenTypeHistogram, type,
                             SEARCH_RESULT_TYPE_BOUNDARY);
diff --git a/ash/public/cpp/app_list/app_list_metrics.h b/ash/public/cpp/app_list/app_list_metrics.h
index b7c59c4..4518121 100644
--- a/ash/public/cpp/app_list/app_list_metrics.h
+++ b/ash/public/cpp/app_list/app_list_metrics.h
@@ -89,6 +89,9 @@
     SearchResultType type,
     bool is_tablet_mode);
 
+ASH_PUBLIC_EXPORT void RecordDefaultSearchResultOpenTypeHistogram(
+    SearchResultType type);
+
 ASH_PUBLIC_EXPORT void RecordZeroStateSuggestionOpenTypeHistogram(
     SearchResultType type);
 
diff --git a/ash/public/cpp/ash_features.cc b/ash/public/cpp/ash_features.cc
index c88326c..332c222 100644
--- a/ash/public/cpp/ash_features.cc
+++ b/ash/public/cpp/ash_features.cc
@@ -79,9 +79,6 @@
 const base::Feature kVirtualDesks{"VirtualDesks",
                                   base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kVirtualDesksGestures{"VirtualDesksGestures",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
-
 const base::Feature kUseBluetoothSystemInAsh{"UseBluetoothSystemInAsh",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
@@ -151,10 +148,6 @@
   return base::FeatureList::IsEnabled(kVirtualDesks);
 }
 
-bool IsVirtualDesksGesturesEnabled() {
-  return base::FeatureList::IsEnabled(kVirtualDesksGestures);
-}
-
 bool IsViewsLoginEnabled() {
   // Always show webui login if --show-webui-login is present, which is passed
   // by session manager for automatic recovery. Otherwise, only show views
diff --git a/ash/public/cpp/ash_features.h b/ash/public/cpp/ash_features.h
index e497f62..aad0db0e 100644
--- a/ash/public/cpp/ash_features.h
+++ b/ash/public/cpp/ash_features.h
@@ -98,11 +98,6 @@
 // Enables the Virtual Desks feature.
 ASH_PUBLIC_EXPORT extern const base::Feature kVirtualDesks;
 
-// Enables the touchpad 4-finger gestures to switch desks.
-// This flag is only effective if the Virtual Desks feature is enabled (see
-// `kVirtualDesks`).
-ASH_PUBLIC_EXPORT extern const base::Feature kVirtualDesksGestures;
-
 // Enables using the BluetoothSystem Mojo interface for Bluetooth operations.
 ASH_PUBLIC_EXPORT extern const base::Feature kUseBluetoothSystemInAsh;
 
@@ -160,8 +155,6 @@
 
 ASH_PUBLIC_EXPORT bool IsVirtualDesksEnabled();
 
-ASH_PUBLIC_EXPORT bool IsVirtualDesksGesturesEnabled();
-
 ASH_PUBLIC_EXPORT bool IsSupervisedUserDeprecationNoticeEnabled();
 
 ASH_PUBLIC_EXPORT bool IsSwapSideVolumeButtonsForOrientationEnabled();
diff --git a/ash/public/cpp/frame_header.cc b/ash/public/cpp/frame_header.cc
index 29bbd23..405daa0 100644
--- a/ash/public/cpp/frame_header.cc
+++ b/ash/public/cpp/frame_header.cc
@@ -217,9 +217,12 @@
   }
 
   if (!text.empty()) {
+    int flags = gfx::Canvas::NO_SUBPIXEL_RENDERING;
+    if (target_widget_delegate->ShouldCenterWindowTitleText())
+      flags |= gfx::Canvas::TEXT_ALIGN_CENTER;
     canvas->DrawStringRectWithFlags(text, gfx::FontList(), GetTitleColor(),
                                     view_->GetMirroredRect(GetTitleBounds()),
-                                    gfx::Canvas::NO_SUBPIXEL_RENDERING);
+                                    flags);
   }
 }
 
diff --git a/ash/shell/example_app_list_client.cc b/ash/shell/example_app_list_client.cc
index f661d667..eab41fd 100644
--- a/ash/shell/example_app_list_client.cc
+++ b/ash/shell/example_app_list_client.cc
@@ -235,7 +235,8 @@
     int event_flags,
     ash::AppListLaunchedFrom launched_from,
     ash::AppListLaunchType launch_type,
-    int suggestion_index) {
+    int suggestion_index,
+    bool launch_as_default) {
   auto it = std::find_if(
       search_results_.begin(), search_results_.end(),
       [&result_id](const std::unique_ptr<ExampleSearchResult>& result) {
diff --git a/ash/shell/example_app_list_client.h b/ash/shell/example_app_list_client.h
index 4696bf6..c55f370 100644
--- a/ash/shell/example_app_list_client.h
+++ b/ash/shell/example_app_list_client.h
@@ -36,7 +36,8 @@
                         int event_flags,
                         ash::AppListLaunchedFrom launched_from,
                         ash::AppListLaunchType launch_type,
-                        int suggestion_index) override;
+                        int suggestion_index,
+                        bool launch_as_default) override;
   void ActivateItem(int profile_id,
                     const std::string& id,
                     int event_flags) override;
diff --git a/ash/system/unified/unified_system_tray_bubble.cc b/ash/system/unified/unified_system_tray_bubble.cc
index 7a2515e9..2de3655 100644
--- a/ash/system/unified/unified_system_tray_bubble.cc
+++ b/ash/system/unified/unified_system_tray_bubble.cc
@@ -301,7 +301,7 @@
 void UnifiedSystemTrayBubble::OnWindowActivated(ActivationReason reason,
                                                 aura::Window* gained_active,
                                                 aura::Window* lost_active) {
-  if (!gained_active)
+  if (!gained_active || !bubble_widget_)
     return;
 
   // Don't close the bubble if a transient child is gaining or losing
diff --git a/ash/wm/gestures/wm_gesture_handler.cc b/ash/wm/gestures/wm_gesture_handler.cc
index aec50f4..f66ef500 100644
--- a/ash/wm/gestures/wm_gesture_handler.cc
+++ b/ash/wm/gestures/wm_gesture_handler.cc
@@ -17,11 +17,6 @@
 
 namespace {
 
-bool CanHandleVirtualDesksGestures() {
-  return features::IsVirtualDesksEnabled() &&
-         features::IsVirtualDesksGesturesEnabled();
-}
-
 // Handles vertical 3-finger scroll gesture by entering overview on scrolling
 // up, and exiting it on scrolling down.
 // Returns true if the gesture was handled.
@@ -50,7 +45,7 @@
 // Handles horizontal 4-finger scroll by switching desks if possible.
 // Returns true if the gesture was handled.
 bool HandleDesksSwitchHorizontalScroll(float scroll_x) {
-  DCHECK(CanHandleVirtualDesksGestures());
+  DCHECK(features::IsVirtualDesksEnabled());
 
   if (std::fabs(scroll_x) < WmGestureHandler::kHorizontalThresholdDp)
     return false;
@@ -66,7 +61,7 @@
 }  // namespace
 
 WmGestureHandler::WmGestureHandler()
-    : can_handle_desks_gestures_(CanHandleVirtualDesksGestures()) {}
+    : can_handle_desks_gestures_(features::IsVirtualDesksEnabled()) {}
 
 WmGestureHandler::~WmGestureHandler() = default;
 
diff --git a/ash/wm/gestures/wm_gesture_handler_unittest.cc b/ash/wm/gestures/wm_gesture_handler_unittest.cc
index d7fab8bf..704d043 100644
--- a/ash/wm/gestures/wm_gesture_handler_unittest.cc
+++ b/ash/wm/gestures/wm_gesture_handler_unittest.cc
@@ -30,11 +30,6 @@
   return Shell::Get()->overview_controller()->InOverviewSession();
 }
 
-bool CanHandleVirtualDesksGestures() {
-  return features::IsVirtualDesksEnabled() &&
-         features::IsVirtualDesksGesturesEnabled();
-}
-
 const aura::Window* GetHighlightedWindow() {
   return InOverviewSession() ? GetOverviewHighlightedWindow() : nullptr;
 }
@@ -51,8 +46,7 @@
   void SetUp() override {
     if (GetParam()) {
       scoped_feature_list_.InitWithFeatures(
-          /*enabled_features=*/{features::kVirtualDesks,
-                                features::kVirtualDesksGestures},
+          /*enabled_features=*/{features::kVirtualDesks},
           /*disabled_features=*/{});
     }
 
@@ -66,7 +60,7 @@
   }
 
   void ScrollToSwitchDesks(bool scroll_left) {
-    DCHECK(CanHandleVirtualDesksGestures());
+    DCHECK(features::IsVirtualDesksEnabled());
 
     DeskSwitchAnimationWaiter waiter;
     const float x_offset =
diff --git a/base/files/important_file_writer.cc b/base/files/important_file_writer.cc
index b37ce2f..c27d5ef 100644
--- a/base/files/important_file_writer.cc
+++ b/base/files/important_file_writer.cc
@@ -71,22 +71,6 @@
                           static_cast<int>(max_sample));
 }
 
-// Helper function to write samples to a histogram with a dynamically assigned
-// histogram name.  Works with short timings from 1 ms up to 10 seconds (50
-// buckets) which is the actual argument type of UmaHistogramTimes.
-void UmaHistogramTimesWithSuffix(const char* histogram_name,
-                                 StringPiece histogram_suffix,
-                                 TimeDelta sample) {
-  DCHECK(histogram_name);
-  std::string histogram_full_name(histogram_name);
-  if (!histogram_suffix.empty()) {
-    histogram_full_name.append(".");
-    histogram_full_name.append(histogram_suffix.data(),
-                               histogram_suffix.length());
-  }
-  UmaHistogramTimes(histogram_full_name, sample);
-}
-
 void LogFailure(const FilePath& path,
                 StringPiece histogram_suffix,
                 TempFileFailure failure_code,
@@ -108,13 +92,8 @@
   if (!before_write_callback.is_null())
     std::move(before_write_callback).Run();
 
-  TimeTicks start_time = TimeTicks::Now();
   bool result =
       ImportantFileWriter::WriteFileAtomically(path, *data, histogram_suffix);
-  if (result) {
-    UmaHistogramTimesWithSuffix("ImportantFile.TimeToWrite", histogram_suffix,
-                                TimeTicks::Now() - start_time);
-  }
 
   if (!after_write_callback.is_null())
     std::move(after_write_callback).Run(result);
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml
index d8933a7..7db555dd 100644
--- a/build/android/lint/suppressions.xml
+++ b/build/android/lint/suppressions.xml
@@ -162,7 +162,7 @@
     <ignore regexp="components/embedder_support/android/java/res"/>
   </issue>
   <issue id="ImpliedQuantity" severity="Error">
-    <ignore regexp="chrome/android/chrome_strings_grd"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd"/>
   </issue>
   <issue id="InconsistentArrays" severity="Error">
     <ignore regexp="android_webview/locale_paks.resources.zip/values/locale-paks.xml"/>
@@ -249,8 +249,8 @@
     <ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java"/>
   </issue>
   <issue id="PluralsCandidate" severity="Error">
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-en-rGB/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-en-rGB/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values/android_chrome_strings.xml"/>
   </issue>
   <issue id="PrivateApi" severity="ignore"/>
   <!-- Chrome is a system app. -->
@@ -276,19 +276,19 @@
     <ignore regexp="This AsyncTask class should be static or leaks might occur"/>
   </issue>
   <issue id="StringFormatCount" severity="Error">
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-cs/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-fr/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-pl/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-cs/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-fr/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-pl/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values/android_chrome_strings.xml"/>
   </issue>
   <issue id="StringFormatInvalid" severity="Error">
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-cs/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-da/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-et/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-pl/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-pt-rBR/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-sv/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-tl/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-cs/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-da/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-et/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-pl/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-pt-rBR/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-sv/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-tl/android_chrome_strings.xml"/>
   </issue>
   <!-- We have many C++ enums that we don't care about in java -->
   <issue id="SwitchIntDef" severity="ignore"/>
@@ -303,17 +303,17 @@
   <issue id="UnusedAttribute" severity="ignore"/>
   <issue id="UnusedIds" severity="ignore"/>
   <issue id="UnusedQuantity" severity="Error">
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-cs/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-in/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-ja/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-ko/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-lt/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-ms/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-sk/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-th/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-vi/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-zh-rCN/android_chrome_strings.xml"/>
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-zh-rTW/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-cs/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-in/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-ja/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-ko/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-lt/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-ms/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-sk/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-th/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-vi/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-zh-rCN/android_chrome_strings.xml"/>
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd.resources.zip/values-zh-rTW/android_chrome_strings.xml"/>
 
     <!-- This is needed for suppressing warnings on upstream and downstream build bots -->
     <ignore regexp="chrome/android/features/tab_ui/java_strings_grd.resources.zip/values-cs/android_chrome_tab_ui_strings.xml"/>
@@ -365,6 +365,9 @@
     <ignore regexp="The resource `R.mipmap.ic_launcher_foreground` appears to be unused"/>
     <ignore regexp="The resource `R.mipmap.maskable_splash_icon_xxhdpi` appears to be unused"/>
     <ignore regexp="The resource `R.mipmap.maskable_splash_icon_xxxhdpi` appears to be unused"/>
+    <!-- TODO(https://crbug.com/1017190): Remove suppression once we lint entire app rather than
+         each individual target -->
+    <ignore regexp="chrome/browser/ui/android/strings/ui_strings_grd" />
     <!-- Endnote: Please specify number of suppressions when adding more -->
   </issue>
   <issue id="UseCompoundDrawables">
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 98cfdd47..1ca524b 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8897503639019477520
\ No newline at end of file
+8897481650150071824
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index d33a210..8d96a2a 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8897506421733316256
\ No newline at end of file
+8897481882837156320
\ No newline at end of file
diff --git a/cc/test/render_pass_test_utils.cc b/cc/test/render_pass_test_utils.cc
index 924bc79a..dd603cf 100644
--- a/cc/test/render_pass_test_utils.cc
+++ b/cc/test/render_pass_test_utils.cc
@@ -414,8 +414,8 @@
 
   viz::SharedQuadState* shared_state2 =
       to_pass->CreateAndAppendSharedQuadState();
-  shared_state->SetAll(gfx::Transform(), rect, rect, gfx::RRectF(), rect, false,
-                       false, 1, SkBlendMode::kSrcOver, 0);
+  shared_state2->SetAll(gfx::Transform(), rect, rect, gfx::RRectF(), rect,
+                        false, false, 1, SkBlendMode::kSrcOver, 0);
 
   viz::TileDrawQuad* tile_quad =
       to_pass->CreateAndAppendDrawQuad<viz::TileDrawQuad>();
diff --git a/chrome/VERSION b/chrome/VERSION
index d0908c2..e6e3473ed 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=80
 MINOR=0
-BUILD=3962
+BUILD=3963
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 0951a667..e6d102f 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -114,10 +114,10 @@
   }
 
   deps = [
-    ":chrome_strings_grd",
     ":ui_locale_string_resources",
     "//chrome/android/webapk/libs/common:splash_resources",
     "//chrome/app:java_strings_grd",
+    "//chrome/browser/ui/android/strings:ui_strings_grd",
     "//chrome/browser/ui/android/styles:java_resources",
     "//chrome/browser/ui/android/widget:ui_widget_java_resources",
     "//components/autofill/android:autofill_java_resources",
@@ -165,66 +165,6 @@
   custom_package = "org.chromium.chrome.download"
 }
 
-java_strings_grd("chrome_strings_grd") {
-  defines = chrome_grit_defines
-  grd_file = "java/strings/android_chrome_strings.grd"
-  outputs = [
-    "values/android_chrome_strings.xml",
-    "values-am/android_chrome_strings.xml",
-    "values-ar/android_chrome_strings.xml",
-    "values-bg/android_chrome_strings.xml",
-    "values-bn/android_chrome_strings.xml",
-    "values-ca/android_chrome_strings.xml",
-    "values-cs/android_chrome_strings.xml",
-    "values-da/android_chrome_strings.xml",
-    "values-de/android_chrome_strings.xml",
-    "values-el/android_chrome_strings.xml",
-    "values-en-rGB/android_chrome_strings.xml",
-    "values-es/android_chrome_strings.xml",
-    "values-es-rUS/android_chrome_strings.xml",
-    "values-et/android_chrome_strings.xml",
-    "values-fa/android_chrome_strings.xml",
-    "values-fi/android_chrome_strings.xml",
-    "values-fr/android_chrome_strings.xml",
-    "values-gu/android_chrome_strings.xml",
-    "values-hi/android_chrome_strings.xml",
-    "values-hr/android_chrome_strings.xml",
-    "values-hu/android_chrome_strings.xml",
-    "values-in/android_chrome_strings.xml",
-    "values-it/android_chrome_strings.xml",
-    "values-iw/android_chrome_strings.xml",
-    "values-ja/android_chrome_strings.xml",
-    "values-kn/android_chrome_strings.xml",
-    "values-ko/android_chrome_strings.xml",
-    "values-lt/android_chrome_strings.xml",
-    "values-lv/android_chrome_strings.xml",
-    "values-ml/android_chrome_strings.xml",
-    "values-mr/android_chrome_strings.xml",
-    "values-ms/android_chrome_strings.xml",
-    "values-nb/android_chrome_strings.xml",
-    "values-nl/android_chrome_strings.xml",
-    "values-pl/android_chrome_strings.xml",
-    "values-pt-rBR/android_chrome_strings.xml",
-    "values-pt-rPT/android_chrome_strings.xml",
-    "values-ro/android_chrome_strings.xml",
-    "values-ru/android_chrome_strings.xml",
-    "values-sk/android_chrome_strings.xml",
-    "values-sl/android_chrome_strings.xml",
-    "values-sr/android_chrome_strings.xml",
-    "values-sv/android_chrome_strings.xml",
-    "values-sw/android_chrome_strings.xml",
-    "values-ta/android_chrome_strings.xml",
-    "values-te/android_chrome_strings.xml",
-    "values-th/android_chrome_strings.xml",
-    "values-tl/android_chrome_strings.xml",
-    "values-tr/android_chrome_strings.xml",
-    "values-uk/android_chrome_strings.xml",
-    "values-vi/android_chrome_strings.xml",
-    "values-zh-rCN/android_chrome_strings.xml",
-    "values-zh-rTW/android_chrome_strings.xml",
-  ]
-}
-
 android_library("app_hooks_java") {
   java_files = [ app_hooks_impl ]
   deps = [
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn
index 75fe9ef6..bf0420a 100644
--- a/chrome/android/features/tab_ui/BUILD.gn
+++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -156,11 +156,11 @@
     ":java_resources",
     "//base:base_java",
     "//chrome/android:chrome_java",
-    "//chrome/android:chrome_strings_grd",
     "//chrome/android:ui_locale_string_resources",
     "//chrome/android/features/start_surface/internal:java",
     "//chrome/android/public/profiles:java",
     "//chrome/app:java_strings_grd",
+    "//chrome/browser/ui/android/strings:ui_strings_grd",
     "//chrome/browser/ui/android/styles:java",
     "//chrome/browser/ui/android/widget:java",
     "//chrome/browser/util:java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
index bdc9373..1b1d4f6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
@@ -12,8 +12,8 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.CollectionUtil;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.GlobalDiscardableReferencePool;
-import org.chromium.chrome.browser.download.DownloadUtils;
 import org.chromium.chrome.browser.download.home.DownloadManagerUiConfig;
 import org.chromium.chrome.browser.download.home.JustNowProvider;
 import org.chromium.chrome.browser.download.home.OfflineItemSource;
@@ -242,8 +242,10 @@
         mPaginator.reset();
         Comparator<OfflineItem> comparator = mDateComparator;
         LabelAdder labelAdder = mDateLabelAdder;
-        if (filter == FilterType.PREFETCHED && DownloadUtils.shouldShowOfflineHome()) {
-            comparator = mScoreComparator;
+        if (filter == FilterType.PREFETCHED) {
+            if (ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_HOME)) {
+                comparator = mScoreComparator;
+            }
             labelAdder = mNoopLabelAdder;
         }
         mListMutator.setMutators(comparator, labelAdder);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
index 16c73a2..8ea959d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
@@ -927,8 +927,10 @@
                 mContainerHeight > 0 ? offsetWithBrowserControls / (float) mContainerHeight : 0;
 
         // This ratio is relative to the peek and full positions of the sheet.
-        float hiddenFullRatio = MathUtils.clamp(
-                (screenRatio - getHiddenRatio()) / (getFullRatio() - getHiddenRatio()), 0, 1);
+        float maxHiddenFullRatio = getFullRatio() - getHiddenRatio();
+        float hiddenFullRatio = maxHiddenFullRatio == 0
+                ? 0
+                : MathUtils.clamp((screenRatio - getHiddenRatio()) / maxHiddenFullRatio, 0, 1);
 
         if (offsetWithBrowserControls < getSheetHeightForState(SheetState.HIDDEN)) {
             mLastOffsetRatioSent = 0;
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 8378af3..5afc5c09 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-80.0.3954.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-80.0.3960.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc
index d740838a..b19b1c70 100644
--- a/chrome/app/chrome_content_browser_overlay_manifest.cc
+++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -22,7 +22,6 @@
 #include "chrome/common/media_router/mojom/media_router.mojom.h"
 #include "chrome/common/net_benchmarking.mojom.h"
 #include "chrome/common/offline_page_auto_fetcher.mojom.h"
-#include "chrome/common/prerender.mojom.h"
 #include "chrome/test/data/webui/web_ui_test.mojom.h"
 #include "components/autofill/content/common/mojom/autofill_driver.mojom.h"
 #include "components/contextual_search/content/common/mojom/contextual_search_js_api_service.mojom.h"
@@ -149,7 +148,6 @@
                 autofill::mojom::AutofillDriver,
                 autofill::mojom::PasswordManagerDriver,
                 chrome::mojom::OfflinePageAutoFetcher,
-                chrome::mojom::PrerenderCanceler,
 #if defined(OS_CHROMEOS)
                 chromeos_camera::mojom::CameraAppHelper,
                 chromeos::crostini_installer::mojom::PageHandlerFactory,
@@ -163,7 +161,6 @@
 #if BUILDFLAG(ENABLE_EXTENSIONS)
                 extensions::KeepAlive,
                 extensions::mime_handler::BeforeUnloadControl,
-                extensions::mime_handler::MimeHandlerService,
 #endif
                 media::mojom::MediaEngagementScoreDetailsProvider,
                 media_router::mojom::MediaRouter,
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index b292bff..e3fa85b 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1625,6 +1625,8 @@
     "signin/chrome_signin_proxying_url_loader_factory.h",
     "signin/chrome_signin_url_loader_throttle.cc",
     "signin/chrome_signin_url_loader_throttle.h",
+    "signin/cookie_reminter_factory.cc",
+    "signin/cookie_reminter_factory.h",
     "signin/header_modification_delegate.h",
     "signin/header_modification_delegate_impl.cc",
     "signin/header_modification_delegate_impl.h",
diff --git a/chrome/browser/PRESUBMIT.py b/chrome/browser/PRESUBMIT.py
index 4a022d41..d31d1ba 100644
--- a/chrome/browser/PRESUBMIT.py
+++ b/chrome/browser/PRESUBMIT.py
@@ -4,6 +4,8 @@
 
 """Presubmit script for Chromium browser code."""
 
+import re
+
 def _RunHistogramChecks(input_api, output_api, histogram_name):
   try:
     # Setup sys.path so that we can call histograms code.
@@ -25,10 +27,32 @@
   finally:
     sys.path = original_sys_path
 
+def _CheckUnwantedDependencies(input_api, output_api):
+  problems = []
+  for f in input_api.AffectedFiles():
+    if not f.LocalPath().endswith('DEPS'):
+      continue
+
+    for line_num, line in f.ChangedContents():
+      if not line.strip().startswith('#'):
+        m = re.search(r".*\/blink\/public\/web.*", line)
+        if m:
+          problems.append(m.group(0))
+
+  if not problems:
+    return []
+  return [output_api.PresubmitPromptWarning(
+      'chrome/browser cannot depend on blink/public/web interfaces. ' +
+      'Use blink/public/common instead.',
+      items=problems)]
 
 def _CommonChecks(input_api, output_api):
   """Checks common to both upload and commit."""
-  return _RunHistogramChecks(input_api, output_api, "BadMessageReasonChrome")
+  results = []
+  results.extend(_CheckUnwantedDependencies(input_api, output_api))
+  results.extend(_RunHistogramChecks(input_api, output_api,
+                 "BadMessageReasonChrome"))
+  return results
 
 
 def CheckChangeOnUpload(input_api, output_api):
diff --git a/chrome/browser/PRESUBMIT_test.py b/chrome/browser/PRESUBMIT_test.py
new file mode 100755
index 0000000..337e413
--- /dev/null
+++ b/chrome/browser/PRESUBMIT_test.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python
+# Copyright (c) 2019 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 os.path
+import subprocess
+import sys
+import unittest
+
+import PRESUBMIT
+
+file_dir_path = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(0, os.path.join(file_dir_path, '..', '..'))
+from PRESUBMIT_test_mocks import MockFile, MockAffectedFile
+from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi
+
+_VALID_DEP = "+third_party/blink/public/platform/web_something.h,"
+_INVALID_DEP = "+third_party/blink/public/web/web_something.h,"
+_INVALID_DEP2 = "+third_party/blink/public/web/web_nothing.h,"
+
+class BlinkPublicWebUnwantedDependenciesTest(unittest.TestCase):
+  def makeInputApi(self, files):
+    input_api = MockInputApi()
+    input_api.files = files
+    # Override os_path.exists because the presubmit uses the actual
+    # os.path.exists.
+    input_api.CreateMockFileInPath(
+        [x.LocalPath() for x in input_api.AffectedFiles(include_deletes=True)])
+    return input_api
+
+  INVALID_DEPS_MESSAGE = ('chrome/browser cannot depend on '
+                          'blink/public/web interfaces. Use'
+                          ' blink/public/common instead.')
+
+  def testAdditionOfUnwantedDependency(self):
+    input_api = self.makeInputApi([
+        MockAffectedFile('DEPS', [_INVALID_DEP], [], action='M')])
+    warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi())
+    self.assertEqual(1, len(warnings))
+    self.assertEqual(self.INVALID_DEPS_MESSAGE, warnings[0].message)
+    self.assertEqual(1, len(warnings[0].items))
+
+  def testAdditionOfUnwantedDependencyInComment(self):
+    input_api = self.makeInputApi([
+        MockAffectedFile('DEPS', ["#" + _INVALID_DEP], [], action='M')])
+    warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi())
+    self.assertEqual([], warnings)
+
+  def testAdditionOfValidDependency(self):
+    input_api = self.makeInputApi([
+        MockAffectedFile('DEPS', [_VALID_DEP], [], action='M')])
+    warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi())
+    self.assertEqual([], warnings)
+
+  def testAdditionOfMultipleUnwantedDependency(self):
+    input_api = self.makeInputApi([
+        MockAffectedFile('DEPS', [_INVALID_DEP, _INVALID_DEP2], action='M')])
+    warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi())
+    self.assertEqual(1, len(warnings))
+    self.assertEqual(self.INVALID_DEPS_MESSAGE, warnings[0].message)
+    self.assertEqual(2, len(warnings[0].items))
+
+    input_api = self.makeInputApi([
+        MockAffectedFile('DEPS', [_INVALID_DEP, _VALID_DEP], [], action='M')])
+    warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi())
+    self.assertEqual(1, len(warnings))
+    self.assertEqual(self.INVALID_DEPS_MESSAGE, warnings[0].message)
+    self.assertEqual(1, len(warnings[0].items))
+
+  def testRemovalOfUnwantedDependency(self):
+    input_api = self.makeInputApi([
+        MockAffectedFile('DEPS', [], [_INVALID_DEP], action='M')])
+    warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi())
+    self.assertEqual([], warnings)
+
+  def testRemovalOfValidDependency(self):
+    input_api = self.makeInputApi([
+        MockAffectedFile('DEPS', [], [_VALID_DEP], action='M')])
+    warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi())
+    self.assertEqual([], warnings)
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 788f3032..69807cd 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -347,22 +347,6 @@
      gl::kANGLEImplementationD3D11on12Name}};
 #endif
 
-#if BUILDFLAG(ENABLE_DICE_SUPPORT)
-const FeatureEntry::FeatureParam kAccountConsistencyDice[] = {
-    {kAccountConsistencyFeatureMethodParameter,
-     kAccountConsistencyFeatureMethodDice}};
-
-const FeatureEntry::FeatureParam kAccountConsistencyDiceMigration[] = {
-    {kAccountConsistencyFeatureMethodParameter,
-     kAccountConsistencyFeatureMethodDiceMigration}};
-
-const FeatureEntry::FeatureVariation kAccountConsistencyFeatureVariations[] = {
-    {"Dice", kAccountConsistencyDice, base::size(kAccountConsistencyDice),
-     nullptr /* variation_id */},
-    {"Dice (migration)", kAccountConsistencyDiceMigration,
-     base::size(kAccountConsistencyDiceMigration), nullptr /* variation_id */}};
-#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
-
 #if defined(OS_ANDROID)
 const FeatureEntry::Choice kReaderModeHeuristicsChoices[] = {
     {flags_ui::kGenericExperimentChoiceDefault, "", ""},
@@ -1804,10 +1788,6 @@
     {"enable-virtual-desks", flag_descriptions::kEnableVirtualDesksName,
      flag_descriptions::kEnableVirtualDesksDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kVirtualDesks)},
-    {"enable-virtual-desks-gestures",
-     flag_descriptions::kEnableVirtualDesksGesturesName,
-     flag_descriptions::kEnableVirtualDesksGesturesDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(ash::features::kVirtualDesksGestures)},
     {"trim-on-all-frames-frozen", flag_descriptions::kTrimOnFreezeName,
      flag_descriptions::kTrimOnFreezeDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(performance_manager::features::kTrimOnFreeze)},
@@ -1945,11 +1925,6 @@
      flag_descriptions::kWebglDraftExtensionsDescription, kOsAll,
      SINGLE_VALUE_TYPE(switches::kEnableWebGLDraftExtensions)},
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-    {"account-consistency", flag_descriptions::kAccountConsistencyName,
-     flag_descriptions::kAccountConsistencyDescription, kOsAll,
-     FEATURE_WITH_PARAMS_VALUE_TYPE(kAccountConsistencyFeature,
-                                    kAccountConsistencyFeatureVariations,
-                                    "AccountConsistencyVariations")},
     {"force-dice-migration", flag_descriptions::kForceDiceMigrationName,
      flag_descriptions::kForceDiceMigrationDescription, kOsAll,
      FEATURE_VALUE_TYPE(kForceDiceMigration)},
diff --git a/chrome/browser/apps/app_service/OWNERS b/chrome/browser/apps/app_service/OWNERS
index b0cb5ba..fb7902ac 100644
--- a/chrome/browser/apps/app_service/OWNERS
+++ b/chrome/browser/apps/app_service/OWNERS
@@ -1 +1 @@
-file://chrome/services/app_service/OWNERS
+file://components/services/app_service/OWNERS
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 539dbbc3..6f15b65 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -12,14 +12,17 @@
 #include "chrome/browser/accessibility/accessibility_labels_service_factory.h"
 #include "chrome/browser/content_settings/content_settings_manager_impl.h"
 #include "chrome/browser/navigation_predictor/navigation_predictor.h"
+#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ssl/insecure_sensitive_input_driver_factory.h"
+#include "chrome/common/prerender.mojom.h"
 #include "components/dom_distiller/content/browser/distillability_driver.h"
 #include "components/dom_distiller/content/common/mojom/distillability_service.mojom.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_features.h"
+#include "extensions/buildflags/buildflags.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/image_annotation/public/mojom/image_annotation.mojom.h"
 #include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom.h"
@@ -46,6 +49,12 @@
 #include "chrome/browser/payments/payment_request_factory.h"
 #endif
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "extensions/browser/api/mime_handler_private/mime_handler_private.h"
+#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
+#include "extensions/common/api/mime_handler.mojom.h"  // nogncheck
+#endif
+
 namespace chrome {
 namespace internal {
 
@@ -65,7 +74,7 @@
 
 // Forward image Annotator requests to the profile's AccessibilityLabelsService.
 void BindImageAnnotator(
-    content::RenderFrameHost* const frame_host,
+    content::RenderFrameHost* frame_host,
     mojo::PendingReceiver<image_annotation::mojom::Annotator> receiver) {
   AccessibilityLabelsServiceFactory::GetForProfile(
       Profile::FromBrowserContext(
@@ -85,6 +94,16 @@
   driver->CreateDistillabilityService(std::move(receiver));
 }
 
+void BindPrerenderCanceler(
+    content::RenderFrameHost* frame_host,
+    mojo::PendingReceiver<mojom::PrerenderCanceler> receiver) {
+  auto* prerender_contents = prerender::PrerenderContents::FromWebContents(
+      content::WebContents::FromRenderFrameHost(frame_host));
+  if (!prerender_contents)
+    return;
+  prerender_contents->OnPrerenderCancelerReceiver(std::move(receiver));
+}
+
 #if defined(OS_ANDROID)
 template <typename Interface>
 void ForwardToJavaWebContents(content::RenderFrameHost* frame_host,
@@ -102,6 +121,22 @@
 }
 #endif
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+void BindMimeHandlerService(
+    content::RenderFrameHost* frame_host,
+    mojo::PendingReceiver<extensions::mime_handler::MimeHandlerService>
+        receiver) {
+  content::WebContents* contents =
+      content::WebContents::FromRenderFrameHost(frame_host);
+  auto* guest_view =
+      extensions::MimeHandlerViewGuest::FromWebContents(contents);
+  if (!guest_view)
+    return;
+  extensions::MimeHandlerServiceImpl::Create(guest_view->GetStreamWeakPtr(),
+                                             std::move(receiver));
+}
+#endif
+
 void PopulateChromeFrameBinders(
     service_manager::BinderMapWithContext<content::RenderFrameHost*>* map) {
   map->Add<mojom::ContentSettingsManager>(
@@ -119,6 +154,9 @@
   map->Add<dom_distiller::mojom::DistillabilityService>(
       base::BindRepeating(&BindDistillabilityService));
 
+  map->Add<mojom::PrerenderCanceler>(
+      base::BindRepeating(&BindPrerenderCanceler));
+
 #if defined(OS_ANDROID)
   map->Add<blink::mojom::InstalledAppProvider>(base::BindRepeating(
       &ForwardToJavaFrame<blink::mojom::InstalledAppProvider>));
@@ -150,6 +188,10 @@
         base::BindRepeating(&payments::CreatePaymentRequest));
   }
 #endif
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  map->Add<extensions::mime_handler::MimeHandlerService>(
+      base::BindRepeating(&BindMimeHandlerService));
+#endif
 }
 
 }  // namespace internal
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index f47a2ba..d02057b 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2631,7 +2631,7 @@
   }
   storage::GetNominalDynamicSettings(
       partition->GetPath(), context->IsOffTheRecord(),
-      storage::GetDefaultDiskInfoHelper(), std::move(callback));
+      storage::GetDefaultDeviceInfoHelper(), std::move(callback));
 }
 
 content::GeneratedCodeCacheSettings
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index bae3155..17a00b8 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1778,6 +1778,8 @@
     "policy/policy_cert_service_factory.h",
     "policy/policy_oauth2_token_fetcher.cc",
     "policy/policy_oauth2_token_fetcher.h",
+    "policy/policy_pref_names.cc",
+    "policy/policy_pref_names.h",
     "policy/pre_signin_policy_fetcher.cc",
     "policy/pre_signin_policy_fetcher.h",
     "policy/remote_commands/affiliated_remote_commands_invalidator.cc",
diff --git a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate.cc b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate.cc
index 69c1b23..73e98b9 100644
--- a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate.cc
+++ b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate.cc
@@ -84,4 +84,8 @@
   return true;
 }
 
+bool LoginScreenExtensionUiDialogDelegate::ShouldCenterDialogTitleText() const {
+  return true;
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate.h b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate.h
index 11dd36f..cdde247 100644
--- a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate.h
+++ b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate.h
@@ -56,6 +56,7 @@
   void OnCloseContents(content::WebContents* source,
                        bool* out_close_dialog) override;
   bool ShouldShowDialogTitle() const override;
+  bool ShouldCenterDialogTitleText() const override;
 
  private:
   const std::string extension_name_;
diff --git a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate_unittest.cc b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate_unittest.cc
index 55618ea..9e5314e7 100644
--- a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate_unittest.cc
+++ b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate_unittest.cc
@@ -60,6 +60,7 @@
             delegate->GetDialogContentURL());
   EXPECT_FALSE(delegate->CanResizeDialog());
   EXPECT_TRUE(delegate->ShouldShowDialogTitle());
+  EXPECT_TRUE(delegate->ShouldCenterDialogTitleText());
 
   EXPECT_FALSE(delegate->CanCloseDialog());
   delegate->set_can_close(true);
diff --git a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view.cc b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view.cc
index fa4a920..c026cb8 100644
--- a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view.cc
+++ b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view.cc
@@ -40,6 +40,10 @@
   return true;
 }
 
+bool LoginScreenExtensionUiWebDialogView::ShouldCenterWindowTitleText() const {
+  return !delegate_ || delegate_->ShouldCenterDialogTitleText();
+}
+
 void LoginScreenExtensionUiWebDialogView::OnFocusLeavingSystemTray(
     bool reverse) {
   web_contents()->FocusThroughTabTraversal(reverse);
diff --git a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view.h b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view.h
index e8d3426..8845fc2 100644
--- a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view.h
+++ b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view.h
@@ -38,6 +38,7 @@
   // views::WebDialogView
   bool ShouldShowCloseButton() const override;
   bool TakeFocus(content::WebContents* source, bool reverse) override;
+  bool ShouldCenterWindowTitleText() const override;
 
   // ash::SystemTrayFocusObserver
   void OnFocusLeavingSystemTray(bool reverse) override;
diff --git a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view_unittest.cc b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view_unittest.cc
index a8f62b8..bb901016 100644
--- a/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view_unittest.cc
+++ b/chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view_unittest.cc
@@ -75,6 +75,12 @@
   EXPECT_FALSE(dialog_view_->ShouldShowCloseButton());
 }
 
+TEST_F(LoginScreenExtensionUiWebDialogViewUnittest,
+       ShouldCenterDialogTitleText) {
+  CreateDialogView(/*can_be_closed_by_user=*/false);
+  EXPECT_TRUE(dialog_view_->ShouldCenterDialogTitleText());
+}
+
 TEST_F(LoginScreenExtensionUiWebDialogViewUnittest, TabOut) {
   CreateDialogView();
 
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
index 5b9fcf6..c075b34 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
@@ -29,6 +29,7 @@
 #include "chrome/browser/chromeos/login/startup_utils.h"
 #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
 #include "chrome/browser/chromeos/policy/heartbeat_scheduler.h"
+#include "chrome/browser/chromeos/policy/policy_pref_names.h"
 #include "chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h"
 #include "chrome/browser/chromeos/policy/rsu/lookup_key_uploader.h"
 #include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
@@ -243,6 +244,7 @@
   registry->RegisterDictionaryPref(prefs::kServerBackedDeviceState);
   registry->RegisterBooleanPref(prefs::kRemoveUsersRemoteCommand, false);
   registry->RegisterStringPref(prefs::kLastRsuDeviceIdUploaded, std::string());
+  registry->RegisterListPref(prefs::kStoreLogStatesAcrossReboots);
 }
 
 // static
diff --git a/chrome/browser/chromeos/policy/policy_pref_names.cc b/chrome/browser/chromeos/policy/policy_pref_names.cc
new file mode 100644
index 0000000..76436bd
--- /dev/null
+++ b/chrome/browser/chromeos/policy/policy_pref_names.cc
@@ -0,0 +1,14 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/policy/policy_pref_names.h"
+
+namespace prefs {
+
+// Maintain a list of last upload times of system logs in double type; this is
+// for the purpose of throttling log uploads.
+const char kStoreLogStatesAcrossReboots[] =
+    "policy_store_log_states_across_reboots";
+
+}  // namespace prefs
diff --git a/chrome/browser/chromeos/policy/policy_pref_names.h b/chrome/browser/chromeos/policy/policy_pref_names.h
new file mode 100644
index 0000000..0f7071b
--- /dev/null
+++ b/chrome/browser/chromeos/policy/policy_pref_names.h
@@ -0,0 +1,15 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_POLICY_PREF_NAMES_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_POLICY_PREF_NAMES_H_
+
+namespace prefs {
+
+// Non-specific prefs.
+extern const char kStoreLogStatesAcrossReboots[];
+
+}  // namespace prefs
+
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_POLICY_PREF_NAMES_H_
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.cc b/chrome/browser/chromeos/policy/system_log_uploader.cc
index 85a3a1e..69362cb 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader.cc
+++ b/chrome/browser/chromeos/policy/system_log_uploader.cc
@@ -4,8 +4,10 @@
 
 #include "chrome/browser/chromeos/policy/system_log_uploader.h"
 
+#include <algorithm>
 #include <map>
 #include <utility>
+#include <vector>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -19,7 +21,9 @@
 #include "base/strings/stringprintf.h"
 #include "base/syslog_logging.h"
 #include "base/task/post_task.h"
+#include "base/values.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/policy/policy_pref_names.h"
 #include "chrome/browser/chromeos/policy/upload_job_impl.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
@@ -30,6 +34,7 @@
 #include "chrome/common/extensions/extension_constants.h"
 #include "components/feedback/anonymizer_tool.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/prefs/pref_service.h"
 #include "components/user_manager/user_manager.h"
 #include "net/http/http_request_headers.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -273,6 +278,13 @@
 const int64_t SystemLogUploader::kErrorUploadDelayMs =
     120 * 1000;  // 120 seconds
 
+// Determines max number of logs to be uploaded in kLogThrottleWindowDuration.
+const int64_t SystemLogUploader::kLogThrottleCount = 100;
+
+// Determines the time window for which the upload times should be stored.
+const base::TimeDelta SystemLogUploader::kLogThrottleWindowDuration =
+    base::TimeDelta::FromHours(24);
+
 // String constant identifying the header field which stores the file type.
 const char* const SystemLogUploader::kFileTypeHeaderName = "File-Type";
 
@@ -500,6 +512,55 @@
   }
 }
 
+// Update the list of logs within kLogThrottleWindowDuration window and add the
+// latest log upload time if any.
+base::Time SystemLogUploader::UpdateLocalStateForLogs() {
+  const base::Time now = base::Time::NowFromSystemTime();
+  PrefService* local_state = g_browser_process->local_state();
+
+  const base::ListValue* prev_log_uploads =
+      local_state->GetList(prefs::kStoreLogStatesAcrossReboots);
+
+  std::vector<base::Time> updated_log_uploads;
+
+  for (const base::Value& item : *prev_log_uploads) {
+    // ListValue stores Value type and Value does not support base::Time,
+    // so we store double and convert to base::Time here.
+    const base::Time current_item_time =
+        base::Time::FromDoubleT(item.GetDouble());
+
+    // Logs are valid only if they occur in previous kLogThrottleWindowDuration
+    // time window.
+    if (now - current_item_time <= kLogThrottleWindowDuration)
+      updated_log_uploads.push_back(current_item_time);
+  }
+
+  if (!last_upload_attempt_.is_null() &&
+      (updated_log_uploads.empty() ||
+       last_upload_attempt_ > updated_log_uploads.back())) {
+    updated_log_uploads.push_back(last_upload_attempt_);
+  }
+
+  // This happens only in case of ScheduleNextSystemLogUploadImmediately. It is
+  // sufficient to delete only one entry as at most 1 entry is appended on the
+  // method call, hence the list size would exceed by at most 1.
+  if (updated_log_uploads.size() > kLogThrottleCount)
+    updated_log_uploads.erase(updated_log_uploads.begin());
+
+  // Create a list to be updated for the pref.
+  base::Value updated_prev_log_uploads(base::Value::Type::LIST);
+  for (auto it : updated_log_uploads) {
+    updated_prev_log_uploads.Append(it.ToDoubleT());
+  }
+  local_state->Set(prefs::kStoreLogStatesAcrossReboots,
+                   updated_prev_log_uploads);
+
+  // Write the changes to the disk to prevent loss of changes.
+  local_state->CommitPendingWrite();
+  // If there are no log entries till now, return zero value.
+  return updated_log_uploads.empty() ? base::Time() : updated_log_uploads[0];
+}
+
 void SystemLogUploader::ScheduleNextSystemLogUpload(base::TimeDelta frequency) {
   // Don't schedule a new system log upload if there's a log upload in progress
   // (it will be scheduled once the current one completes).
@@ -508,14 +569,25 @@
                  << "next one until this one finishes.";
     return;
   }
-
+  base::Time last_valid_log_upload = UpdateLocalStateForLogs();
   // Calculate when to fire off the next update.
   base::TimeDelta delay = std::max(
       (last_upload_attempt_ + frequency) - base::Time::NowFromSystemTime(),
       base::TimeDelta());
+
+  // To ensure at most kLogThrottleCount logs are uploaded in
+  // kLogThrottleWindowDuration time.
+  if (g_browser_process->local_state()
+              ->GetList(prefs::kStoreLogStatesAcrossReboots)
+              ->GetSize() >= kLogThrottleCount &&
+      !frequency.is_zero()) {
+    delay = std::max(delay, last_valid_log_upload + kLogThrottleWindowDuration -
+                                base::Time::NowFromSystemTime());
+  }
+
   SYSLOG(INFO) << "Scheduling next system log upload " << delay << " from now.";
   // Ensure that we never have more than one pending delayed task
-  // (InvalidateWeakPtrs() will cancel any pending log uploads).
+  // (InvalidateWeakPtrs() will cancel any pending calls to log uploads).
   weak_factory_.InvalidateWeakPtrs();
   task_runner_->PostDelayedTask(
       FROM_HERE,
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.h b/chrome/browser/chromeos/policy/system_log_uploader.h
index e40c9cbb..456a026 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader.h
+++ b/chrome/browser/chromeos/policy/system_log_uploader.h
@@ -48,6 +48,9 @@
   static const int64_t kDefaultUploadDelayMs;
   static const int64_t kErrorUploadDelayMs;
 
+  static const int64_t kLogThrottleCount;
+  static const base::TimeDelta kLogThrottleWindowDuration;
+
   // Http header constants to upload non-zipped logs.
   static const char* const kNameFieldTemplate;
   static const char* const kFileTypeHeaderName;
@@ -119,6 +122,12 @@
 
   void ScheduleNextSystemLogUploadImmediately();
 
+  // Removes the log upload times before the particular time window ( which were
+  // uploaded before kLogThrottleWindowDuration time from now), add the latest
+  // log upload time if any and return the oldest log upload time in the
+  // particular time window.
+  base::Time UpdateLocalStateForLogs();
+
   // UploadJob::Delegate:
   // Callbacks handle success and failure results of upload, destroy the
   // upload job.
diff --git a/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc b/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
index a898c32..a3d8a820 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
+++ b/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
@@ -12,8 +12,11 @@
 #include "base/test/test_simple_task_runner.h"
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.h"
+#include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/common/chrome_features.h"
+#include "chrome/test/base/testing_browser_process.h"
 #include "components/feedback/anonymizer_tool.h"
+#include "components/prefs/testing_pref_service.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_utils.h"
 #include "net/http/http_request_headers.h"
@@ -27,6 +30,10 @@
 constexpr char kPolicyDumpFileLocation[] = "/var/log/policy_dump.json";
 constexpr char kPolicyDump[] = "{}";
 
+// A small time interval to check log throttling.
+constexpr base::TimeDelta kLogThrottleDeltaTime =
+    base::TimeDelta::FromMilliseconds(100);
+
 // The list of tested system log file names.
 const char* const kTestSystemLogFileNames[] = {"name1.txt", "name32.txt"};
 
@@ -220,18 +227,21 @@
 
 class SystemLogUploaderTest : public testing::TestWithParam<bool> {
  public:
+  TestingPrefServiceSimple local_state_;
   SystemLogUploaderTest()
       : task_runner_(new base::TestSimpleTaskRunner()),
         is_zipped_upload_(GetParam()) {
     feature_list.InitWithFeatureState(features::kUploadZippedSystemLogs,
                                       is_zipped_upload_);
   }
-
   void SetUp() override {
+    RegisterLocalState(local_state_.registry());
+    TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
     settings_helper_.ReplaceDeviceSettingsProviderWithStub();
   }
 
   void TearDown() override {
+    TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
     settings_helper_.RestoreRealDeviceSettingsProvider();
     content::RunAllTasksUntilIdle();
   }
@@ -285,6 +295,62 @@
   base::HistogramTester histogram_tester_;
 };
 
+// Verify log throttling. Try successive kLogThrottleCount log uploads by
+// creating a new task. First kLogThrottleCount logs should have 0 delay.
+// Successive logs should have approx. kLogThrottleWindowDuration delay.
+TEST_P(SystemLogUploaderTest, LogThrottleTest) {
+  for (int upload_num = 0;
+       upload_num < SystemLogUploader::kLogThrottleCount + 3; upload_num++) {
+    EXPECT_FALSE(task_runner_->HasPendingTask());
+    auto syslog_delegate = std::make_unique<MockSystemLogDelegate>(
+        false, SystemLogUploader::SystemLogs(), is_zipped_upload_);
+
+    syslog_delegate->set_upload_allowed(true);
+    settings_helper_.SetBoolean(chromeos::kSystemLogUploadEnabled, true);
+
+    SystemLogUploader uploader(std::move(syslog_delegate), task_runner_);
+
+    EXPECT_EQ(1U, task_runner_->NumPendingTasks());
+
+    if (upload_num < SystemLogUploader::kLogThrottleCount) {
+      EXPECT_EQ(task_runner_->NextPendingTaskDelay(),
+                base::TimeDelta::FromMilliseconds(0));
+    } else {
+      // The delay would be in a small delta range of
+      // kLogThrottleWindowDuration.
+      EXPECT_GE(task_runner_->NextPendingTaskDelay(),
+                SystemLogUploader::kLogThrottleWindowDuration -
+                    kLogThrottleDeltaTime);
+      EXPECT_LE(task_runner_->NextPendingTaskDelay(),
+                SystemLogUploader::kLogThrottleWindowDuration +
+                    kLogThrottleDeltaTime);
+    }
+
+    task_runner_->RunPendingTasks();
+    task_runner_->ClearPendingTasks();
+  }
+}
+
+// Verify that we never throttle immediate log upload.
+TEST_P(SystemLogUploaderTest, ImmediateLogUpload) {
+  EXPECT_FALSE(task_runner_->HasPendingTask());
+  auto syslog_delegate = std::make_unique<MockSystemLogDelegate>(
+      false, SystemLogUploader::SystemLogs(), is_zipped_upload_);
+
+  syslog_delegate->set_upload_allowed(true);
+  settings_helper_.SetBoolean(chromeos::kSystemLogUploadEnabled, true);
+
+  SystemLogUploader uploader(std::move(syslog_delegate), task_runner_);
+  for (int upload_num = 0;
+       upload_num < SystemLogUploader::kLogThrottleCount + 3; upload_num++) {
+    uploader.ScheduleNextSystemLogUploadImmediately();
+    EXPECT_EQ(task_runner_->NextPendingTaskDelay(),
+              base::TimeDelta::FromMilliseconds(0));
+    task_runner_->RunPendingTasks();
+    task_runner_->ClearPendingTasks();
+  }
+}
+
 // Check disabled system log uploads by default.
 TEST_P(SystemLogUploaderTest, Basic) {
   EXPECT_FALSE(task_runner_->HasPendingTask());
@@ -321,7 +387,7 @@
   ExpectSuccessHistogram(/*amount=*/1);
 }
 
-// Three failed responses recieved.
+// Three failed responses received.
 TEST_P(SystemLogUploaderTest, ThreeFailureTest) {
   EXPECT_FALSE(task_runner_->HasPendingTask());
 
diff --git a/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc b/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc
index 1ef3f5eb..68296a8 100644
--- a/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc
+++ b/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc
@@ -72,8 +72,8 @@
   }
 
   std::unique_ptr<TestGaiaWebAuthFlow> CreateTestFlow() {
-    ExtensionTokenKey token_key(
-        "extension_id", "account_id", std::set<std::string>());
+    ExtensionTokenKey token_key("extension_id", CoreAccountId("account_id"),
+                                std::set<std::string>());
     return std::unique_ptr<TestGaiaWebAuthFlow>(new TestGaiaWebAuthFlow(
         &delegate_, &token_key, "fake.client.id", ubertoken_error_state_));
   }
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc
index 9a1ff1a..0a631702 100644
--- a/chrome/browser/extensions/api/identity/identity_apitest.cc
+++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -356,10 +356,10 @@
         IdentityManagerFactory::GetForProfile(GetProfile());
     std::vector<CoreAccountInfo> accounts =
         identity_manager->GetAccountsWithRefreshTokens();
-    std::string primary_id = identity_manager->GetPrimaryAccountId();
+    CoreAccountId primary_id = identity_manager->GetPrimaryAccountId();
     bool fixed_auth_error = false;
     for (const auto& account_info : accounts) {
-      std::string account_id = account_info.account_id;
+      CoreAccountId account_id = account_info.account_id;
       if (account_id == primary_id)
         continue;
       if (identity_manager->HasAccountWithRefreshTokenInPersistentErrorState(
@@ -724,8 +724,8 @@
 #endif
   }
 
-  std::string IssueLoginAccessTokenForAccount(const std::string& account_id) {
-    std::string access_token = "access_token-" + account_id;
+  std::string IssueLoginAccessTokenForAccount(const CoreAccountId& account_id) {
+    std::string access_token = "access_token-" + account_id.id;
     identity_test_env()
         ->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
             account_id, access_token,
@@ -2494,7 +2494,7 @@
   AddExpectedEvent(api::identity::OnSignInChanged::Create(account_info, true));
 
   // Make a secondary account available again and check that the callback fires.
-  std::string secondary_account_id =
+  CoreAccountId secondary_account_id =
       identity_test_env()
           ->MakeAccountAvailable("secondary@example.com")
           .account_id;
diff --git a/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
index 4a84d88..533703cc 100644
--- a/chrome/browser/extensions/api/sessions/sessions_apitest.cc
+++ b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -194,7 +194,7 @@
   syncer::DataTypeActivationRequest request;
   request.error_handler = base::DoNothing();
   request.cache_guid = kTestCacheGuid;
-  request.authenticated_account_id = "SomeAccountId";
+  request.authenticated_account_id = CoreAccountId("SomeAccountId");
 
   sync_sessions::SessionSyncService* service =
       SessionSyncServiceFactory::GetForProfile(browser()->profile());
diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc
index 4872984..5e8041f9 100644
--- a/chrome/browser/extensions/updater/extension_updater_unittest.cc
+++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
@@ -282,7 +282,7 @@
     return identity_test_env_.get();
   }
 
-  const std::string& account_id() { return account_info_.account_id.id; }
+  const CoreAccountId& account_id() { return account_info_.account_id; }
 
   // Creates test extensions and inserts them into list. The name and
   // version are all based on their index. If |update_url| is non-null, it
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index a66b142..f356d98 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2853,13 +2853,6 @@
 
 #else  // !defined(OS_ANDROID)
 
-const char kAccountConsistencyName[] =
-    "Identity consistency between browser and cookie jar";
-const char kAccountConsistencyDescription[] =
-    "When enabled, the browser manages signing in and out of Google accounts.";
-const char kAccountConsistencyChoiceMirror[] = "Mirror";
-const char kAccountConsistencyChoiceDice[] = "Dice";
-
 const char kForceDiceMigrationName[] = "Force the migration to Dice";
 const char kForceDiceMigrationDescription[] =
     "When enabled the account reconcilor will force the migration to dice";
@@ -3522,10 +3515,6 @@
 const char kEnableVirtualDesksDescription[] =
     "A preview of the upcoming Virtual Desks features on Chrome OS devices.";
 
-const char kEnableVirtualDesksGesturesName[] = "Enable Virtual Desks gestures";
-const char kEnableVirtualDesksGesturesDescription[] =
-    "Enables touchpad gestures for Virtual Desks.";
-
 const char kTrimOnFreezeName[] = "Trim Working Set on freeze";
 const char kTrimOnFreezeDescription[] = "Trim Working Set on all frames frozen";
 
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index e90f15a..99073a74 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1667,11 +1667,6 @@
 
 #else  // !defined(OS_ANDROID)
 
-extern const char kAccountConsistencyName[];
-extern const char kAccountConsistencyDescription[];
-extern const char kAccountConsistencyChoiceMirror[];
-extern const char kAccountConsistencyChoiceDice[];
-
 extern const char kForceDiceMigrationName[];
 extern const char kForceDiceMigrationDescription[];
 
@@ -2085,9 +2080,6 @@
 extern const char kEnableVirtualDesksName[];
 extern const char kEnableVirtualDesksDescription[];
 
-extern const char kEnableVirtualDesksGesturesName[];
-extern const char kEnableVirtualDesksGesturesDescription[];
-
 extern const char kTerminalSystemAppName[];
 extern const char kTerminalSystemAppDescription[];
 
diff --git a/chrome/browser/media/media_engagement_contents_observer_unittest.cc b/chrome/browser/media/media_engagement_contents_observer_unittest.cc
index 0280a8f5..3fc2f15 100644
--- a/chrome/browser/media/media_engagement_contents_observer_unittest.cc
+++ b/chrome/browser/media/media_engagement_contents_observer_unittest.cc
@@ -302,13 +302,8 @@
                       int playbacks_total,
                       int visits_total,
                       int score,
-                      int playbacks_delta,
-                      bool high_score,
                       int audible_players_delta,
-                      int audible_players_total,
-                      int significant_players_delta,
-                      int significant_players_total,
-                      int seconds_since_playback) {
+                      int significant_players_delta) {
     using Entry = ukm::builders::Media_Engagement_SessionFinished;
 
     auto ukm_entries = test_ukm_recorder_.GetEntriesByName(Entry::kEntryName);
@@ -322,25 +317,12 @@
                                 ukm_entry, Entry::kVisits_TotalName));
     EXPECT_EQ(score, *test_ukm_recorder_.GetEntryMetric(
                          ukm_entry, Entry::kEngagement_ScoreName));
-    EXPECT_EQ(playbacks_delta, *test_ukm_recorder_.GetEntryMetric(
-                                   ukm_entry, Entry::kPlaybacks_DeltaName));
-    EXPECT_EQ(high_score, !!*test_ukm_recorder_.GetEntryMetric(
-                              ukm_entry, Entry::kEngagement_IsHighName));
     EXPECT_EQ(audible_players_delta,
               *test_ukm_recorder_.GetEntryMetric(
                   ukm_entry, Entry::kPlayer_Audible_DeltaName));
-    EXPECT_EQ(audible_players_total,
-              *test_ukm_recorder_.GetEntryMetric(
-                  ukm_entry, Entry::kPlayer_Audible_TotalName));
     EXPECT_EQ(significant_players_delta,
               *test_ukm_recorder_.GetEntryMetric(
                   ukm_entry, Entry::kPlayer_Significant_DeltaName));
-    EXPECT_EQ(significant_players_total,
-              *test_ukm_recorder_.GetEntryMetric(
-                  ukm_entry, Entry::kPlayer_Significant_TotalName));
-    EXPECT_EQ(seconds_since_playback,
-              *test_ukm_recorder_.GetEntryMetric(
-                  ukm_entry, Entry::kPlaybacks_SecondsSinceLastName));
   }
 
   void ExpectUkmIgnoredEntries(const url::Origin& origin,
@@ -1015,7 +997,7 @@
 
   SimulateDestroy();
   ExpectScores(origin, 21.0 / 25.0, 25, 21, 5, 2, 1, 0);
-  ExpectUkmEntry(origin, 21, 25, 84, 1, true, 2, 5, 1, 2, 0);
+  ExpectUkmEntry(origin, 21, 25, 84, 2, 1);
 }
 
 TEST_F(MediaEngagementContentsObserverTest,
@@ -1033,7 +1015,7 @@
 
   // AudioContext playbacks should count as a significant playback.
   ExpectScores(origin, 21.0 / 25.0, 25, 21, 2, 1, 0, 1);
-  ExpectUkmEntry(origin, 21, 25, 84, 0, true, 0, 2, 0, 1, 0);
+  ExpectUkmEntry(origin, 21, 25, 84, 0, 0);
 }
 
 TEST_F(MediaEngagementContentsObserverTest,
@@ -1046,7 +1028,7 @@
 
   SimulateDestroy();
   ExpectScores(origin, 20.0 / 25.0, 25, 20, 2, 1, 0, 0);
-  ExpectUkmEntry(origin, 20, 25, 80, 0, true, 0, 2, 0, 1, 0);
+  ExpectUkmEntry(origin, 20, 25, 80, 0, 0);
 }
 
 TEST_F(MediaEngagementContentsObserverTest, RecordUkmMetricsOnNavigate) {
@@ -1063,7 +1045,7 @@
 
   Navigate(GURL("https://www.example.org"));
   ExpectScores(origin, 21.0 / 25.0, 25, 21, 5, 2, 1, 0);
-  ExpectUkmEntry(origin, 21, 25, 84, 1, true, 2, 5, 1, 2, 0);
+  ExpectUkmEntry(origin, 21, 25, 84, 2, 1);
 }
 
 TEST_F(MediaEngagementContentsObserverTest,
@@ -1082,7 +1064,7 @@
 
   // AudioContext playbacks should count as a media playback.
   ExpectScores(origin, 21.0 / 25.0, 25, 21, 2, 1, 0, 1);
-  ExpectUkmEntry(origin, 21, 25, 84, 0, true, 0, 2, 0, 1, 0);
+  ExpectUkmEntry(origin, 21, 25, 84, 0, 0);
 }
 
 TEST_F(MediaEngagementContentsObserverTest,
@@ -1095,7 +1077,7 @@
 
   Navigate(GURL("https://www.example.org"));
   ExpectScores(origin, 6 / 28.0, 28, 6, 2, 1, 0, 0);
-  ExpectUkmEntry(origin, 6, 28, 21, 0, false, 0, 2, 0, 1, 0);
+  ExpectUkmEntry(origin, 6, 28, 21, 0, 0);
 }
 
 TEST_F(MediaEngagementContentsObserverTest,
@@ -1119,7 +1101,7 @@
   SimulateDestroy();
   ExpectScores(origin, 21.0 / 25.0, 25, 21, 5, 3, 1, 0);
   ExpectLastPlaybackTime(origin, first);
-  ExpectUkmEntry(origin, 21, 25, 84, 1, true, 2, 5, 2, 3, 900);
+  ExpectUkmEntry(origin, 21, 25, 84, 2, 2);
 }
 
 TEST_F(MediaEngagementContentsObserverTest, DoNotCreateSessionOnInternalUrl) {
diff --git a/chrome/browser/media/media_engagement_session.cc b/chrome/browser/media/media_engagement_session.cc
index b31e17bb..3f87596 100644
--- a/chrome/browser/media/media_engagement_session.cc
+++ b/chrome/browser/media/media_engagement_session.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/media/media_engagement_session.h"
 
-#include "chrome/browser/media/media_engagement_preloaded_list.h"
 #include "chrome/browser/media/media_engagement_score.h"
 #include "chrome/browser/media/media_engagement_service.h"
 #include "media/base/media_switches.h"
@@ -118,30 +117,14 @@
   if (!ukm_recorder)
     return;
 
-  bool is_preloaded = false;
-  if (base::FeatureList::IsEnabled(media::kPreloadMediaEngagementData)) {
-    is_preloaded =
-        MediaEngagementPreloadedList::GetInstance()->CheckOriginIsPresent(
-            origin_);
-  }
-
   MediaEngagementScore score = service_->CreateEngagementScore(origin_);
   ukm::builders::Media_Engagement_SessionFinished(ukm_source_id_)
-      .SetPlaybacks_AudioContextTotal(score.audio_context_playbacks())
-      .SetPlaybacks_MediaElementTotal(score.media_element_playbacks())
       .SetPlaybacks_Total(score.media_playbacks())
       .SetVisits_Total(score.visits())
       .SetEngagement_Score(round(score.actual_score() * 100))
-      .SetPlaybacks_Delta(significant_media_element_playback_recorded_)
       .SetEngagement_IsHigh(score.high_score())
-      .SetEngagement_IsHigh_Changed(high_score_changed_)
-      .SetEngagement_IsHigh_Changes(score.high_score_changes())
-      .SetEngagement_IsPreloaded(is_preloaded)
       .SetPlayer_Audible_Delta(audible_players_total_)
-      .SetPlayer_Audible_Total(score.audible_playbacks())
       .SetPlayer_Significant_Delta(significant_players_total_)
-      .SetPlayer_Significant_Total(score.significant_playbacks())
-      .SetPlaybacks_SecondsSinceLast(time_since_playback_for_ukm_.InSeconds())
       .Record(ukm_recorder);
 }
 
@@ -165,8 +148,6 @@
     score.IncrementVisits();
 
   if (WasSignificantPlaybackRecorded() && HasPendingPlaybackToCommit()) {
-    const base::Time old_time = score.last_media_playback_time();
-
     score.IncrementMediaPlaybacks();
 
     if (pending_data_to_commit_.audio_context_playback)
@@ -177,18 +158,6 @@
 
     // Use the stored significant playback time.
     score.set_last_media_playback_time(first_significant_playback_time_);
-
-    // This code should be reached once and |time_since_playback_for_ukm_| can't
-    // be set.
-    DCHECK(time_since_playback_for_ukm_.is_zero());
-
-    if (!old_time.is_null()) {
-      // Calculate the time since the last playback and the first significant
-      // playback this visit. If there is no last playback time then we will
-      // record 0.
-      time_since_playback_for_ukm_ =
-          score.last_media_playback_time() - old_time;
-    }
   }
 
   if (pending_data_to_commit_.players) {
diff --git a/chrome/browser/media/media_engagement_session.h b/chrome/browser/media/media_engagement_session.h
index 050967e..26920aec 100644
--- a/chrome/browser/media/media_engagement_session.h
+++ b/chrome/browser/media/media_engagement_session.h
@@ -113,9 +113,6 @@
   // The time the first significant playback occurred.
   base::Time first_significant_playback_time_;
 
-  // The time between significant playbacks to be recorded to UKM.
-  base::TimeDelta time_since_playback_for_ukm_;
-
   // Whether the session was restored.
   RestoreType restore_status_ = RestoreType::kNotRestored;
 
diff --git a/chrome/browser/media/media_engagement_session_unittest.cc b/chrome/browser/media/media_engagement_session_unittest.cc
index c1468db..17400c2 100644
--- a/chrome/browser/media/media_engagement_session_unittest.cc
+++ b/chrome/browser/media/media_engagement_session_unittest.cc
@@ -96,11 +96,6 @@
     session->RecordUkmMetrics();
   }
 
-  static base::TimeDelta GetTimeSincePlaybackForSession(
-      MediaEngagementSession* session) {
-    return session->time_since_playback_for_ukm_;
-  }
-
   MediaEngagementSessionTest()
       : origin_(url::Origin::Create(GURL("https://example.com"))) {}
 
@@ -682,34 +677,18 @@
 
     auto* ukm_entry = ukm_entries[0];
     test_ukm_recorder().ExpectEntrySourceHasUrl(ukm_entry, origin().GetURL());
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlaybacks_AudioContextTotalName));
-    EXPECT_EQ(1, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlaybacks_MediaElementTotalName));
     EXPECT_EQ(1, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kPlaybacks_TotalName));
     EXPECT_EQ(1, *test_ukm_recorder().GetEntryMetric(ukm_entry,
                                                      Entry::kVisits_TotalName));
     EXPECT_EQ(5, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kEngagement_ScoreName));
-    EXPECT_EQ(1, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlaybacks_DeltaName));
     EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kEngagement_IsHighName));
     EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kPlayer_Audible_DeltaName));
     EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlayer_Audible_TotalName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kPlayer_Significant_DeltaName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlayer_Significant_TotalName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlaybacks_SecondsSinceLastName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kEngagement_IsHigh_ChangesName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kEngagement_IsHigh_ChangedName));
   }
 
   session->RecordSignificantAudioContextPlayback();
@@ -723,96 +702,19 @@
 
     auto* ukm_entry = ukm_entries[1];
     test_ukm_recorder().ExpectEntrySourceHasUrl(ukm_entry, origin().GetURL());
-    EXPECT_EQ(1, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlaybacks_AudioContextTotalName));
-    EXPECT_EQ(1, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlaybacks_MediaElementTotalName));
+
     EXPECT_EQ(2, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kPlaybacks_TotalName));
     EXPECT_EQ(1, *test_ukm_recorder().GetEntryMetric(ukm_entry,
                                                      Entry::kVisits_TotalName));
     EXPECT_EQ(10, *test_ukm_recorder().GetEntryMetric(
                       ukm_entry, Entry::kEngagement_ScoreName));
-    EXPECT_EQ(1, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlaybacks_DeltaName));
     EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kEngagement_IsHighName));
     EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kPlayer_Audible_DeltaName));
     EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlayer_Audible_TotalName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
                      ukm_entry, Entry::kPlayer_Significant_DeltaName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlayer_Significant_TotalName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kPlaybacks_SecondsSinceLastName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kEngagement_IsHigh_ChangesName));
-    EXPECT_EQ(0, *test_ukm_recorder().GetEntryMetric(
-                     ukm_entry, Entry::kEngagement_IsHigh_ChangedName));
-  }
-}
-
-TEST_F(MediaEngagementSessionTest, RecordUkmMetrics_Changed_NowHigh) {
-  const std::string url_string = origin().GetURL().spec();
-  using Entry = ukm::builders::Media_Engagement_SessionFinished;
-
-  // Set the visits and playbacks to just below the threshold so the next
-  // significant playback will result in the playback being high.
-  SetVisitsAndPlaybacks(19, 5);
-  EXPECT_FALSE(ScoreIsHigh());
-
-  scoped_refptr<MediaEngagementSession> session = new MediaEngagementSession(
-      service(), origin(), MediaEngagementSession::RestoreType::kNotRestored,
-      ukm_source_id());
-
-  session->RecordSignificantMediaElementPlayback();
-  CommitPendingDataForSession(session.get());
-
-  EXPECT_EQ(0u, test_ukm_recorder().GetEntriesByName(Entry::kEntryName).size());
-
-  RecordUkmMetricsForSession(session.get());
-
-  {
-    auto ukm_entries = test_ukm_recorder().GetEntriesByName(Entry::kEntryName);
-    EXPECT_EQ(1u, ukm_entries.size());
-
-    auto* ukm_entry = ukm_entries[0];
-    test_ukm_recorder().ExpectEntrySourceHasUrl(ukm_entry, origin().GetURL());
-    EXPECT_EQ(1u, *test_ukm_recorder().GetEntryMetric(
-                      ukm_entry, Entry::kEngagement_IsHigh_ChangedName));
-  }
-}
-
-TEST_F(MediaEngagementSessionTest, RecordUkmMetrics_Changed_WasHigh) {
-  const std::string url_string = origin().GetURL().spec();
-  using Entry = ukm::builders::Media_Engagement_SessionFinished;
-
-  // Set the visits and playbacks to just above the lower threshold and the is
-  // high bit to true so the next visit will cross the threshold.
-  SetVisitsAndPlaybacks(20, 20);
-  SetVisitsAndPlaybacks(20, 4);
-  EXPECT_TRUE(ScoreIsHigh());
-
-  scoped_refptr<MediaEngagementSession> session = new MediaEngagementSession(
-      service(), origin(), MediaEngagementSession::RestoreType::kNotRestored,
-      ukm_source_id());
-
-  CommitPendingDataForSession(session.get());
-
-  EXPECT_EQ(0u, test_ukm_recorder().GetEntriesByName(Entry::kEntryName).size());
-
-  RecordUkmMetricsForSession(session.get());
-
-  {
-    auto ukm_entries = test_ukm_recorder().GetEntriesByName(Entry::kEntryName);
-    EXPECT_EQ(1u, ukm_entries.size());
-
-    auto* ukm_entry = ukm_entries[0];
-    test_ukm_recorder().ExpectEntrySourceHasUrl(ukm_entry, origin().GetURL());
-    EXPECT_EQ(1u, *test_ukm_recorder().GetEntryMetric(
-                      ukm_entry, Entry::kEngagement_IsHigh_ChangedName));
   }
 }
 
@@ -960,42 +862,6 @@
   }
 }
 
-// Tests that the TimeSinceLastPlayback is set to zero if there is no previous
-// record.
-TEST_F(MediaEngagementSessionTest, TimeSinceLastPlayback_NoPreviousRecord) {
-  scoped_refptr<MediaEngagementSession> session = new MediaEngagementSession(
-      service(), origin(), MediaEngagementSession::RestoreType::kNotRestored,
-      ukm_source_id());
-
-  EXPECT_TRUE(GetTimeSincePlaybackForSession(session.get()).is_zero());
-
-  // Advance in time and play.
-  test_clock()->Advance(base::TimeDelta::FromSeconds(42));
-  session->RecordSignificantMediaElementPlayback();
-
-  EXPECT_TRUE(GetTimeSincePlaybackForSession(session.get()).is_zero());
-}
-
-// Tests that the TimeSinceLastPlayback is set to the delta when there is a
-// previous record.
-TEST_F(MediaEngagementSessionTest, TimeSinceLastPlayback_PreviousRecord) {
-  scoped_refptr<MediaEngagementSession> session = new MediaEngagementSession(
-      service(), origin(), MediaEngagementSession::RestoreType::kNotRestored,
-      ukm_source_id());
-
-  EXPECT_TRUE(GetTimeSincePlaybackForSession(session.get()).is_zero());
-
-  // Advance in time and play.
-  test_clock()->Advance(base::TimeDelta::FromSeconds(42));
-  RecordPlayback(origin());
-
-  test_clock()->Advance(base::TimeDelta::FromSeconds(42));
-  session->RecordSignificantMediaElementPlayback();
-  CommitPendingDataForSession(session.get());
-
-  EXPECT_EQ(42, GetTimeSincePlaybackForSession(session.get()).InSeconds());
-}
-
 TEST_F(MediaEngagementSessionTest, RestoredSession_SimpleVisitNotRecorded) {
   scoped_refptr<MediaEngagementSession> session = new MediaEngagementSession(
       service(), origin(), MediaEngagementSession::RestoreType::kRestored,
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index abd96240..d062a277 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -3900,9 +3900,8 @@
   EXPECT_EQ(base::ASCIIToUTF16("user"), controller->GetElidedValueAt(0));
   EXPECT_NE(base::ASCIIToUTF16("admin"), controller->GetElidedValueAt(1));
 
-  // TODO(crbug.com/1004777): Here the username_field should get re-filled with
-  // "user" instead of "admin".
-  // WaitForElementValue("username_field", "user");
+  // The username_field should get re-filled with "user" instead of "admin".
+  WaitForElementValue("username_field", "user");
 
   // Delete all the credentials.
   password_store->RemoveLogin(user_form);
diff --git a/chrome/browser/password_manager/password_store_signin_notifier_impl_unittest.cc b/chrome/browser/password_manager/password_store_signin_notifier_impl_unittest.cc
index fe93f280..0c403384 100644
--- a/chrome/browser/password_manager/password_store_signin_notifier_impl_unittest.cc
+++ b/chrome/browser/password_manager/password_store_signin_notifier_impl_unittest.cc
@@ -84,7 +84,7 @@
   // processed in this testing context.
   identity_test_env()->EnableRemovalOfExtendedAccountInfo();
   identity_manager->GetAccountsMutator()->RemoveAccount(
-      "secondary_account_id",
+      CoreAccountId("secondary_account_id"),
       signin_metrics::SourceForRefreshTokenOperation::kUserMenu_RemoveAccount);
   testing::Mock::VerifyAndClearExpectations(store_.get());
 
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc b/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
index f6e00cd..d1ce9ea5 100644
--- a/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
+++ b/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
@@ -109,7 +109,7 @@
                    base::Unretained(this));
     AccountInfo account_info =
         identity_test_env()->MakeAccountAvailable(kTestUser);
-    service->RegisterForPolicyWithAccountId(kTestUser, account_info.gaia,
+    service->RegisterForPolicyWithAccountId(kTestUser, account_info.account_id,
                                             callback);
     ASSERT_TRUE(IsRequestActive());
   }
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 7dcd833d..49a85076 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -5780,10 +5780,8 @@
 class PolicyTestWithRealTimeUrlLookupFetchAllowList : public PolicyTest {
  public:
   PolicyTestWithRealTimeUrlLookupFetchAllowList() {
-    feature_list_.InitWithFeatures(
-        {safe_browsing::kRealTimeUrlLookupEnabled,
-         safe_browsing::kRealTimeUrlLookupFetchAllowlist},
-        {});
+    feature_list_.InitWithFeatures({safe_browsing::kRealTimeUrlLookupEnabled},
+                                   {});
   }
 
  private:
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 8a90ffb..0a619ade 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -206,8 +206,6 @@
   }
 
   DCHECK(prerender_manager);
-  registry_.AddInterface(base::Bind(
-      &PrerenderContents::OnPrerenderCancelerReceiver, base::Unretained(this)));
 }
 
 bool PrerenderContents::Init() {
@@ -510,13 +508,6 @@
   Destroy(FINAL_STATUS_RENDERER_CRASHED);
 }
 
-void PrerenderContents::OnInterfaceRequestFromFrame(
-    content::RenderFrameHost* render_frame_host,
-    const std::string& interface_name,
-    mojo::ScopedMessagePipeHandle* interface_pipe) {
-  registry_.TryBindInterface(interface_name, interface_pipe);
-}
-
 void PrerenderContents::RenderFrameCreated(
     content::RenderFrameHost* render_frame_host) {
   // When a new RenderFrame is created for a prerendering WebContents, tell the
diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h
index fe50116..cec81a38 100644
--- a/chrome/browser/prerender/prerender_contents.h
+++ b/chrome/browser/prerender/prerender_contents.h
@@ -28,7 +28,6 @@
 #include "content/public/common/referrer.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
-#include "services/service_manager/public/cpp/binder_registry.h"
 #include "ui/gfx/geometry/rect.h"
 #include "url/origin.h"
 
@@ -184,10 +183,6 @@
       content::NavigationHandle* navigation_handle) override;
 
   void RenderProcessGone(base::TerminationStatus status) override;
-  void OnInterfaceRequestFromFrame(
-      content::RenderFrameHost* render_frame_host,
-      const std::string& interface_name,
-      mojo::ScopedMessagePipeHandle* interface_pipe) override;
 
   // content::NotificationObserver
   void Observe(int type,
@@ -238,6 +233,9 @@
   // Running byte count. Increased when each resource completes loading.
   int64_t network_bytes() { return network_bytes_; }
 
+  void OnPrerenderCancelerReceiver(
+      mojo::PendingReceiver<chrome::mojom::PrerenderCanceler> receiver);
+
  protected:
   PrerenderContents(PrerenderManager* prerender_manager,
                     Profile* profile,
@@ -299,9 +297,6 @@
   void CancelPrerenderForUnsupportedScheme(const GURL& url) override;
   void CancelPrerenderForSyncDeferredRedirect() override;
 
-  void OnPrerenderCancelerReceiver(
-      mojo::PendingReceiver<chrome::mojom::PrerenderCanceler> receiver);
-
   mojo::Receiver<chrome::mojom::PrerenderCanceler> prerender_canceler_receiver_{
       this};
 
@@ -364,8 +359,6 @@
   // transferred over the network for resources.  Updated with AddNetworkBytes.
   int64_t network_bytes_;
 
-  service_manager::BinderRegistry registry_;
-
   base::WeakPtrFactory<PrerenderContents> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(PrerenderContents);
diff --git a/chrome/browser/profiles/profile_downloader_unittest.cc b/chrome/browser/profiles/profile_downloader_unittest.cc
index 6f78d3e..41d20dd 100644
--- a/chrome/browser/profiles/profile_downloader_unittest.cc
+++ b/chrome/browser/profiles/profile_downloader_unittest.cc
@@ -92,7 +92,7 @@
   ProfileDownloader profile_downloader_;
 
   base::OnceClosure on_access_token_request_callback_;
-  std::string account_id_for_access_token_request_;
+  CoreAccountId account_id_for_access_token_request_;
 };
 
 TEST_F(ProfileDownloaderTest, FetchAccessToken) {
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index d5a50ac..59e04c00 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -1151,8 +1151,9 @@
 
 /** @param {!AutocompleteResult} result */
 function onQueryAutocompleteDone(result) {
+  const realboxEl = $(IDS.REALBOX);
   if (result.status === AutocompleteResultStatus.SKIPPED ||
-      result.input !== lastOutput.text) {
+      result.input !== realboxEl.value) {
     return;  // Stale or skipped result; ignore.
   }
 
@@ -1245,9 +1246,8 @@
   if (!realboxWrapper.contains(relatedTarget)) {
     setRealboxMatchesVisible(false);
     // Note: intentionally leaving keydown listening (see
-    // onRealboxWrapperKeydown) and match data intact.
-    window.chrome.embeddedSearch.searchBox.stopAutocomplete(
-        /*clearResult=*/ true);
+    // onRealboxWrapperKeydown) intact.
+    setAutocompleteMatches([]);
 
     // Clear the input if it was empty when displaying the matches.
     if (lastInput === '') {
@@ -1258,8 +1258,6 @@
 
 /** @param {Event} e */
 function onRealboxWrapperKeydown(e) {
-  assert(autocompleteMatches.length > 0);
-
   const key = e.key;
 
   const realboxEl = $(IDS.REALBOX);
@@ -1290,27 +1288,12 @@
 
   const realboxMatchesEl = $(IDS.REALBOX_MATCHES);
   const matchEls = Array.from(realboxMatchesEl.children);
+  assert(matchEls.length > 0);
   const selected = matchEls.findIndex(matchEl => {
     return matchEl.classList.contains(CLASSES.SELECTED);
   });
 
-  if (key === 'Delete') {
-    if (e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
-      const selectedMatch = autocompleteMatches[selected];
-      if (selectedMatch && selectedMatch.supportsDeletion) {
-        window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch(
-            selected);
-        e.preventDefault();
-      }
-    }
-    return;
-  }
-
-  const hasMods = e.altKey || e.ctrlKey || e.metaKey || e.shiftKey;
-  if (hasMods && key !== 'Enter') {
-    return;
-  }
-
+  // Enter should work whether or not matches are visible.
   if (key === 'Enter') {
     if (matchEls[selected] && matchEls.concat(realboxEl).includes(e.target)) {
       // Note: dispatching a MouseEvent here instead of using e.g. .click() as
@@ -1324,12 +1307,34 @@
 
   if (!areRealboxMatchesVisible()) {
     if (key === 'ArrowUp' || key === 'ArrowDown') {
-      setRealboxMatchesVisible(true);
+      const realboxValue = $(IDS.REALBOX).value;
+      if (realboxValue.trim()) {
+        queryAutocomplete(realboxValue);
+      }
       e.preventDefault();
     }
     return;
   }
 
+  // If the matches are visible, the autocomplete results must also be intact.
+  assert(autocompleteMatches.length === matchEls.length);
+
+  if (key === 'Delete') {
+    if (e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
+      const selectedMatch = autocompleteMatches[selected];
+      if (selectedMatch && selectedMatch.supportsDeletion) {
+        window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch(
+            selected);
+        e.preventDefault();
+      }
+    }
+    return;
+  }
+
+  if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
+    return;
+  }
+
   if (key === 'Escape' && selected === 0) {
     updateRealboxOutput({inline: '', text: ''});
     setRealboxMatchesVisible(false);
@@ -1805,6 +1810,10 @@
 /** @param {!Array<!AutocompleteMatch>} matches */
 function setAutocompleteMatches(matches) {
   autocompleteMatches = matches;
+  if (matches.length === 0) {
+    window.chrome.embeddedSearch.searchBox.stopAutocomplete(
+        /*clearResult=*/ true);
+  }
 }
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.html b/chrome/browser/resources/settings/chromeos/os_settings.html
index d006dbf..bea1081d 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings.html
@@ -7,24 +7,14 @@
 <if expr="not optimize_webui">
   <base href="chrome://os-settings">
 </if>
-  <link rel="stylesheet" href="chrome://resources/css/md_colors.css">
+  <link rel="stylesheet" href="chrome://resources/css/cros_colors.css">
   <style>
     html {
-      background-color: #fff;
+      background-color: var(--cros-default-bg-color);
       overflow: hidden;
       /* Remove 300ms delay for 'click' event, when using touch interface. */
       touch-action: manipulation;
     }
-
-    html.loading::before {
-      /* TODO(hsuregan): update for dark mode when needed. */
-      background-color: #fff;
-      border-bottom: var(--md-toolbar-border);
-      box-sizing: border-box;
-      content: '';
-      display: block;
-      height: var(--md-toolbar-height);
-    }
   </style>
 </head>
 <body>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
index 5d624dd2..50e60a4 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
@@ -40,18 +40,13 @@
       os-toolbar {
         @apply --layout-center;
         /* TODO(hsuregan): update for dark mode when needed. */
-        background-color: white;
-        color: var(--cr-secondary-text-color);
         min-height: 56px;
         z-index: 2;
-        --cr-toolbar-search-field-background: var(--google-grey-refresh-100);
-        --cr-toolbar-search-field-border-radius: 4px;
-        --cr-toolbar-search-field-input-color: var(--google-grey-refresh-700);
       }
 
       cr-drawer {
         --cr-separator-line: none;
-        --cr-drawer-header-color: var(--google-grey-refresh-700);
+        --cr-drawer-header-color: var(--cros-default-text-color-secondary);
         --cr-drawer-header-font-weight: 500;
         --cr-drawer-header-padding: 20px;
       }
diff --git a/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.html b/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.html
index 2313c6e..12f38782 100644
--- a/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.html
+++ b/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.html
@@ -12,9 +12,14 @@
   <template>
     <style include="cr-icons cr-hidden-style">
       :host {
+        --cr-toolbar-search-field-background:
+            var(--cros-default-toolbar-search-bg-color);
+        --cr-toolbar-search-field-border-radius: 4px;
+        --cr-toolbar-search-field-input-color:
+            var(--cros-default-text-color-secondary);
         align-items: center;
-        background-color: var(--google-blue-700);
-        color: #fff;
+        background-color: var(--cros-default-toolbar-bg-color);
+        color: var(--cros-default-text-color-secondary);
         display: flex;
         height: var(--cr-toolbar-height);
       }
diff --git a/chrome/browser/safe_browsing/advanced_protection_status_manager_unittest.cc b/chrome/browser/safe_browsing/advanced_protection_status_manager_unittest.cc
index d096177..bf73739 100644
--- a/chrome/browser/safe_browsing/advanced_protection_status_manager_unittest.cc
+++ b/chrome/browser/safe_browsing/advanced_protection_status_manager_unittest.cc
@@ -51,8 +51,8 @@
       : identity_test_env_(/*test_url_loader_factory=*/nullptr,
                            &pref_service_) {}
 
-  std::string SignIn(const std::string& email,
-                     bool is_under_advanced_protection) {
+  CoreAccountId SignIn(const std::string& email,
+                       bool is_under_advanced_protection) {
     AccountInfo account_info = identity_test_env_.MakeAccountAvailable(email);
 
     account_info.is_under_advanced_protection = is_under_advanced_protection;
@@ -62,7 +62,7 @@
     return account_info.account_id;
   }
 
-  void MakeOAuthTokenFetchSucceed(const std::string& account_id,
+  void MakeOAuthTokenFetchSucceed(const CoreAccountId& account_id,
                                   bool is_under_advanced_protection) {
     identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
         account_id, "access_token",
@@ -71,7 +71,7 @@
                                      : kIdTokenAdvancedProtectionDisabled);
   }
 
-  void MakeOAuthTokenFetchFail(const std::string& account_id,
+  void MakeOAuthTokenFetchFail(const CoreAccountId& account_id,
                                bool is_transient_error) {
     identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
         account_id,
@@ -111,8 +111,8 @@
 
   // Simulates the situation where user signed in long time ago, thus
   // has no advanced protection status.
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ false);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ false);
   AdvancedProtectionStatusManager aps_manager(
       &pref_service_, identity_test_env_.identity_manager(),
       base::TimeDelta() /*no min delay*/);
@@ -142,8 +142,8 @@
   base::HistogramTester histograms;
   // Simulates the situation where user signed in long time ago, thus
   // has no advanced protection status.
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ false);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ false);
   AdvancedProtectionStatusManager aps_manager(
       &pref_service_, identity_test_env_.identity_manager(),
       base::TimeDelta() /*no min delay*/);
@@ -173,8 +173,8 @@
   base::HistogramTester histograms;
   // Simulates the situation where user signed in long time ago, thus
   // has no advanced protection status.
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ false);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ false);
   AdvancedProtectionStatusManager aps_manager(
       &pref_service_, identity_test_env_.identity_manager(),
       base::TimeDelta() /*no min delay*/);
@@ -201,8 +201,8 @@
 TEST_F(AdvancedProtectionStatusManagerTest, SignedInLongTimeAgoUnderAP) {
   // Simulates the situation where user signed in long time ago, thus
   // has no advanced protection status yet.
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ false);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ false);
   AdvancedProtectionStatusManager aps_manager(
       &pref_service_, identity_test_env_.identity_manager(),
       base::TimeDelta() /*no min delay*/);
@@ -226,8 +226,8 @@
 
   // Simulates the situation where the user has already signed in and is
   // under advanced protection.
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ true);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ true);
   AdvancedProtectionStatusManager aps_manager(
       &pref_service_, identity_test_env_.identity_manager(),
       base::TimeDelta() /*no min delay*/);
@@ -246,8 +246,8 @@
 
   // Simulates the situation where the user has already signed in and is
   // NOT under advanced protection.
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ false);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ false);
   AdvancedProtectionStatusManager aps_manager(
       &pref_service_, identity_test_env_.identity_manager(),
       base::TimeDelta() /*no min delay*/);
@@ -264,8 +264,8 @@
       prefs::kAdvancedProtectionLastRefreshInUs,
       last_update.ToDeltaSinceWindowsEpoch().InMicroseconds());
 
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ true);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ true);
   AdvancedProtectionStatusManager aps_manager(
       &pref_service_, identity_test_env_.identity_manager(),
       base::TimeDelta() /*no min delay*/);
@@ -312,8 +312,8 @@
   ASSERT_FALSE(aps_manager.is_under_advanced_protection());
   ASSERT_TRUE(aps_manager.GetUnconsentedPrimaryAccountId().empty());
 
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ false);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ false);
   EXPECT_FALSE(aps_manager.is_under_advanced_protection());
   EXPECT_FALSE(aps_manager.IsRefreshScheduled());
 
@@ -347,8 +347,8 @@
   // There is no account, so the timer should not run at startup.
   EXPECT_FALSE(aps_manager.IsRefreshScheduled());
 
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ true);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ true);
 
   // Now that we've signed into Advanced Protection, we should have a scheduled
   // refresh.
@@ -368,8 +368,8 @@
 
 TEST_F(AdvancedProtectionStatusManagerTest,
        StartupAfterLongWaitRefreshesImmediately) {
-  std::string account_id = SignIn("test@test.com",
-                                  /* is_under_advanced_protection = */ true);
+  CoreAccountId account_id = SignIn("test@test.com",
+                                    /* is_under_advanced_protection = */ true);
   base::RunLoop().RunUntilIdle();
 
   base::Time last_refresh_time =
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
index 2544670..9430294 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -176,7 +176,7 @@
   }
   void SetAccountInfo(const std::string& username) {
     AccountInfo account_info;
-    account_info.account_id = "account_id";
+    account_info.account_id = CoreAccountId("account_id");
     account_info.email = username;
     account_info.gaia = "gaia";
     account_info_ = account_info;
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc
index 869641b..1613d897 100644
--- a/chrome/browser/search/instant_service.cc
+++ b/chrome/browser/search/instant_service.cc
@@ -446,6 +446,7 @@
     const std::string& attribution_line_2,
     const GURL& action_url,
     const std::string& collection_id) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   bool is_backdrop_collection =
       background_service_ &&
       background_service_->IsValidBackdropCollection(collection_id);
@@ -548,6 +549,7 @@
       image.image_url, attribution1, attribution2, image.attribution_action_url,
       image.collection_id, resume_token, timestamp);
 
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   pref_service_->Set(prefs::kNtpCustomBackgroundDict, background_info);
 }
 
@@ -775,6 +777,7 @@
 }
 
 void InstantService::ApplyCustomBackgroundThemeInfo() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   const base::DictionaryValue* background_info =
       pref_service_->GetDictionary(prefs::kNtpCustomBackgroundDict);
   GURL custom_background_url(
@@ -822,6 +825,7 @@
 }
 
 void InstantService::ResetCustomBackgroundThemeInfo() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   pref_service_->ClearPref(prefs::kNtpCustomBackgroundDict);
   pref_service_->SetBoolean(prefs::kNtpCustomBackgroundLocalToDevice, false);
   RemoveLocalBackgroundImageCopy();
@@ -915,6 +919,7 @@
 }
 
 bool InstantService::IsCustomBackgroundPrefValid(GURL& custom_background_url) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   const base::DictionaryValue* background_info =
       profile_->GetPrefs()->GetDictionary(prefs::kNtpCustomBackgroundDict);
   if (!background_info)
@@ -966,14 +971,13 @@
 void InstantService::UpdateCustomBackgroundPrefsWithColor(
     base::TimeTicks timestamp,
     SkColor color) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   // Update background color only if the selected background is still the same.
   const base::DictionaryValue* background_info =
       pref_service_->GetDictionary(prefs::kNtpCustomBackgroundDict);
   if (!background_info)
     return;
 
-  GURL current_bg_url(
-      background_info->FindKey(kNtpCustomBackgroundURL)->GetString());
   if (timestamp == background_updated_timestamp_) {
     pref_service_->Set(prefs::kNtpCustomBackgroundDict,
                        GetBackgroundInfoWithColor(background_info, color));
@@ -981,6 +985,7 @@
 }
 
 void InstantService::RefreshBackgroundIfNeeded() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   const base::DictionaryValue* background_info =
       profile_->GetPrefs()->GetDictionary(prefs::kNtpCustomBackgroundDict);
   int64_t refresh_timestamp = 0;
diff --git a/chrome/browser/sharing/sharing_device_registration.cc b/chrome/browser/sharing/sharing_device_registration.cc
index 0348b9b..da5b6c45 100644
--- a/chrome/browser/sharing/sharing_device_registration.cc
+++ b/chrome/browser/sharing/sharing_device_registration.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/sharing/sharing_sync_preference.h"
 #include "chrome/browser/sharing/sms/sms_flags.h"
 #include "chrome/browser/sharing/vapid_key_manager.h"
+#include "chrome/browser/sharing/webrtc/webrtc_flags.h"
 #include "chrome/common/pref_names.h"
 #include "components/gcm_driver/crypto/p256_key_util.h"
 #include "components/gcm_driver/instance_id/instance_id_driver.h"
@@ -204,6 +205,8 @@
     enabled_features.insert(SharingSpecificFields::SMS_FETCHER);
   if (IsRemoteCopySupported())
     enabled_features.insert(SharingSpecificFields::REMOTE_COPY);
+  if (IsPeerConnectionSupported())
+    enabled_features.insert(SharingSpecificFields::PEER_CONNECTION);
 
   return enabled_features;
 }
@@ -245,6 +248,10 @@
   return false;
 }
 
+bool SharingDeviceRegistration::IsPeerConnectionSupported() const {
+  return base::FeatureList::IsEnabled(kSharingPeerConnectionReceiver);
+}
+
 void SharingDeviceRegistration::SetEnabledFeaturesForTesting(
     std::set<SharingSpecificFields::EnabledFeatures> enabled_features) {
   enabled_features_testing_value_ = std::move(enabled_features);
diff --git a/chrome/browser/sharing/sharing_device_registration.h b/chrome/browser/sharing/sharing_device_registration.h
index 719bd248..70730d9a 100644
--- a/chrome/browser/sharing/sharing_device_registration.h
+++ b/chrome/browser/sharing/sharing_device_registration.h
@@ -57,6 +57,9 @@
   // Returns if device can handle receiving of remote copy contents.
   virtual bool IsRemoteCopySupported() const;
 
+  // Returns if device can handle an incoming webrtc peer connection request.
+  bool IsPeerConnectionSupported() const;
+
   // For testing
   void SetEnabledFeaturesForTesting(
       std::set<sync_pb::SharingSpecificFields_EnabledFeatures>
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index 3084b65..e03f0c16 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -24,6 +24,7 @@
 #include "chrome/browser/signin/account_reconcilor_factory.h"
 #include "chrome/browser/signin/chrome_signin_client.h"
 #include "chrome/browser/signin/chrome_signin_client_factory.h"
+#include "chrome/browser/signin/cookie_reminter_factory.h"
 #include "chrome/browser/signin/dice_response_handler.h"
 #include "chrome/browser/signin/dice_tab_helper.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
@@ -34,6 +35,7 @@
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "chrome/common/url_constants.h"
 #include "components/signin/core/browser/account_reconcilor.h"
+#include "components/signin/core/browser/cookie_reminter.h"
 #include "components/signin/public/base/account_consistency_method.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -226,7 +228,6 @@
     // invalid, so that if/when this account is re-authenticated, we can force a
     // reconciliation for this account instead of treating it as a no-op.
     // See https://crbug.com/1012649 for details.
-
     signin::IdentityManager* const identity_manager =
         IdentityManagerFactory::GetForProfile(profile);
     base::Optional<AccountInfo> maybe_account_info =
@@ -234,7 +235,9 @@
             ->FindExtendedAccountInfoForAccountWithRefreshTokenByEmailAddress(
                 manage_accounts_params.email);
     if (maybe_account_info.has_value()) {
-      account_reconcilor->ForceCookieRemintingOnNextTokenUpdate(
+      CookieReminter* const cookie_reminter =
+          CookieReminterFactory::GetForProfile(profile);
+      cookie_reminter->ForceCookieRemintingOnNextTokenUpdate(
           maybe_account_info.value());
     }
 
diff --git a/chrome/browser/signin/cookie_reminter_factory.cc b/chrome/browser/signin/cookie_reminter_factory.cc
new file mode 100644
index 0000000..f53de57d
--- /dev/null
+++ b/chrome/browser/signin/cookie_reminter_factory.cc
@@ -0,0 +1,37 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/signin/cookie_reminter_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/signin/core/browser/cookie_reminter.h"
+
+CookieReminterFactory::CookieReminterFactory()
+    : BrowserContextKeyedServiceFactory(
+          "CookieReminter",
+          BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(IdentityManagerFactory::GetInstance());
+}
+
+CookieReminterFactory::~CookieReminterFactory() {}
+
+// static
+CookieReminter* CookieReminterFactory::GetForProfile(Profile* profile) {
+  return static_cast<CookieReminter*>(
+      GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+// static
+CookieReminterFactory* CookieReminterFactory::GetInstance() {
+  return base::Singleton<CookieReminterFactory>::get();
+}
+
+KeyedService* CookieReminterFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  Profile* profile = Profile::FromBrowserContext(context);
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile);
+  return new CookieReminter(identity_manager);
+}
diff --git a/chrome/browser/signin/cookie_reminter_factory.h b/chrome/browser/signin/cookie_reminter_factory.h
new file mode 100644
index 0000000..f9d88c1
--- /dev/null
+++ b/chrome/browser/signin/cookie_reminter_factory.h
@@ -0,0 +1,32 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SIGNIN_COOKIE_REMINTER_FACTORY_H_
+#define CHROME_BROWSER_SIGNIN_COOKIE_REMINTER_FACTORY_H_
+
+#include <memory>
+
+#include "base/memory/singleton.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class CookieReminter;
+class Profile;
+
+class CookieReminterFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  static CookieReminter* GetForProfile(Profile* profile);
+  static CookieReminterFactory* GetInstance();
+
+ private:
+  friend struct base::DefaultSingletonTraits<CookieReminterFactory>;
+
+  CookieReminterFactory();
+  ~CookieReminterFactory() override;
+
+  // BrowserContextKeyedServiceFactory:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* profile) const override;
+};
+
+#endif  // CHROME_BROWSER_SIGNIN_COOKIE_REMINTER_FACTORY_H_
diff --git a/chrome/browser/signin/dice_browsertest.cc b/chrome/browser/signin/dice_browsertest.cc
index f51d5e5..4977508 100644
--- a/chrome/browser/signin/dice_browsertest.cc
+++ b/chrome/browser/signin/dice_browsertest.cc
@@ -366,14 +366,14 @@
 
   // Returns the account ID associated with |main_email_| and its associated
   // gaia ID.
-  std::string GetMainAccountID() {
+  CoreAccountId GetMainAccountID() {
     return GetIdentityManager()->PickAccountIdForAccount(
         signin::GetTestGaiaIdForEmail(main_email_), main_email_);
   }
 
   // Returns the account ID associated with kSecondaryEmail and its associated
   // gaia ID.
-  std::string GetSecondaryAccountID() {
+  CoreAccountId GetSecondaryAccountID() {
     return GetIdentityManager()->PickAccountIdForAccount(
         signin::GetTestGaiaIdForEmail(kSecondaryEmail), kSecondaryEmail);
   }
diff --git a/chrome/browser/signin/dice_response_handler_unittest.cc b/chrome/browser/signin/dice_response_handler_unittest.cc
index 322e831..8ae4b89e 100644
--- a/chrome/browser/signin/dice_response_handler_unittest.cc
+++ b/chrome/browser/signin/dice_response_handler_unittest.cc
@@ -82,7 +82,7 @@
                                 public AccountReconcilor::Observer {
  public:
   // Called after the refresh token was fetched and added in the token service.
-  void EnableSync(const std::string& account_id) {
+  void EnableSync(const CoreAccountId& account_id) {
     enable_sync_account_id_ = account_id;
   }
 
@@ -190,7 +190,7 @@
   std::unique_ptr<DiceResponseHandler> dice_response_handler_;
   int reconcilor_blocked_count_;
   int reconcilor_unblocked_count_;
-  std::string enable_sync_account_id_;
+  CoreAccountId enable_sync_account_id_;
   GoogleServiceAuthError auth_error_;
   std::string auth_error_email_;
 };
@@ -222,7 +222,7 @@
   InitializeDiceResponseHandler(signin::AccountConsistencyMethod::kDice);
   DiceResponseParams dice_params = MakeDiceParams(DiceAction::SIGNIN);
   const auto& account_info = dice_params.signin_info->account_info;
-  std::string account_id = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id = identity_manager()->PickAccountIdForAccount(
       account_info.gaia_id, account_info.email);
   EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id));
   dice_response_handler_->ProcessDiceHeader(
@@ -257,7 +257,7 @@
   InitializeDiceResponseHandler(signin::AccountConsistencyMethod::kDice);
   DiceResponseParams dice_params = MakeDiceParams(DiceAction::SIGNIN);
   const auto& account_info = dice_params.signin_info->account_info;
-  std::string account_id = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id = identity_manager()->PickAccountIdForAccount(
       account_info.gaia_id, account_info.email);
   EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id));
   dice_response_handler_->ProcessDiceHeader(
@@ -285,7 +285,7 @@
   InitializeDiceResponseHandler(signin::AccountConsistencyMethod::kDice);
   DiceResponseParams dice_params = MakeDiceParams(DiceAction::SIGNIN);
   const auto& account_info = dice_params.signin_info->account_info;
-  std::string account_id = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id = identity_manager()->PickAccountIdForAccount(
       account_info.gaia_id, account_info.email);
   ASSERT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id));
   dice_response_handler_->ProcessDiceHeader(
@@ -322,9 +322,9 @@
   dice_params_2.signin_info->account_info.email = "other_email";
   dice_params_2.signin_info->account_info.gaia_id = "other_gaia_id";
   const auto& account_info_2 = dice_params_2.signin_info->account_info;
-  std::string account_id_1 = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id_1 = identity_manager()->PickAccountIdForAccount(
       account_info_1.gaia_id, account_info_1.email);
-  std::string account_id_2 = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id_2 = identity_manager()->PickAccountIdForAccount(
       account_info_2.gaia_id, account_info_2.email);
   ASSERT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id_1));
   ASSERT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id_2));
@@ -376,7 +376,7 @@
   InitializeDiceResponseHandler(signin::AccountConsistencyMethod::kDice);
   DiceResponseParams dice_params = MakeDiceParams(DiceAction::SIGNIN);
   const auto& account_info = dice_params.signin_info->account_info;
-  std::string account_id = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id = identity_manager()->PickAccountIdForAccount(
       account_info.gaia_id, account_info.email);
   ASSERT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id));
   dice_response_handler_->ProcessDiceHeader(
@@ -391,7 +391,7 @@
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(account_id));
   // Check that delegate was not called to enable sync.
-  EXPECT_EQ("", enable_sync_account_id_);
+  EXPECT_TRUE(enable_sync_account_id_.empty());
 
   // Enable sync.
   dice_response_handler_->ProcessDiceHeader(
@@ -408,7 +408,7 @@
   InitializeDiceResponseHandler(signin::AccountConsistencyMethod::kDice);
   DiceResponseParams dice_params = MakeDiceParams(DiceAction::SIGNIN);
   const auto& account_info = dice_params.signin_info->account_info;
-  std::string account_id = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id = identity_manager()->PickAccountIdForAccount(
       account_info.gaia_id, account_info.email);
   ASSERT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id));
   dice_response_handler_->ProcessDiceHeader(
@@ -422,7 +422,7 @@
       MakeDiceParams(DiceAction::ENABLE_SYNC),
       std::make_unique<TestProcessDiceHeaderDelegate>(this));
   // Check that delegate was not called to enable sync.
-  EXPECT_EQ("", enable_sync_account_id_);
+  EXPECT_TRUE(enable_sync_account_id_.empty());
 
   // Simulate GaiaAuthFetcher success.
   consumer->OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
@@ -438,7 +438,7 @@
   InitializeDiceResponseHandler(signin::AccountConsistencyMethod::kDice);
   DiceResponseParams dice_params = MakeDiceParams(DiceAction::SIGNIN);
   const auto& account_info = dice_params.signin_info->account_info;
-  std::string account_id = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id = identity_manager()->PickAccountIdForAccount(
       account_info.gaia_id, account_info.email);
   ASSERT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id));
   dice_response_handler_->ProcessDiceHeader(
@@ -652,9 +652,9 @@
   signin_params_2.signin_info->account_info.gaia_id = "other_gaia_id";
   const auto& signin_account_info_1 = signin_params_1.signin_info->account_info;
   const auto& signin_account_info_2 = signin_params_2.signin_info->account_info;
-  std::string account_id_1 = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id_1 = identity_manager()->PickAccountIdForAccount(
       signin_account_info_1.gaia_id, signin_account_info_1.email);
-  std::string account_id_2 = identity_manager()->PickAccountIdForAccount(
+  CoreAccountId account_id_2 = identity_manager()->PickAccountIdForAccount(
       signin_account_info_2.gaia_id, signin_account_info_2.email);
   dice_response_handler_->ProcessDiceHeader(
       signin_params_1, std::make_unique<TestProcessDiceHeaderDelegate>(this));
diff --git a/chrome/browser/signin/signin_global_error_unittest.cc b/chrome/browser/signin/signin_global_error_unittest.cc
index 07859797..3b0cd16 100644
--- a/chrome/browser/signin/signin_global_error_unittest.cc
+++ b/chrome/browser/signin/signin_global_error_unittest.cc
@@ -82,7 +82,7 @@
   void SetAuthError(GoogleServiceAuthError::State state) {
     signin::IdentityTestEnvironment* identity_test_env =
         identity_test_env_profile_adaptor_->identity_test_env();
-    std::string primary_account_id =
+    CoreAccountId primary_account_id =
         identity_test_env->identity_manager()->GetPrimaryAccountId();
 
     signin::UpdatePersistentErrorOfRefreshTokenForAccount(
diff --git a/chrome/browser/signin/signin_profile_attributes_updater_unittest.cc b/chrome/browser/signin/signin_profile_attributes_updater_unittest.cc
index ae9bf9c..909d78d 100644
--- a/chrome/browser/signin/signin_profile_attributes_updater_unittest.cc
+++ b/chrome/browser/signin/signin_profile_attributes_updater_unittest.cc
@@ -124,7 +124,7 @@
   ASSERT_TRUE(profile_manager_.profile_attributes_storage()
                   ->GetProfileAttributesWithPath(profile_->GetPath(), &entry));
 
-  std::string account_id =
+  CoreAccountId account_id =
       identity_test_env_.MakePrimaryAccountAvailable(kEmail).account_id;
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/signin/signin_ui_util_unittest.cc b/chrome/browser/signin/signin_ui_util_unittest.cc
index 9ba4169..616f87d 100644
--- a/chrome/browser/signin/signin_ui_util_unittest.cc
+++ b/chrome/browser/signin/signin_ui_util_unittest.cc
@@ -273,7 +273,7 @@
 };
 
 TEST_F(DiceSigninUiUtilTest, EnableSyncWithExistingAccount) {
-  std::string account_id =
+  CoreAccountId account_id =
       GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount(
           kMainGaiaID, kMainEmail, "refresh_token", false,
           signin_metrics::SourceForRefreshTokenOperation::kUnknown);
@@ -327,7 +327,7 @@
 
 TEST_F(DiceSigninUiUtilTest, EnableSyncWithAccountThatNeedsReauth) {
   AddTab(browser(), GURL("http://example.com"));
-  std::string account_id =
+  CoreAccountId account_id =
       GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount(
           kMainGaiaID, kMainEmail, "refresh_token", false,
           signin_metrics::SourceForRefreshTokenOperation::kUnknown);
diff --git a/chrome/browser/sync/sync_ui_util_unittest.cc b/chrome/browser/sync/sync_ui_util_unittest.cc
index 8328d74a..62258b3 100644
--- a/chrome/browser/sync/sync_ui_util_unittest.cc
+++ b/chrome/browser/sync/sync_ui_util_unittest.cc
@@ -65,7 +65,7 @@
       service->SetDetailedSyncStatus(false, syncer::SyncStatus());
 
       // Make sure to fail authentication with an error in this case.
-      std::string account_id =
+      CoreAccountId account_id =
           test_environment->identity_manager()->GetPrimaryAccountId();
       test_environment->SetRefreshTokenForPrimaryAccount();
       service->SetAuthenticatedAccountInfo(
diff --git a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
index 1399524..cb8eecac 100644
--- a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
@@ -186,7 +186,7 @@
   // Simulates receiving list of accounts in the cookie jar from ListAccounts
   // endpoint. Adds |account_ids| into signed in accounts, notifies
   // ProfileSyncService and waits for change to propagate to sync engine.
-  void UpdateCookieJarAccountsAndWait(std::vector<std::string> account_ids,
+  void UpdateCookieJarAccountsAndWait(std::vector<CoreAccountId> account_ids,
                                       bool expected_cookie_jar_mismatch) {
     std::vector<gaia::ListedAccount> accounts;
     for (const auto& account_id : account_ids) {
diff --git a/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc b/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
index 318e8bb..a5c6d4f4 100644
--- a/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
@@ -25,13 +25,13 @@
 
 namespace {
 
-std::string GetAccountId() {
+CoreAccountId GetAccountId() {
 #if defined(OS_CHROMEOS)
   // TODO(vitaliii): Unify the two, because it takes ages to debug and
   // impossible to discover otherwise.
-  return "user@gmail.com";
+  return CoreAccountId("user@gmail.com");
 #else
-  return "gaia_id_for_user_gmail.com";
+  return CoreAccountId("gaia_id_for_user_gmail.com");
 #endif
 }
 
@@ -114,7 +114,7 @@
       ConsentAuditorFactory::GetForProfile(GetProfile(0));
   UserConsentSpecifics specifics;
   specifics.mutable_sync_consent()->set_confirmation_grd_id(1);
-  specifics.set_account_id(GetAccountId());
+  specifics.set_account_id(GetAccountId().id);
 
   SyncConsent sync_consent;
   sync_consent.set_confirmation_grd_id(1);
@@ -131,7 +131,7 @@
   specifics.mutable_sync_consent()->set_confirmation_grd_id(1);
   // Account id may be compared to the synced account, thus, we need them to
   // match.
-  specifics.set_account_id(GetAccountId());
+  specifics.set_account_id(GetAccountId().id);
 
   ASSERT_TRUE(SetupSync());
   consent_auditor::ConsentAuditor* consent_service =
@@ -159,10 +159,10 @@
 
   UserConsentSpecifics specifics1;
   *specifics1.mutable_sync_consent() = consent1;
-  specifics1.set_account_id(GetAccountId());
+  specifics1.set_account_id(GetAccountId().id);
   UserConsentSpecifics specifics2;
   *specifics2.mutable_sync_consent() = consent2;
-  specifics2.set_account_id(GetAccountId());
+  specifics2.set_account_id(GetAccountId().id);
 
   // Set up the clients (profiles), but do *not* set up Sync yet.
   ASSERT_TRUE(SetupClients());
@@ -214,7 +214,7 @@
   expected_sync_consent->set_status(UserConsentTypes::GIVEN);
   // Account id may be compared to the synced account, thus, we need them to
   // match.
-  specifics.set_account_id(GetAccountId());
+  specifics.set_account_id(GetAccountId().id);
   EXPECT_TRUE(ExpectUserConsents({specifics}));
 }
 #endif  // !defined(OS_CHROMEOS)
diff --git a/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc b/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc
index 58af62a..dccf7ccc 100644
--- a/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc
+++ b/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc
@@ -108,7 +108,7 @@
 
     std::unique_ptr<drive::FakeDriveService> drive_service(
         new drive::FakeDriveService);
-    drive_service->Initialize("test@example.com");
+    drive_service->Initialize(CoreAccountId("account_id"));
     ASSERT_TRUE(drive::test_util::SetUpTestEntries(drive_service.get()));
 
     std::unique_ptr<drive::DriveUploaderInterface> uploader(
diff --git a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_fill_button.xml b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_fill_button.xml
new file mode 100644
index 0000000..b4f79b4
--- /dev/null
+++ b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_fill_button.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 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. -->
+
+<org.chromium.ui.widget.ButtonCompat
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:descendantFocusability="blocksDescendants"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="8dp"
+    android:layout_marginBottom="16dp"
+    android:minHeight="48dp"
+    android:gravity="center"
+    android:text="@string/touch_to_fill_confirm"
+    android:background="@drawable/touch_to_fill_credential_background"
+    android:ellipsize="end"
+    android:singleLine="true"
+    style="@style/FilledButton.Flat"/>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/res/values/dimens.xml b/chrome/browser/touch_to_fill/android/internal/java/res/values/dimens.xml
index 918ec23..20f20154 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/res/values/dimens.xml
+++ b/chrome/browser/touch_to_fill/android/internal/java/res/values/dimens.xml
@@ -6,6 +6,21 @@
 <resources>
     <dimen name="touch_to_fill_favicon_size">24dp</dimen>
     <dimen name="touch_to_fill_sheet_margin">16dp</dimen>
+
+    <!-- Below are the different Half-state peeking heights. The height is the
+         sum of all components. It varies depending on the suggestion count. The
+         base height is 282dp:
+         Bottom sheet shadows and padding (18dp)
+         + Handlebar (16dp)
+         + Header size (112 dp)
+         + Title size and margin (48+16dp)
+         + First suggestion (72dp) -->
+    <!-- Base height (282dp) plus padding (8dp) plus half suggestion (36dp) -->
     <dimen name="touch_to_fill_sheet_height_multiple_credentials">326dp</dimen>
+    <!-- Base height (282dp) plus bottom padding (16dp) -->
     <dimen name="touch_to_fill_sheet_height_single_credential">298dp</dimen>
+    <!-- Base height (282dp) + confirm button with paddings (48+2*16dp) -->
+    <dimen name="touch_to_fill_sheet_height_single_credential_with_button">
+      362dp
+    </dimen>
 </resources>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java
index 83ef864..516743aa 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java
+++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java
@@ -8,6 +8,7 @@
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FAVICON;
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.FORMATTED_ORIGIN;
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER;
+import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FIELD_TRIAL_PARAM_SHOW_CONFIRMATION_BUTTON;
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL;
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE;
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ON_CLICK_MANAGE;
@@ -17,6 +18,7 @@
 import androidx.annotation.Px;
 
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.touch_to_fill.TouchToFillComponent.UserAction;
 import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties;
 import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties;
@@ -57,7 +59,6 @@
     void showCredentials(String url, boolean isOriginSecure, List<Credential> credentials) {
         assert credentials != null;
         mModel.set(ON_CLICK_MANAGE, this::onManagePasswordSelected);
-        mModel.set(VISIBLE, true);
 
         ListModel<ListItem> sheetItems = mModel.get(SHEET_ITEMS);
         sheetItems.clear();
@@ -71,18 +72,16 @@
 
         mCredentials = credentials;
         for (Credential credential : credentials) {
-            PropertyModel propertyModel =
-                    new PropertyModel.Builder(CredentialProperties.ALL_KEYS)
-                            .with(CREDENTIAL, credential)
-                            .with(FORMATTED_ORIGIN,
-                                    UrlFormatter.formatUrlForDisplayOmitScheme(
-                                            credential.getOriginUrl()))
-                            .with(ON_CLICK_LISTENER, this::onSelectedCredential)
-                            .build();
-            sheetItems.add(new ListItem(TouchToFillProperties.ItemType.CREDENTIAL, propertyModel));
+            final PropertyModel model = createCredentialModel(credential);
+            sheetItems.add(new ListItem(TouchToFillProperties.ItemType.CREDENTIAL, model));
             mDelegate.fetchFavicon(credential.getOriginUrl(), url, mDesiredFaviconSize,
-                    (bitmap) -> propertyModel.set(FAVICON, bitmap));
+                    (bitmap) -> model.set(FAVICON, bitmap));
+            if (shouldCreateConfirmationButton(credentials)) {
+                sheetItems.add(new ListItem(TouchToFillProperties.ItemType.FILL_BUTTON,
+                        createCredentialModel(credential)));
+            }
         }
+        mModel.set(VISIBLE, true);
     }
 
     private void onSelectedCredential(Credential credential) {
@@ -116,4 +115,24 @@
                 UserAction.SELECT_MANAGE_PASSWORDS, UserAction.MAX_VALUE + 1);
         mDelegate.onManagePasswordsSelected();
     }
+
+    /**
+     * @param credentials The available credentials. Show the confirmation for a lone credential.
+     * @return True if a confirmation button should be shown at the end of the bottom sheet.
+     */
+    private boolean shouldCreateConfirmationButton(List<Credential> credentials) {
+        return credentials.size() == 1
+                && ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
+                        ChromeFeatureList.TOUCH_TO_FILL_ANDROID,
+                        FIELD_TRIAL_PARAM_SHOW_CONFIRMATION_BUTTON, false);
+    }
+
+    private PropertyModel createCredentialModel(Credential credential) {
+        return new PropertyModel.Builder(CredentialProperties.ALL_KEYS)
+                .with(CREDENTIAL, credential)
+                .with(ON_CLICK_LISTENER, this::onSelectedCredential)
+                .with(FORMATTED_ORIGIN,
+                        UrlFormatter.formatUrlForDisplayOmitScheme(credential.getOriginUrl()))
+                .build();
+    }
 }
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillProperties.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillProperties.java
index ffd2e062..4696bd8 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillProperties.java
+++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillProperties.java
@@ -22,6 +22,8 @@
  * Properties defined here reflect the visible state of the TouchToFill-components.
  */
 class TouchToFillProperties {
+    static final String FIELD_TRIAL_PARAM_SHOW_CONFIRMATION_BUTTON = "show_confirmation_button";
+
     static final PropertyModel.WritableBooleanPropertyKey VISIBLE =
             new PropertyModel.WritableBooleanPropertyKey("visible");
     static final PropertyModel
@@ -73,7 +75,7 @@
         private HeaderProperties() {}
     }
 
-    @IntDef({ItemType.HEADER, ItemType.CREDENTIAL})
+    @IntDef({ItemType.HEADER, ItemType.CREDENTIAL, ItemType.FILL_BUTTON})
     @Retention(RetentionPolicy.SOURCE)
     @interface ItemType {
         /**
@@ -85,6 +87,11 @@
          * A section containing a user's name and password.
          */
         int CREDENTIAL = 2;
+
+        /**
+         * The fill button at the end of the sheet that filling more obvious for one suggestion.
+         */
+        int FILL_BUTTON = 3;
     }
 
     /**
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java
index 8376f57..b1086ea 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java
+++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.touch_to_fill;
 
+import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FIELD_TRIAL_PARAM_SHOW_CONFIRMATION_BUTTON;
+
 import android.content.Context;
 import android.support.annotation.DimenRes;
 import android.support.annotation.Nullable;
@@ -14,6 +16,7 @@
 import android.widget.LinearLayout;
 
 import org.chromium.base.Callback;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContent;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver;
@@ -176,9 +179,16 @@
     // TODO(crbug.com/1009331): This should add up the height of all items up to the 2nd credential.
     private @DimenRes int getDesiredSheetHeight() {
         if (mSheetItemListView.getAdapter() != null
-                && mSheetItemListView.getAdapter().getItemCount() > 2) {
+                && mSheetItemListView.getAdapter().getItemCount() > 2
+                && mSheetItemListView.getAdapter().getItemViewType(2)
+                        == TouchToFillProperties.ItemType.CREDENTIAL) {
             return R.dimen.touch_to_fill_sheet_height_multiple_credentials;
         }
+        if (ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
+                    ChromeFeatureList.TOUCH_TO_FILL_ANDROID,
+                    FIELD_TRIAL_PARAM_SHOW_CONFIRMATION_BUTTON, false)) {
+            return R.dimen.touch_to_fill_sheet_height_single_credential_with_button;
+        }
         return R.dimen.touch_to_fill_sheet_height_single_credential;
     }
 }
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java
index abac267..9f35afe 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java
+++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java
@@ -74,6 +74,9 @@
             case ItemType.CREDENTIAL:
                 return new TouchToFillViewHolder(parent, R.layout.touch_to_fill_credential_item,
                         TouchToFillViewBinder::bindCredentialView);
+            case ItemType.FILL_BUTTON:
+                return new TouchToFillViewHolder(parent, R.layout.touch_to_fill_fill_button,
+                        TouchToFillViewBinder::bindFillButtonView);
         }
         assert false : "Cannot create view for ItemType: " + itemType;
         return null;
@@ -98,7 +101,7 @@
      * @param propertyKey The key of the property to be bound
      */
     private static void bindCredentialView(
-            PropertyModel model, ViewGroup view, PropertyKey propertyKey) {
+            PropertyModel model, View view, PropertyKey propertyKey) {
         Credential credential = model.get(CREDENTIAL);
         if (propertyKey == FAVICON) {
             ImageView imageView = view.findViewById(R.id.favicon);
@@ -132,19 +135,39 @@
     }
 
     /**
+     * Called whenever a fill button for a single credential is bound to this view holder.
+     * @param model The model containing the data for the view
+     * @param view The view to be bound
+     * @param propertyKey The key of the property to be bound
+     */
+    private static void bindFillButtonView(
+            PropertyModel model, View view, PropertyKey propertyKey) {
+        Credential credential = model.get(CREDENTIAL);
+        if (propertyKey == ON_CLICK_LISTENER) {
+            view.setOnClickListener(
+                    clickedView -> { model.get(ON_CLICK_LISTENER).onResult(credential); });
+        } else if (propertyKey == FAVICON || propertyKey == FORMATTED_ORIGIN
+                || propertyKey == CREDENTIAL) {
+            // The button appearance is static.
+        } else {
+            assert false : "Unhandled update to property:" + propertyKey;
+        }
+    }
+
+    /**
      * Called whenever a property in the given model changes. It updates the given view accordingly.
      * @param model The observed {@link PropertyModel}. Its data need to be reflected in the view.
-     * @param viewGroup The {@link ViewGroup} containing the header to update.
+     * @param view The {@link View} of the header to update.
      * @param key The {@link PropertyKey} which changed.
      */
-    private static void bindHeaderView(PropertyModel model, ViewGroup viewGroup, PropertyKey key) {
+    private static void bindHeaderView(PropertyModel model, View view, PropertyKey key) {
         if (key == FORMATTED_URL || key == ORIGIN_SECURE) {
-            TextView sheetSubtitleText = viewGroup.findViewById(R.id.touch_to_fill_sheet_subtitle);
+            TextView sheetSubtitleText = view.findViewById(R.id.touch_to_fill_sheet_subtitle);
             if (model.get(ORIGIN_SECURE)) {
                 sheetSubtitleText.setText(model.get(FORMATTED_URL));
             } else {
                 sheetSubtitleText.setText(
-                        String.format(viewGroup.getContext().getString(
+                        String.format(view.getContext().getString(
                                               R.string.touch_to_fill_sheet_subtitle_not_secure),
                                 model.get(FORMATTED_URL)));
             }
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewHolder.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewHolder.java
index b1136ff..ea8f3f6d 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewHolder.java
+++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewHolder.java
@@ -7,6 +7,7 @@
 import android.support.annotation.LayoutRes;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.view.ViewGroup;
 
 import org.chromium.ui.modelutil.PropertyKey;
@@ -15,10 +16,10 @@
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor.ViewBinder;
 
 class TouchToFillViewHolder extends RecyclerView.ViewHolder {
-    final ViewBinder<PropertyModel, ViewGroup, PropertyKey> mViewBinder;
+    private final ViewBinder<PropertyModel, View, PropertyKey> mViewBinder;
 
     TouchToFillViewHolder(ViewGroup parent, @LayoutRes int layout,
-            ViewBinder<PropertyModel, ViewGroup, PropertyKey> viewBinder) {
+            ViewBinder<PropertyModel, View, PropertyKey> viewBinder) {
         super(LayoutInflater.from(parent.getContext()).inflate(layout, parent, false));
         mViewBinder = viewBinder;
     }
@@ -30,6 +31,6 @@
      * @param model The {@link PropertyModel} whose data needs to be displayed.
      */
     void setupModelChangeProcessor(PropertyModel model) {
-        PropertyModelChangeProcessor.create(model, (ViewGroup) itemView, mViewBinder, true);
+        PropertyModelChangeProcessor.create(model, itemView, mViewBinder, true);
     }
 }
\ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd b/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd
index ef22125..9d3ff28 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd
@@ -128,6 +128,9 @@
       <message name="IDS_MANAGE_PASSWORDS" desc="Title of the button at the end of a touch to fill sheet that will open the password preferences when tapped.">
         Manage Passwords
       </message>
+      <message name="IDS_TOUCH_TO_FILL_CONFIRM" desc="Title of the button that confirms filling the only available set of credentials.">
+        Use Password
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings_grd/IDS_TOUCH_TO_FILL_CONFIRM.png.sha1 b/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings_grd/IDS_TOUCH_TO_FILL_CONFIRM.png.sha1
new file mode 100644
index 0000000..4e51696
--- /dev/null
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings_grd/IDS_TOUCH_TO_FILL_CONFIRM.png.sha1
@@ -0,0 +1 @@
+87f2113fe6c9f26027a09a62e4bb0e7d21532e33
\ No newline at end of file
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 2f004e5..08b80ee 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
@@ -193,6 +193,26 @@
 
     @Test
     @MediumTest
+    public void testSingleCredentialHasClickableButton() {
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mModel.get(SHEET_ITEMS)
+                    .addAll(asList(
+                            buildSheetItem(TouchToFillProperties.ItemType.CREDENTIAL, ANA, null),
+                            buildConfirmationButton(ANA)));
+            mModel.set(VISIBLE, true);
+        });
+        pollUiThread(() -> getBottomSheetState() == BottomSheetController.SheetState.HALF);
+
+        assertNotNull(getCredentials().getChildAt(0));
+        assertNotNull(getCredentials().getChildAt(1));
+
+        TouchCommon.singleClickView(getCredentials().getChildAt(1));
+
+        waitForEvent(mCredentialCallback).onResult(eq(ANA));
+    }
+
+    @Test
+    @MediumTest
     public void testManagePasswordsIsClickable() {
         final AtomicBoolean manageButtonClicked = new AtomicBoolean(false);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
@@ -258,10 +278,22 @@
     }
 
     private MVCListAdapter.ListItem buildCredentialItem(Credential credential) {
-        return new MVCListAdapter.ListItem(TouchToFillProperties.ItemType.CREDENTIAL,
+        return buildSheetItem(
+                TouchToFillProperties.ItemType.CREDENTIAL, credential, mCredentialCallback);
+    }
+
+    private MVCListAdapter.ListItem buildConfirmationButton(Credential credential) {
+        return buildSheetItem(
+                TouchToFillProperties.ItemType.FILL_BUTTON, credential, mCredentialCallback);
+    }
+
+    private static MVCListAdapter.ListItem buildSheetItem(
+            @TouchToFillProperties.ItemType int itemType, Credential credential,
+            Callback<Credential> callback) {
+        return new MVCListAdapter.ListItem(itemType,
                 new PropertyModel.Builder(TouchToFillProperties.CredentialProperties.ALL_KEYS)
                         .with(CREDENTIAL, credential)
-                        .with(ON_CLICK_LISTENER, mCredentialCallback)
+                        .with(ON_CLICK_LISTENER, callback)
                         .with(FORMATTED_ORIGIN, credential.getOriginUrl())
                         .build());
     }
diff --git a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
index 43858b21..eea190d 100644
--- a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
+++ b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
@@ -27,6 +27,7 @@
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE;
 
 import android.graphics.Bitmap;
+import android.support.test.espresso.core.deps.guava.collect.ImmutableMap;
 
 import androidx.annotation.Px;
 
@@ -46,6 +47,7 @@
 import org.chromium.base.metrics.test.ShadowRecordHistogram;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.JniMocker;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.touch_to_fill.TouchToFillComponent.UserAction;
 import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ItemType;
 import org.chromium.chrome.browser.touch_to_fill.data.Credential;
@@ -97,6 +99,8 @@
     @Before
     public void setUp() {
         ShadowRecordHistogram.reset();
+        ChromeFeatureList.setTestFeatures(
+                ImmutableMap.of(ChromeFeatureList.TOUCH_TO_FILL_ANDROID, true));
         MockitoAnnotations.initMocks(this);
         mJniMocker.mock(UrlFormatterJni.TEST_HOOKS, mUrlFormatterJniMock);
         mJniMocker.mock(RecordHistogramJni.TEST_HOOKS, mMockRecordHistogram);
diff --git a/chrome/browser/ui/android/strings/BUILD.gn b/chrome/browser/ui/android/strings/BUILD.gn
new file mode 100644
index 0000000..9ca286df
--- /dev/null
+++ b/chrome/browser/ui/android/strings/BUILD.gn
@@ -0,0 +1,66 @@
+# Copyright 2019 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("//build/config/android/rules.gni")
+import("//chrome/common/features.gni")
+
+java_strings_grd("ui_strings_grd") {
+  defines = chrome_grit_defines
+  grd_file = "android_chrome_strings.grd"
+  outputs = [
+    "values/android_chrome_strings.xml",
+    "values-am/android_chrome_strings.xml",
+    "values-ar/android_chrome_strings.xml",
+    "values-bg/android_chrome_strings.xml",
+    "values-bn/android_chrome_strings.xml",
+    "values-ca/android_chrome_strings.xml",
+    "values-cs/android_chrome_strings.xml",
+    "values-da/android_chrome_strings.xml",
+    "values-de/android_chrome_strings.xml",
+    "values-el/android_chrome_strings.xml",
+    "values-en-rGB/android_chrome_strings.xml",
+    "values-es/android_chrome_strings.xml",
+    "values-es-rUS/android_chrome_strings.xml",
+    "values-et/android_chrome_strings.xml",
+    "values-fa/android_chrome_strings.xml",
+    "values-fi/android_chrome_strings.xml",
+    "values-fr/android_chrome_strings.xml",
+    "values-gu/android_chrome_strings.xml",
+    "values-hi/android_chrome_strings.xml",
+    "values-hr/android_chrome_strings.xml",
+    "values-hu/android_chrome_strings.xml",
+    "values-in/android_chrome_strings.xml",
+    "values-it/android_chrome_strings.xml",
+    "values-iw/android_chrome_strings.xml",
+    "values-ja/android_chrome_strings.xml",
+    "values-kn/android_chrome_strings.xml",
+    "values-ko/android_chrome_strings.xml",
+    "values-lt/android_chrome_strings.xml",
+    "values-lv/android_chrome_strings.xml",
+    "values-ml/android_chrome_strings.xml",
+    "values-mr/android_chrome_strings.xml",
+    "values-ms/android_chrome_strings.xml",
+    "values-nb/android_chrome_strings.xml",
+    "values-nl/android_chrome_strings.xml",
+    "values-pl/android_chrome_strings.xml",
+    "values-pt-rBR/android_chrome_strings.xml",
+    "values-pt-rPT/android_chrome_strings.xml",
+    "values-ro/android_chrome_strings.xml",
+    "values-ru/android_chrome_strings.xml",
+    "values-sk/android_chrome_strings.xml",
+    "values-sl/android_chrome_strings.xml",
+    "values-sr/android_chrome_strings.xml",
+    "values-sv/android_chrome_strings.xml",
+    "values-sw/android_chrome_strings.xml",
+    "values-ta/android_chrome_strings.xml",
+    "values-te/android_chrome_strings.xml",
+    "values-th/android_chrome_strings.xml",
+    "values-tl/android_chrome_strings.xml",
+    "values-tr/android_chrome_strings.xml",
+    "values-uk/android_chrome_strings.xml",
+    "values-vi/android_chrome_strings.xml",
+    "values-zh-rCN/android_chrome_strings.xml",
+    "values-zh-rTW/android_chrome_strings.xml",
+  ]
+}
diff --git a/chrome/browser/ui/android/strings/DEPS b/chrome/browser/ui/android/strings/DEPS
new file mode 100644
index 0000000..2088525
--- /dev/null
+++ b/chrome/browser/ui/android/strings/DEPS
@@ -0,0 +1,3 @@
+noparent = True
+
+include_rules = []
diff --git a/chrome/android/java/strings/OWNERS b/chrome/browser/ui/android/strings/OWNERS
similarity index 100%
rename from chrome/android/java/strings/OWNERS
rename to chrome/browser/ui/android/strings/OWNERS
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
similarity index 99%
rename from chrome/android/java/strings/android_chrome_strings.grd
rename to chrome/browser/ui/android/strings/android_chrome_strings.grd
index 3594e778..6e8221d 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -188,6 +188,9 @@
       <message name="IDS_LEARN_MORE" desc="Generic label for menu item to learn more about a feature. [CHAR-LIMIT=32]">
         Learn more
       </message>
+      <message name="IDS_MORE" desc="Generic label for a button to show more items or options. [CHAR-LIMIT=20]">
+        More
+      </message>
       <message name="IDS_CLOSE" desc="Content description for a button to close a dialog or popup" >
         Close
       </message>
@@ -3192,6 +3195,9 @@
       <message name="IDS_ACCESSIBILITY_CANCEL_SELECTION" desc="Content description for the cancel selection button that deselects the selected items in a selectable list view.">
         Cancel selection
       </message>
+      <message name="IDS_ACCESSIBILITY_LIST_MENU_BUTTON" desc="Content description for the button that shows option menu for a list item.">
+        <ph name="NAME_OF_LIST_ITEM">%1$s<ex>Movie Title</ex></ph> Options
+      </message>
       <message name="IDS_ACCESSIBILITY_TOOLBAR_SCREEN_POSITION" desc="Accessibility announcement to inform users about a toolbar's location.">
         <ph name="ITEM_COUNT">%1$s<ex>3</ex></ph> selected.  Options available near top of the screen
       </message>
@@ -3996,7 +4002,6 @@
       <message name="IDS_CHIME_MODULE_TITLE" desc="Text shown when the chime module is referenced in install start, success, failure UI (e.g. in IDS_MODULE_INSTALL_START_TEXT, which will expand to 'Installing Google Notifications Platform for Chrome…').">
         Google Notifications Platform
       </message>
-
     </messages>
   </release>
 </grit>
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_CAPTIONS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_CAPTIONS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_CAPTIONS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_CAPTIONS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_INCOGNITO_BADGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_INCOGNITO_BADGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_INCOGNITO_BADGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_INCOGNITO_BADGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_TAB_SWITCHER_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_TAB_SWITCHER_SUMMARY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_TAB_SWITCHER_SUMMARY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_TAB_SWITCHER_SUMMARY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_TAB_SWITCHER_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_TAB_SWITCHER_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_TAB_SWITCHER_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_TAB_SWITCHER_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_BUTTON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_BUTTON.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_BUTTON.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_BUTTON.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AR_IMMERSIVE_MODE_CONSENT_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_BOOKMARKS_FOLDER_EMPTY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BOOKMARKS_FOLDER_EMPTY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_BOOKMARKS_FOLDER_EMPTY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BOOKMARKS_FOLDER_EMPTY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_BOOKMARK_ITEM_MOVE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BOOKMARK_ITEM_MOVE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_BOOKMARK_ITEM_MOVE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BOOKMARK_ITEM_MOVE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_BOOKMARK_SHOW_IN_FOLDER.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BOOKMARK_SHOW_IN_FOLDER.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_BOOKMARK_SHOW_IN_FOLDER.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BOOKMARK_SHOW_IN_FOLDER.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_BUTTON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_BUTTON.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_BUTTON.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_BUTTON.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_DIALOG_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_DIALOG_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_DIALOG_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_DIALOG_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_DIALOG_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_DIALOG_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_DIALOG_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CANCEL_SYNC_DIALOG_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CHOSEN_OBJECT_WEBSITE_CONFIRMATION_FOR.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CHOSEN_OBJECT_WEBSITE_CONFIRMATION_FOR.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CHOSEN_OBJECT_WEBSITE_CONFIRMATION_FOR.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CHOSEN_OBJECT_WEBSITE_CONFIRMATION_FOR.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CLICK_TO_CALL_DIALER_ABSENT_NOTIFICATION_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CLICK_TO_CALL_DIALER_ABSENT_NOTIFICATION_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CLICK_TO_CALL_DIALER_ABSENT_NOTIFICATION_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CLICK_TO_CALL_DIALER_ABSENT_NOTIFICATION_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CLICK_TO_CALL_DIALER_ABSENT_NOTIFICATION_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CLICK_TO_CALL_DIALER_ABSENT_NOTIFICATION_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CLICK_TO_CALL_DIALER_ABSENT_NOTIFICATION_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CLICK_TO_CALL_DIALER_ABSENT_NOTIFICATION_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_ALL_CONTACTS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_ALL_CONTACTS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_ALL_CONTACTS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_ALL_CONTACTS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_MORE_DETAILS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_MORE_DETAILS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_MORE_DETAILS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_MORE_DETAILS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_NO_CONTACTS_FOUND.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_NO_CONTACTS_FOUND.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_NO_CONTACTS_FOUND.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_NO_CONTACTS_FOUND.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_SEARCH.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_SEARCH.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_SEARCH.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_SEARCH.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_SELECT_CONTACTS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_SELECT_CONTACTS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_SELECT_CONTACTS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTACTS_PICKER_SELECT_CONTACTS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_OPEN_IMAGE_IN_EPHEMERAL_TAB.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_OPEN_IMAGE_IN_EPHEMERAL_TAB.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_OPEN_IMAGE_IN_EPHEMERAL_TAB.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_OPEN_IMAGE_IN_EPHEMERAL_TAB.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_OPEN_IN_EPHEMERAL_TAB.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_OPEN_IN_EPHEMERAL_TAB.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_OPEN_IN_EPHEMERAL_TAB.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_OPEN_IN_EPHEMERAL_TAB.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_SEARCH_WITH_GOOGLE_LENS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_SEARCH_WITH_GOOGLE_LENS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_SEARCH_WITH_GOOGLE_LENS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTMENU_SEARCH_WITH_GOOGLE_LENS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DATA_REDUCTION_INITIAL_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DATA_REDUCTION_INITIAL_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DATA_REDUCTION_INITIAL_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DATA_REDUCTION_INITIAL_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DELETE_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DELETE_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DELETE_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DELETE_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DISCLAIMER_SHARING_CONTACT_DETAILS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DISCLAIMER_SHARING_CONTACT_DETAILS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DISCLAIMER_SHARING_CONTACT_DETAILS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DISCLAIMER_SHARING_CONTACT_DETAILS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_DOWNLOAD_AGAIN.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_DOWNLOAD_AGAIN.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_DOWNLOAD_AGAIN.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_DOWNLOAD_AGAIN.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_DOWNLOAD_TO_DEFAULT_FOLDER.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_DOWNLOAD_TO_DEFAULT_FOLDER.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_DOWNLOAD_TO_DEFAULT_FOLDER.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_DOWNLOAD_TO_DEFAULT_FOLDER.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NAME_EXISTS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NAME_EXISTS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NAME_EXISTS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NAME_EXISTS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NAME_TOO_LONG.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NAME_TOO_LONG.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NAME_TOO_LONG.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NAME_TOO_LONG.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOTIFICATION_RETRY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOTIFICATION_RETRY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOTIFICATION_RETRY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOTIFICATION_RETRY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE_SD_CARD_FULL.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE_SD_CARD_FULL.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE_SD_CARD_FULL.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE_SD_CARD_FULL.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_AVAILABLE_LOCATIONS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_AVAILABLE_LOCATIONS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_AVAILABLE_LOCATIONS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_AVAILABLE_LOCATIONS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_SD_CARD.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_SD_CARD.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_SD_CARD.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_SD_CARD.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_SD_CARD_SNACKBAR.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_SD_CARD_SNACKBAR.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_SD_CARD_SNACKBAR.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_NO_SD_CARD_SNACKBAR.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_RENAME_FILE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_RENAME_FILE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_RENAME_FILE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_LOCATION_RENAME_FILE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_EXPLORE_OFFLINE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_EXPLORE_OFFLINE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_EXPLORE_OFFLINE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_EXPLORE_OFFLINE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_FILES_TAB.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_FILES_TAB.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_FILES_TAB.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_FILES_TAB.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_OFFLINE_HOME.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_OFFLINE_HOME.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_OFFLINE_HOME.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_OFFLINE_HOME.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_PREFETCH_TAB.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_PREFETCH_TAB.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_PREFETCH_TAB.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_MANAGER_PREFETCH_TAB.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_ENABLE_PREFETCH_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_ENABLE_PREFETCH_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_ENABLE_PREFETCH_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_ENABLE_PREFETCH_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_PREFETCH_MAYBE_UNAVAILABLE_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_PREFETCH_MAYBE_UNAVAILABLE_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_PREFETCH_MAYBE_UNAVAILABLE_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_PREFETCH_MAYBE_UNAVAILABLE_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_PREFETCH_UNAVAILABLE_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_PREFETCH_UNAVAILABLE_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_PREFETCH_UNAVAILABLE_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DOWNLOAD_SETTINGS_PREFETCH_UNAVAILABLE_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_OFFLINE_CARD_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_OFFLINE_CARD_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_OFFLINE_CARD_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_OFFLINE_CARD_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_NEWS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_NEWS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_NEWS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_NEWS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_SHOPPING.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_SHOPPING.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_SHOPPING.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_SHOPPING.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_SPORTS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_SPORTS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_SPORTS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_DEFAULT_CATEGORY_SPORTS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_IPH.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_IPH.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_IPH.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_IPH.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_IPH_ACCESSIBILITY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_IPH_ACCESSIBILITY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_IPH_ACCESSIBILITY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_IPH_ACCESSIBILITY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_TOP_SITES_TILE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_TOP_SITES_TILE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_TOP_SITES_TILE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_EXPLORE_SITES_TOP_SITES_TILE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_HINT_SYNC_SETTINGS_NOT_CONFIRMED_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_HINT_SYNC_SETTINGS_NOT_CONFIRMED_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_HINT_SYNC_SETTINGS_NOT_CONFIRMED_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_HINT_SYNC_SETTINGS_NOT_CONFIRMED_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_HISTORY_MANAGER_EMPTY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_HISTORY_MANAGER_EMPTY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_HISTORY_MANAGER_EMPTY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_HISTORY_MANAGER_EMPTY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_FAILED_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_FAILED_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_FAILED_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_FAILED_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_READY_LINK_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_READY_LINK_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_READY_LINK_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_READY_LINK_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_READY_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_READY_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_READY_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_INFOBAR_READY_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_TOAST_DOWNLOADING_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_TOAST_DOWNLOADING_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_TOAST_DOWNLOADING_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_INLINE_UPDATE_TOAST_DOWNLOADING_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DOWNLOAD_SETTINGS_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DOWNLOAD_SETTINGS_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DOWNLOAD_SETTINGS_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DOWNLOAD_SETTINGS_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_CONTENT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_CONTENT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_CONTENT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_CONTENT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_INTRODUCTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_INTRODUCTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_INTRODUCTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_INTRODUCTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_SHOW_ME.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_SHOW_ME.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_SHOW_ME.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_SHOW_ME.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_DRAG_AND_DROP_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_IDENTITY_DISC_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_IDENTITY_DISC_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_IDENTITY_DISC_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_IDENTITY_DISC_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_TRANSLATE_MANUAL_BUTTON_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_TRANSLATE_MANUAL_BUTTON_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_TRANSLATE_MANUAL_BUTTON_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_TRANSLATE_MANUAL_BUTTON_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MANAGED_SETTINGS_CANNOT_BE_REST.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MANAGED_SETTINGS_CANNOT_BE_REST.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MANAGED_SETTINGS_CANNOT_BE_REST.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MANAGED_SETTINGS_CANNOT_BE_REST.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_GROUP_TABS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_GROUP_TABS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_GROUP_TABS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_GROUP_TABS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_DOWNLOADING.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_DOWNLOADING.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_DOWNLOADING.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_DOWNLOADING.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_FAILED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_FAILED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_FAILED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_FAILED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_READY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_READY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_READY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_READY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_READY_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_READY_SUMMARY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_READY_SUMMARY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_INLINE_UPDATE_READY_SUMMARY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_DOWN.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_DOWN.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_DOWN.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_DOWN.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_TO_TOP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_TO_TOP.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_TO_TOP.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_TO_TOP.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_UP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_UP.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_UP.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_MOVE_UP.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_TRANSLATE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_TRANSLATE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_MENU_TRANSLATE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_TRANSLATE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_NOTIFICATION_CATEGORY_PERMISSION_REQUESTS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NOTIFICATION_CATEGORY_PERMISSION_REQUESTS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_NOTIFICATION_CATEGORY_PERMISSION_REQUESTS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NOTIFICATION_CATEGORY_PERMISSION_REQUESTS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_NOTIFICATION_CATEGORY_VR.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NOTIFICATION_CATEGORY_VR.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_NOTIFICATION_CATEGORY_VR.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NOTIFICATION_CATEGORY_VR.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_NOTIFICATION_MANAGE_BUTTON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NOTIFICATION_MANAGE_BUTTON.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_NOTIFICATION_MANAGE_BUTTON.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NOTIFICATION_MANAGE_BUTTON.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_NO_SAVED_WEBSITE_SETTINGS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NO_SAVED_WEBSITE_SETTINGS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_NO_SAVED_WEBSITE_SETTINGS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NO_SAVED_WEBSITE_SETTINGS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_NO_THANKS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NO_THANKS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_NO_THANKS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_NO_THANKS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_OFFLINE_PAGES_AUTO_FETCH_IN_PROGRESS_NOTIFICATION_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_PAGES_AUTO_FETCH_IN_PROGRESS_NOTIFICATION_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_OFFLINE_PAGES_AUTO_FETCH_IN_PROGRESS_NOTIFICATION_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_PAGES_AUTO_FETCH_IN_PROGRESS_NOTIFICATION_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_OFFLINE_PAGES_AUTO_FETCH_READY_NOTIFICATION_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_PAGES_AUTO_FETCH_READY_NOTIFICATION_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_OFFLINE_PAGES_AUTO_FETCH_READY_NOTIFICATION_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OFFLINE_PAGES_AUTO_FETCH_READY_NOTIFICATION_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_OVERSCROLL_NAVIGATION_CLOSE_CHROME.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OVERSCROLL_NAVIGATION_CLOSE_CHROME.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_OVERSCROLL_NAVIGATION_CLOSE_CHROME.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_OVERSCROLL_NAVIGATION_CLOSE_CHROME.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_IN_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_IN_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_IN_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_IN_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_ENABLE_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_ENABLE_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_ENABLE_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_ENABLE_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_FULL_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_FULL_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_FULL_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_FULL_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_PARTIAL_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_PARTIAL_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_PARTIAL_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_PARTIAL_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORDS_LEAK_DETECTION_SWITCH_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PHOTO_PICKER_SELECT_IMAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PHOTO_PICKER_SELECT_IMAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PHOTO_PICKER_SELECT_IMAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PHOTO_PICKER_SELECT_IMAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PHOTO_PICKER_SELECT_IMAGES.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PHOTO_PICKER_SELECT_IMAGES.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PHOTO_PICKER_SELECT_IMAGES.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PHOTO_PICKER_SELECT_IMAGES.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_PREFS_THEMES.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_THEMES.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_PREFS_THEMES.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_THEMES.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_QR_CODE_SCAN_TAB_LABEL.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_QR_CODE_SCAN_TAB_LABEL.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_QR_CODE_SCAN_TAB_LABEL.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_QR_CODE_SCAN_TAB_LABEL.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_QR_CODE_SHARE_ICON_LABEL.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_QR_CODE_SHARE_ICON_LABEL.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_QR_CODE_SHARE_ICON_LABEL.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_QR_CODE_SHARE_ICON_LABEL.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_QR_CODE_SHARE_TAB_LABEL.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_QR_CODE_SHARE_TAB_LABEL.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_QR_CODE_SHARE_TAB_LABEL.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_QR_CODE_SHARE_TAB_LABEL.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_READER_FOR_ACCESSIBILITY_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_READER_FOR_ACCESSIBILITY_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_READER_FOR_ACCESSIBILITY_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_READER_FOR_ACCESSIBILITY_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_REMOVE_LOCAL_DATA.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_REMOVE_LOCAL_DATA.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_REMOVE_LOCAL_DATA.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_REMOVE_LOCAL_DATA.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_RENAME_EXTENSION_CONFIRMATION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_RENAME_EXTENSION_CONFIRMATION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_RENAME_EXTENSION_CONFIRMATION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_RENAME_EXTENSION_CONFIRMATION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_RENAME_EXTENSION_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_RENAME_EXTENSION_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_RENAME_EXTENSION_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_RENAME_EXTENSION_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SCOUT_REPORTING_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SCOUT_REPORTING_SUMMARY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SCOUT_REPORTING_SUMMARY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SCOUT_REPORTING_SUMMARY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SCOUT_REPORTING_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SCOUT_REPORTING_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SCOUT_REPORTING_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SCOUT_REPORTING_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SUMMARY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SUMMARY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_SUMMARY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SAFE_BROWSING_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SEARCH_ENGINE_CHOICE_PROMPT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEARCH_ENGINE_CHOICE_PROMPT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SEARCH_ENGINE_CHOICE_PROMPT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEARCH_ENGINE_CHOICE_PROMPT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TITLE_UNKNOWN_DEVICE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TITLE_UNKNOWN_DEVICE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TITLE_UNKNOWN_DEVICE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_NOTIFICATION_TITLE_UNKNOWN_DEVICE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_SHARE_ACTIVITY_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_SHARE_ACTIVITY_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_SHARE_ACTIVITY_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARED_CLIPBOARD_SHARE_ACTIVITY_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARING_CHROME_SETTINGS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARING_CHROME_SETTINGS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARING_CHROME_SETTINGS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARING_CHROME_SETTINGS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARING_NO_DEVICES_AVAILABLE_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARING_NO_DEVICES_AVAILABLE_TEXT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARING_NO_DEVICES_AVAILABLE_TEXT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARING_NO_DEVICES_AVAILABLE_TEXT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARING_NO_DEVICES_AVAILABLE_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARING_NO_DEVICES_AVAILABLE_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARING_NO_DEVICES_AVAILABLE_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARING_NO_DEVICES_AVAILABLE_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARING_SENDING_NOTIFICATION_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARING_SENDING_NOTIFICATION_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHARING_SENDING_NOTIFICATION_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHARING_SENDING_NOTIFICATION_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SHOW.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHOW.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SHOW.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SHOW.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_DETAILS_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_DETAILS_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_DETAILS_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_DETAILS_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SAFE_BROWSING_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SAFE_BROWSING_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SAFE_BROWSING_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SAFE_BROWSING_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SAFE_BROWSING_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SAFE_BROWSING_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SAFE_BROWSING_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SAFE_BROWSING_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_DESCRIPTION_CHILD_ACCOUNT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_DESCRIPTION_CHILD_ACCOUNT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_DESCRIPTION_CHILD_ACCOUNT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_DESCRIPTION_CHILD_ACCOUNT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_SYNC_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_TAP_TO_SEARCH_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_TAP_TO_SEARCH_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_TAP_TO_SEARCH_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_TAP_TO_SEARCH_DESCRIPTION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_TAP_TO_SEARCH_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_TAP_TO_SEARCH_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNIN_TAP_TO_SEARCH_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_TAP_TO_SEARCH_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNOUT_MANAGED_ACCOUNT_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNOUT_MANAGED_ACCOUNT_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNOUT_MANAGED_ACCOUNT_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNOUT_MANAGED_ACCOUNT_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNOUT_MANAGED_ACCOUNT_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNOUT_MANAGED_ACCOUNT_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNOUT_MANAGED_ACCOUNT_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNOUT_MANAGED_ACCOUNT_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNOUT_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNOUT_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNOUT_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNOUT_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNOUT_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNOUT_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGNOUT_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNOUT_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_SUMMARY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_SUMMARY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_SUMMARY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_SUMMARY_CHILD_ACCOUNT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_SUMMARY_CHILD_ACCOUNT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_SUMMARY_CHILD_ACCOUNT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_SUMMARY_CHILD_ACCOUNT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_STORAGE_CLEAR_BUTTON_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_STORAGE_CLEAR_BUTTON_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_STORAGE_CLEAR_BUTTON_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_STORAGE_CLEAR_BUTTON_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SYNC_AND_SERVICES_SUMMARY_SYNC_ON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_AND_SERVICES_SUMMARY_SYNC_ON.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SYNC_AND_SERVICES_SUMMARY_SYNC_ON.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_AND_SERVICES_SUMMARY_SYNC_ON.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SYNC_IS_DISABLED_BY_ADMINISTRATOR.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_IS_DISABLED_BY_ADMINISTRATOR.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SYNC_IS_DISABLED_BY_ADMINISTRATOR.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_IS_DISABLED_BY_ADMINISTRATOR.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SYNC_SETTINGS_NOT_CONFIRMED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_SETTINGS_NOT_CONFIRMED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SYNC_SETTINGS_NOT_CONFIRMED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_SETTINGS_NOT_CONFIRMED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_SYNC_SETUP_NOT_CONFIRMED_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_SETUP_NOT_CONFIRMED_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_SYNC_SETUP_NOT_CONFIRMED_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SYNC_SETUP_NOT_CONFIRMED_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_REMOVE_FROM_GROUP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_REMOVE_FROM_GROUP.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_REMOVE_FROM_GROUP.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_REMOVE_FROM_GROUP.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_SELECTION_MODE_REMOVE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_SELECTION_MODE_REMOVE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_SELECTION_MODE_REMOVE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_SELECTION_MODE_REMOVE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_TOOLBAR_REMOVE_FROM_GROUP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_TOOLBAR_REMOVE_FROM_GROUP.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_TOOLBAR_REMOVE_FROM_GROUP.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_GRID_DIALOG_TOOLBAR_REMOVE_FROM_GROUP.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_SELECTION_EDITOR_GROUP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_SELECTION_EDITOR_GROUP.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_SELECTION_EDITOR_GROUP.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_SELECTION_EDITOR_GROUP.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_SELECTION_EDITOR_TOOLBAR_SELECT_TABS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_SELECTION_EDITOR_TOOLBAR_SELECT_TABS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_SELECTION_EDITOR_TOOLBAR_SELECT_TABS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_SELECTION_EDITOR_TOOLBAR_SELECT_TABS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_SWITCHER_BUTTON_LABEL.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_SWITCHER_BUTTON_LABEL.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_TAB_SWITCHER_BUTTON_LABEL.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TAB_SWITCHER_BUTTON_LABEL.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_THEMES_SYSTEM_DEFAULT_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_THEMES_SYSTEM_DEFAULT_SUMMARY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_THEMES_SYSTEM_DEFAULT_SUMMARY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_THEMES_SYSTEM_DEFAULT_SUMMARY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_THEMES_SYSTEM_DEFAULT_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_THEMES_SYSTEM_DEFAULT_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_THEMES_SYSTEM_DEFAULT_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_THEMES_SYSTEM_DEFAULT_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_TWA_RUNNING_IN_CHROME.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TWA_RUNNING_IN_CHROME.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_TWA_RUNNING_IN_CHROME.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TWA_RUNNING_IN_CHROME.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_UNDO_BAR_CLOSE_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_UNDO_BAR_CLOSE_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_UNDO_BAR_CLOSE_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_UNDO_BAR_CLOSE_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_UNDO_BAR_GROUP_TABS_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_UNDO_BAR_GROUP_TABS_MESSAGE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_UNDO_BAR_GROUP_TABS_MESSAGE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_UNDO_BAR_GROUP_TABS_MESSAGE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_UNSUPPORTED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_UNSUPPORTED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_UNSUPPORTED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_UNSUPPORTED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_CONSENT_PROMPT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_CONSENT_PROMPT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_CONSENT_PROMPT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_CONSENT_PROMPT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_CONSENT_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_CONSENT_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_CONSENT_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_CONSENT_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_REVOCATION_EXPLANATION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_REVOCATION_EXPLANATION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_REVOCATION_EXPLANATION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_REVOCATION_EXPLANATION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_REVOCATION_PROMPT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_REVOCATION_PROMPT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_REVOCATION_PROMPT.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_REVOCATION_PROMPT.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SETTINGS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SETTINGS.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SETTINGS.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SETTINGS.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SETTING_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SETTING_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SETTING_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SETTING_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SITE_PAUSED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SITE_PAUSED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SITE_PAUSED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SITE_PAUSED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SITE_PAUSED_EXPLANATION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SITE_PAUSED_EXPLANATION.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SITE_PAUSED_EXPLANATION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_USAGE_STATS_SITE_PAUSED_EXPLANATION.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_VR_PREPARING_VR_NOTIFICATION_BODY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_VR_PREPARING_VR_NOTIFICATION_BODY.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_VR_PREPARING_VR_NOTIFICATION_BODY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_VR_PREPARING_VR_NOTIFICATION_BODY.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_VR_PREPARING_VR_NOTIFICATION_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_VR_PREPARING_VR_NOTIFICATION_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_VR_PREPARING_VR_NOTIFICATION_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_VR_PREPARING_VR_NOTIFICATION_TITLE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBAPK_CANNOT_CONNECT_TO_SITE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAPK_CANNOT_CONNECT_TO_SITE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBAPK_CANNOT_CONNECT_TO_SITE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAPK_CANNOT_CONNECT_TO_SITE.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBAPK_NETWORK_ERROR_MESSAGE_TUNNEL_CONNECTION_FAILED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAPK_NETWORK_ERROR_MESSAGE_TUNNEL_CONNECTION_FAILED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBAPK_NETWORK_ERROR_MESSAGE_TUNNEL_CONNECTION_FAILED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAPK_NETWORK_ERROR_MESSAGE_TUNNEL_CONNECTION_FAILED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBAPK_OFFLINE_DIALOG.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAPK_OFFLINE_DIALOG.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBAPK_OFFLINE_DIALOG.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAPK_OFFLINE_DIALOG.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_NOTIFICATION_MANAGED_BY_APP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_NOTIFICATION_MANAGED_BY_APP.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_NOTIFICATION_MANAGED_BY_APP.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_NOTIFICATION_MANAGED_BY_APP.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED_RECOMMENDED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED_RECOMMENDED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED_RECOMMENDED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ALLOWED_RECOMMENDED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK_RECOMMENDED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK_RECOMMENDED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK_RECOMMENDED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_ASK_RECOMMENDED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_BLOCKED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_BLOCKED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_BLOCKED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_PROTECTED_CONTENT_BLOCKED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_USB_ASK.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_USB_ASK.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_USB_ASK.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_USB_ASK.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_USB_BLOCKED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_USB_BLOCKED.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_USB_BLOCKED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_CATEGORY_USB_BLOCKED.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_MANAGED_GROUP_HEADING.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_MANAGED_GROUP_HEADING.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_MANAGED_GROUP_HEADING.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBSITE_SETTINGS_MANAGED_GROUP_HEADING.png.sha1
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/closetab.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/closetab.png.sha1
similarity index 100%
rename from chrome/android/java/strings/android_chrome_strings_grd/closetab.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/closetab.png.sha1
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_am.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_da.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_de.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_el.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_es.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_et.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_id.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_it.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_no.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_te.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_th.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
similarity index 100%
rename from chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
rename to chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
diff --git a/chrome/android/java/strings/xr_consent_ui_strings_java.grdp b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java.grdp
similarity index 100%
rename from chrome/android/java/strings/xr_consent_ui_strings_java.grdp
rename to chrome/browser/ui/android/strings/xr_consent_ui_strings_java.grdp
diff --git a/chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_BUTTON_ALLOW_AND_ENTER_VR.png.sha1 b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_BUTTON_ALLOW_AND_ENTER_VR.png.sha1
similarity index 100%
rename from chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_BUTTON_ALLOW_AND_ENTER_VR.png.sha1
rename to chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_BUTTON_ALLOW_AND_ENTER_VR.png.sha1
diff --git a/chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_BUTTON_DENY_VR.png.sha1 b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_BUTTON_DENY_VR.png.sha1
new file mode 100644
index 0000000..f7f6408
--- /dev/null
+++ b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_BUTTON_DENY_VR.png.sha1
@@ -0,0 +1 @@
+91e04b62280221cdc2d4f2c58c555ba819945495
\ No newline at end of file
diff --git a/chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_DEFAULT.png.sha1 b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_DEFAULT.png.sha1
similarity index 100%
rename from chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_DEFAULT.png.sha1
rename to chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_DEFAULT.png.sha1
diff --git a/chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN.png.sha1 b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN.png.sha1
similarity index 100%
rename from chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN.png.sha1
rename to chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN.png.sha1
diff --git a/chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES.png.sha1 b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES.png.sha1
similarity index 100%
rename from chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES.png.sha1
rename to chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES.png.sha1
diff --git a/chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_TITLE.png.sha1 b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_TITLE.png.sha1
similarity index 100%
rename from chrome/android/java/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/xr_consent_ui_strings_java_grdp/IDS_XR_CONSENT_DIALOG_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/widget/BUILD.gn b/chrome/browser/ui/android/widget/BUILD.gn
index 949c5cee..2e5c8b2 100644
--- a/chrome/browser/ui/android/widget/BUILD.gn
+++ b/chrome/browser/ui/android/widget/BUILD.gn
@@ -72,7 +72,7 @@
   custom_package = "org.chromium.chrome.browser.ui.widget"
   resource_dirs = [ "java/res" ]
   deps = [
-    ":ui_widget_strings_grd",
+    "//chrome/browser/ui/android/strings:ui_strings_grd",
     "//chrome/browser/ui/android/styles:java_resources",
     "//third_party/android_deps:com_android_support_design_java",
     "//ui/android:ui_java_resources",
@@ -83,65 +83,6 @@
   }
 }
 
-java_strings_grd("ui_widget_strings_grd") {
-  grd_file = "java/strings/android_ui_widget_strings.grd"
-  outputs = [
-    "values/android_ui_widget_strings.xml",
-    "values-am/android_ui_widget_strings.xml",
-    "values-ar/android_ui_widget_strings.xml",
-    "values-bg/android_ui_widget_strings.xml",
-    "values-bn/android_ui_widget_strings.xml",
-    "values-ca/android_ui_widget_strings.xml",
-    "values-cs/android_ui_widget_strings.xml",
-    "values-da/android_ui_widget_strings.xml",
-    "values-de/android_ui_widget_strings.xml",
-    "values-el/android_ui_widget_strings.xml",
-    "values-en-rGB/android_ui_widget_strings.xml",
-    "values-es/android_ui_widget_strings.xml",
-    "values-es-rUS/android_ui_widget_strings.xml",
-    "values-et/android_ui_widget_strings.xml",
-    "values-fa/android_ui_widget_strings.xml",
-    "values-fi/android_ui_widget_strings.xml",
-    "values-fr/android_ui_widget_strings.xml",
-    "values-gu/android_ui_widget_strings.xml",
-    "values-hi/android_ui_widget_strings.xml",
-    "values-hr/android_ui_widget_strings.xml",
-    "values-hu/android_ui_widget_strings.xml",
-    "values-in/android_ui_widget_strings.xml",
-    "values-it/android_ui_widget_strings.xml",
-    "values-iw/android_ui_widget_strings.xml",
-    "values-ja/android_ui_widget_strings.xml",
-    "values-kn/android_ui_widget_strings.xml",
-    "values-ko/android_ui_widget_strings.xml",
-    "values-lt/android_ui_widget_strings.xml",
-    "values-lv/android_ui_widget_strings.xml",
-    "values-ml/android_ui_widget_strings.xml",
-    "values-mr/android_ui_widget_strings.xml",
-    "values-ms/android_ui_widget_strings.xml",
-    "values-nb/android_ui_widget_strings.xml",
-    "values-nl/android_ui_widget_strings.xml",
-    "values-pl/android_ui_widget_strings.xml",
-    "values-pt-rBR/android_ui_widget_strings.xml",
-    "values-pt-rPT/android_ui_widget_strings.xml",
-    "values-ro/android_ui_widget_strings.xml",
-    "values-ru/android_ui_widget_strings.xml",
-    "values-sk/android_ui_widget_strings.xml",
-    "values-sl/android_ui_widget_strings.xml",
-    "values-sr/android_ui_widget_strings.xml",
-    "values-sv/android_ui_widget_strings.xml",
-    "values-sw/android_ui_widget_strings.xml",
-    "values-ta/android_ui_widget_strings.xml",
-    "values-te/android_ui_widget_strings.xml",
-    "values-th/android_ui_widget_strings.xml",
-    "values-tl/android_ui_widget_strings.xml",
-    "values-tr/android_ui_widget_strings.xml",
-    "values-uk/android_ui_widget_strings.xml",
-    "values-vi/android_ui_widget_strings.xml",
-    "values-zh-rCN/android_ui_widget_strings.xml",
-    "values-zh-rTW/android_ui_widget_strings.xml",
-  ]
-}
-
 android_library("test_support_java") {
   testonly = true
 
@@ -184,7 +125,7 @@
   resource_dirs = [ "test/java/res" ]
   deps = [
     ":ui_widget_java_resources",
-    ":ui_widget_strings_grd",
+    "//chrome/browser/ui/android/strings:ui_strings_grd",
     "//ui/android:ui_java_resources",
   ]
 }
diff --git a/chrome/browser/ui/android/widget/java/strings/android_ui_widget_strings.grd b/chrome/browser/ui/android/widget/java/strings/android_ui_widget_strings.grd
deleted file mode 100644
index 2330801..0000000
--- a/chrome/browser/ui/android/widget/java/strings/android_ui_widget_strings.grd
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
-  <outputs>
-    <output filename="values-am/android_ui_widget_strings.xml" lang="am" type="android" />
-    <output filename="values-ar/android_ui_widget_strings.xml" lang="ar" type="android" />
-    <output filename="values-bg/android_ui_widget_strings.xml" lang="bg" type="android" />
-    <output filename="values-bn/android_ui_widget_strings.xml" lang="bn" type="android" />
-    <output filename="values-ca/android_ui_widget_strings.xml" lang="ca" type="android" />
-    <output filename="values-cs/android_ui_widget_strings.xml" lang="cs" type="android" />
-    <output filename="values-da/android_ui_widget_strings.xml" lang="da" type="android" />
-    <output filename="values-de/android_ui_widget_strings.xml" lang="de" type="android" />
-    <output filename="values-el/android_ui_widget_strings.xml" lang="el" type="android" />
-    <output filename="values/android_ui_widget_strings.xml" lang="en" type="android" />
-    <output filename="values-en-rGB/android_ui_widget_strings.xml" lang="en-GB" type="android" />
-    <output filename="values-es/android_ui_widget_strings.xml" lang="es" type="android" />
-    <output filename="values-es-rUS/android_ui_widget_strings.xml" lang="es-419" type="android" />
-    <output filename="values-et/android_ui_widget_strings.xml" lang="et" type="android" />
-    <output filename="values-fa/android_ui_widget_strings.xml" lang="fa" type="android" />
-    <output filename="values-fi/android_ui_widget_strings.xml" lang="fi" type="android" />
-    <output filename="values-tl/android_ui_widget_strings.xml" lang="fil" type="android" />
-    <output filename="values-fr/android_ui_widget_strings.xml" lang="fr" type="android" />
-    <output filename="values-gu/android_ui_widget_strings.xml" lang="gu" type="android" />
-    <output filename="values-hi/android_ui_widget_strings.xml" lang="hi" type="android" />
-    <output filename="values-hr/android_ui_widget_strings.xml" lang="hr" type="android" />
-    <output filename="values-hu/android_ui_widget_strings.xml" lang="hu" type="android" />
-    <output filename="values-in/android_ui_widget_strings.xml" lang="id" type="android" />
-    <output filename="values-it/android_ui_widget_strings.xml" lang="it" type="android" />
-    <output filename="values-iw/android_ui_widget_strings.xml" lang="iw" type="android" />
-    <output filename="values-ja/android_ui_widget_strings.xml" lang="ja" type="android" />
-    <output filename="values-kn/android_ui_widget_strings.xml" lang="kn" type="android" />
-    <output filename="values-ko/android_ui_widget_strings.xml" lang="ko" type="android" />
-    <output filename="values-lt/android_ui_widget_strings.xml" lang="lt" type="android" />
-    <output filename="values-lv/android_ui_widget_strings.xml" lang="lv" type="android" />
-    <output filename="values-ml/android_ui_widget_strings.xml" lang="ml" type="android" />
-    <output filename="values-mr/android_ui_widget_strings.xml" lang="mr" type="android" />
-    <output filename="values-ms/android_ui_widget_strings.xml" lang="ms" type="android" />
-    <output filename="values-nl/android_ui_widget_strings.xml" lang="nl" type="android" />
-    <output filename="values-nb/android_ui_widget_strings.xml" lang="no" type="android" />
-    <output filename="values-pl/android_ui_widget_strings.xml" lang="pl" type="android" />
-    <output filename="values-pt-rBR/android_ui_widget_strings.xml" lang="pt-BR" type="android" />
-    <output filename="values-pt-rPT/android_ui_widget_strings.xml" lang="pt-PT" type="android" />
-    <output filename="values-ro/android_ui_widget_strings.xml" lang="ro" type="android" />
-    <output filename="values-ru/android_ui_widget_strings.xml" lang="ru" type="android" />
-    <output filename="values-sk/android_ui_widget_strings.xml" lang="sk" type="android" />
-    <output filename="values-sl/android_ui_widget_strings.xml" lang="sl" type="android" />
-    <output filename="values-sr/android_ui_widget_strings.xml" lang="sr" type="android" />
-    <output filename="values-sv/android_ui_widget_strings.xml" lang="sv" type="android" />
-    <output filename="values-sw/android_ui_widget_strings.xml" lang="sw" type="android" />
-    <output filename="values-ta/android_ui_widget_strings.xml" lang="ta" type="android" />
-    <output filename="values-te/android_ui_widget_strings.xml" lang="te" type="android" />
-    <output filename="values-th/android_ui_widget_strings.xml" lang="th" type="android" />
-    <output filename="values-tr/android_ui_widget_strings.xml" lang="tr" type="android" />
-    <output filename="values-uk/android_ui_widget_strings.xml" lang="uk" type="android" />
-    <output filename="values-vi/android_ui_widget_strings.xml" lang="vi" type="android" />
-    <output filename="values-zh-rCN/android_ui_widget_strings.xml" lang="zh-CN" type="android" />
-    <output filename="values-zh-rTW/android_ui_widget_strings.xml" lang="zh-TW" type="android" />
-  </outputs>
-  <translations>
-    <file lang="am" path="translations/android_ui_widget_strings_am.xtb" />
-    <file lang="ar" path="translations/android_ui_widget_strings_ar.xtb" />
-    <file lang="bg" path="translations/android_ui_widget_strings_bg.xtb" />
-    <file lang="bn" path="translations/android_ui_widget_strings_bn.xtb" />
-    <file lang="ca" path="translations/android_ui_widget_strings_ca.xtb" />
-    <file lang="cs" path="translations/android_ui_widget_strings_cs.xtb" />
-    <file lang="da" path="translations/android_ui_widget_strings_da.xtb" />
-    <file lang="de" path="translations/android_ui_widget_strings_de.xtb" />
-    <file lang="el" path="translations/android_ui_widget_strings_el.xtb" />
-    <file lang="en-GB" path="translations/android_ui_widget_strings_en-GB.xtb" />
-    <file lang="es" path="translations/android_ui_widget_strings_es.xtb" />
-    <file lang="es-419" path="translations/android_ui_widget_strings_es-419.xtb" />
-    <file lang="et" path="translations/android_ui_widget_strings_et.xtb" />
-    <file lang="fa" path="translations/android_ui_widget_strings_fa.xtb" />
-    <file lang="fi" path="translations/android_ui_widget_strings_fi.xtb" />
-    <file lang="fil" path="translations/android_ui_widget_strings_fil.xtb" />
-    <file lang="fr" path="translations/android_ui_widget_strings_fr.xtb" />
-    <file lang="gu" path="translations/android_ui_widget_strings_gu.xtb" />
-    <file lang="hi" path="translations/android_ui_widget_strings_hi.xtb" />
-    <file lang="hr" path="translations/android_ui_widget_strings_hr.xtb" />
-    <file lang="hu" path="translations/android_ui_widget_strings_hu.xtb" />
-    <file lang="id" path="translations/android_ui_widget_strings_id.xtb" />
-    <file lang="it" path="translations/android_ui_widget_strings_it.xtb" />
-    <file lang="iw" path="translations/android_ui_widget_strings_iw.xtb" />
-    <file lang="ja" path="translations/android_ui_widget_strings_ja.xtb" />
-    <file lang="ko" path="translations/android_ui_widget_strings_ko.xtb" />
-    <file lang="kn" path="translations/android_ui_widget_strings_kn.xtb" />
-    <file lang="lt" path="translations/android_ui_widget_strings_lt.xtb" />
-    <file lang="lv" path="translations/android_ui_widget_strings_lv.xtb" />
-    <file lang="ml" path="translations/android_ui_widget_strings_ml.xtb" />
-    <file lang="mr" path="translations/android_ui_widget_strings_mr.xtb" />
-    <file lang="ms" path="translations/android_ui_widget_strings_ms.xtb" />
-    <file lang="nl" path="translations/android_ui_widget_strings_nl.xtb" />
-    <file lang="no" path="translations/android_ui_widget_strings_no.xtb" />
-    <file lang="pl" path="translations/android_ui_widget_strings_pl.xtb" />
-    <file lang="pt-BR" path="translations/android_ui_widget_strings_pt-BR.xtb" />
-    <file lang="pt-PT" path="translations/android_ui_widget_strings_pt-PT.xtb" />
-    <file lang="ro" path="translations/android_ui_widget_strings_ro.xtb" />
-    <file lang="ru" path="translations/android_ui_widget_strings_ru.xtb" />
-    <file lang="sk" path="translations/android_ui_widget_strings_sk.xtb" />
-    <file lang="sl" path="translations/android_ui_widget_strings_sl.xtb" />
-    <file lang="sr" path="translations/android_ui_widget_strings_sr.xtb" />
-    <file lang="sv" path="translations/android_ui_widget_strings_sv.xtb" />
-    <file lang="sw" path="translations/android_ui_widget_strings_sw.xtb" />
-    <file lang="ta" path="translations/android_ui_widget_strings_ta.xtb" />
-    <file lang="te" path="translations/android_ui_widget_strings_te.xtb" />
-    <file lang="th" path="translations/android_ui_widget_strings_th.xtb" />
-    <file lang="tr" path="translations/android_ui_widget_strings_tr.xtb" />
-    <file lang="uk" path="translations/android_ui_widget_strings_uk.xtb" />
-    <file lang="vi" path="translations/android_ui_widget_strings_vi.xtb" />
-    <file lang="zh-CN" path="translations/android_ui_widget_strings_zh-CN.xtb" />
-    <file lang="zh-TW" path="translations/android_ui_widget_strings_zh-TW.xtb" />
-  </translations>
-  <release allow_pseudo="false" seq="1">
-    <messages fallback_to_english="true">
-      <message name="IDS_ACCESSIBILITY_LIST_MENU_BUTTON" desc="Content description for the button that shows option menu for a list item.">
-        <ph name="NAME_OF_LIST_ITEM">%1$s<ex>Movie Title</ex></ph> Options
-      </message>
-      <message name="IDS_MORE" desc="Generic label for a button to show more items or options. [CHAR-LIMIT=20]">
-        More
-      </message>
-    </messages>
-  </release>
-</grit>
diff --git a/chrome/browser/ui/app_list/app_list_client_impl.cc b/chrome/browser/ui/app_list/app_list_client_impl.cc
index 2618cfa2..cc387ba 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl.cc
+++ b/chrome/browser/ui/app_list/app_list_client_impl.cc
@@ -98,7 +98,8 @@
                                          int event_flags,
                                          ash::AppListLaunchedFrom launched_from,
                                          ash::AppListLaunchType launch_type,
-                                         int suggestion_index) {
+                                         int suggestion_index,
+                                         bool launch_as_default) {
   if (!search_controller_)
     return;
 
@@ -127,6 +128,9 @@
   RecordSearchResultOpenTypeHistogram(
       launched_from, result->GetSearchResultType(), IsTabletMode());
 
+  if (launch_as_default)
+    RecordDefaultSearchResultOpenTypeHistogram(result->GetSearchResultType());
+
   if (!search_controller_->GetLastQueryLength() &&
       launched_from == ash::AppListLaunchedFrom::kLaunchedFromSearchBox)
     RecordZeroStateSuggestionOpenTypeHistogram(result->GetSearchResultType());
diff --git a/chrome/browser/ui/app_list/app_list_client_impl.h b/chrome/browser/ui/app_list/app_list_client_impl.h
index 34ffb075..036c28c 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl.h
+++ b/chrome/browser/ui/app_list/app_list_client_impl.h
@@ -54,7 +54,8 @@
                         int event_flags,
                         ash::AppListLaunchedFrom launched_from,
                         ash::AppListLaunchType launch_type,
-                        int suggestion_index) override;
+                        int suggestion_index,
+                        bool launch_as_default) override;
   void InvokeSearchResultAction(const std::string& result_id,
                                 int action_index,
                                 int event_flags) override;
diff --git a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
index 8bc30419..7bad64a7 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
+++ b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
@@ -284,7 +284,8 @@
   // Open the app result.
   client->OpenSearchResult(app_result_id, ui::EF_NONE,
                            ash::AppListLaunchedFrom::kLaunchedFromSearchBox,
-                           ash::AppListLaunchType::kAppSearchResult, 0);
+                           ash::AppListLaunchType::kAppSearchResult, 0,
+                           false /* launch_as_default */);
 
   // App list should be dismissed.
   EXPECT_FALSE(client->app_list_target_visibility());
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/app_list_launch_recorder.h b/chrome/browser/ui/app_list/search/search_result_ranker/app_list_launch_recorder.h
index 2a78d5c..eb32317 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/app_list_launch_recorder.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_list_launch_recorder.h
@@ -10,12 +10,15 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind.h"
 #include "base/callback_list.h"
 #include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/no_destructor.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
+#include "base/task/post_task.h"
+#include "content/public/browser/browser_thread.h"
 #include "third_party/metrics_proto/chrome_os_app_list_launch_event.pb.h"
 
 namespace app_list {
@@ -70,6 +73,14 @@
     static_assert(std::is_enum<T>::value,
                   "Non enum passed to AppListLaunchRecorder::Log");
 
+    if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
+      base::PostTask(
+          FROM_HERE, {content::BrowserThread::UI},
+          base::BindOnce(&AppListLaunchRecorder::Log<T>, base::Unretained(this),
+                         client, hashed, unhashed));
+      return;
+    }
+
     LaunchInfo event;
     event.client = client;
     for (const auto& pair : hashed)
diff --git a/chrome/browser/ui/ash/chrome_launcher_prefs.cc b/chrome/browser/ui/ash/chrome_launcher_prefs.cc
index c379913..987d4b41 100644
--- a/chrome/browser/ui/ash/chrome_launcher_prefs.cc
+++ b/chrome/browser/ui/ash/chrome_launcher_prefs.cc
@@ -428,6 +428,11 @@
   // Contains pins from sync regardless either real app available on device or
   // not.
   std::set<std::string> pins_from_sync_raw;
+
+  // Check that the camera app was pinned by a real app id or mapped internal
+  // app id.
+  bool has_pinned_camera_app = false;
+
   for (const auto& sync_peer : syncable_service->sync_items()) {
     if (!sync_peer.second->item_pin_ordinal.IsValid())
       continue;
@@ -440,12 +445,26 @@
       continue;
     }
 
-    // Prevent old app camera pinning.
-    if (IsCameraApp(sync_peer.first))
-      continue;
+    std::string pinned_app_id;
 
-    pin_infos.emplace_back(
-        PinInfo(sync_peer.first, sync_peer.second->item_pin_ordinal));
+    // Map any real camera app id to the internal camera app id.
+    if (IsCameraApp(sync_peer.first) ||
+        sync_peer.first == ash::kInternalAppIdCamera) {
+      // Prevent internal camera app being pinned twice.
+      if (has_pinned_camera_app) {
+        continue;
+      }
+      // Check the validity of internal camera app id.
+      if (!helper->IsValidIDForCurrentUser(ash::kInternalAppIdCamera)) {
+        continue;
+      }
+      has_pinned_camera_app = true;
+      pinned_app_id = ash::kInternalAppIdCamera;
+    } else {
+      pinned_app_id = sync_peer.first;
+    }
+
+    pin_infos.emplace_back(pinned_app_id, sync_peer.second->item_pin_ordinal);
   }
 
   // Make sure Chrome is always pinned.
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.cc b/chrome/browser/ui/content_settings/content_setting_image_model.cc
index 37a49758..9402c978 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model.cc
@@ -329,6 +329,10 @@
       ContentSettingImageModelStates::Get(contents)->SetAccessibilityNotified(
           image_type(), false);
     }
+    if (should_auto_open_bubble_) {
+      ContentSettingImageModelStates::Get(contents)->SetBubbleWasAutoOpened(
+          image_type(), false);
+    }
   }
 }
 
@@ -359,6 +363,19 @@
       image_type(), true);
 }
 
+bool ContentSettingImageModel::ShouldAutoOpenBubble(
+    content::WebContents* contents) {
+  return should_auto_open_bubble_ &&
+         !ContentSettingImageModelStates::Get(contents)->BubbleWasAutoOpened(
+             image_type());
+}
+
+void ContentSettingImageModel::SetBubbleWasAutoOpened(
+    content::WebContents* contents) {
+  ContentSettingImageModelStates::Get(contents)->SetBubbleWasAutoOpened(
+      image_type(), true);
+}
+
 // Generic blocked content settings --------------------------------------------
 
 ContentSettingBlockedImageModel::ContentSettingBlockedImageModel(
@@ -611,13 +628,15 @@
                  DidMicAccessFailBecauseOfSystemLevelBlock()) {
         set_icon(vector_icons::kVideocamIcon, kBlockedBadgeIcon);
         set_tooltip(l10n_util::GetStringUTF16(IDS_MICROPHONE_CAMERA_BLOCKED));
-        if (!content_settings->camera_was_just_granted_on_site_level() ||
-            !content_settings->mic_was_just_granted_on_site_level()) {
+        if (content_settings->camera_was_just_granted_on_site_level() ||
+            content_settings->mic_was_just_granted_on_site_level()) {
+          // Automatically trigger the new bubble, if the camera
+          // and/or mic was just granted on a site level, but blocked on a
+          // system level.
+          set_should_auto_open_bubble(true);
+        } else {
           set_explanatory_string_id(IDS_CAMERA_TURNED_OFF);
         }
-        // TODO(hkamila): Automatically trigger the new bubble, if the camera
-        // and/or mic was just granted on a site level, but blocked on a system
-        // level.
       } else {
         set_icon(vector_icons::kVideocamIcon, gfx::kNoneIcon);
         set_tooltip(l10n_util::GetStringUTF16(IDS_MICROPHONE_CAMERA_ALLOWED));
@@ -632,7 +651,9 @@
       } else if (DidCameraAccessFailBecauseOfSystemLevelBlock()) {
         set_icon(vector_icons::kVideocamIcon, kBlockedBadgeIcon);
         set_tooltip(l10n_util::GetStringUTF16(IDS_CAMERA_BLOCKED));
-        if (!content_settings->camera_was_just_granted_on_site_level()) {
+        if (content_settings->camera_was_just_granted_on_site_level()) {
+          set_should_auto_open_bubble(true);
+        } else {
           set_explanatory_string_id(IDS_CAMERA_TURNED_OFF);
         }
       } else {
@@ -649,7 +670,9 @@
       } else if (DidMicAccessFailBecauseOfSystemLevelBlock()) {
         set_icon(vector_icons::kMicIcon, kBlockedBadgeIcon);
         set_tooltip(l10n_util::GetStringUTF16(IDS_MICROPHONE_BLOCKED));
-        if (!content_settings->mic_was_just_granted_on_site_level()) {
+        if (content_settings->mic_was_just_granted_on_site_level()) {
+          set_should_auto_open_bubble(true);
+        } else {
           set_explanatory_string_id(IDS_MIC_TURNED_OFF);
         }
       } else {
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.h b/chrome/browser/ui/content_settings/content_setting_image_model.h
index 7f571db..5e0e59a 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model.h
+++ b/chrome/browser/ui/content_settings/content_setting_image_model.h
@@ -82,6 +82,13 @@
   // so that we do not restart it when the parent view is updated.
   void SetAnimationHasRun(content::WebContents* web_contents);
 
+  // Whether to automatically trigger the new bubble.
+  bool ShouldAutoOpenBubble(content::WebContents* contents);
+
+  // Remembers that the bubble was auto-opened for the given |web_contents|,
+  // so that we do not auto-open it again when the parent view is updated.
+  void SetBubbleWasAutoOpened(content::WebContents* contents);
+
   bool is_visible() const { return is_visible_; }
 
   // Retrieve the icon that represents this content setting. Blocked content
@@ -125,6 +132,9 @@
   }
 
   void set_tooltip(const base::string16& tooltip) { tooltip_ = tooltip; }
+  void set_should_auto_open_bubble(const bool should_auto_open_bubble) {
+    should_auto_open_bubble_ = should_auto_open_bubble;
+  }
 
  private:
   bool is_visible_ = false;
@@ -135,7 +145,7 @@
   base::string16 tooltip_;
   const ImageType image_type_;
   const bool image_type_should_notify_accessibility_;
-
+  bool should_auto_open_bubble_ = false;
   DISALLOW_COPY_AND_ASSIGN(ContentSettingImageModel);
 };
 
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_states.cc b/chrome/browser/ui/content_settings/content_setting_image_model_states.cc
index 137b068..593f8a60 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model_states.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_states.cc
@@ -48,6 +48,18 @@
   return accessibility_notified_[static_cast<int>(type)];
 }
 
+void ContentSettingImageModelStates::SetBubbleWasAutoOpened(
+    ImageType type,
+    bool bubble_was_auto_opened) {
+  VerifyType(type);
+  auto_opened_bubbles_[static_cast<int>(type)] = bubble_was_auto_opened;
+}
+
+bool ContentSettingImageModelStates::BubbleWasAutoOpened(ImageType type) const {
+  VerifyType(type);
+  return auto_opened_bubbles_[static_cast<int>(type)];
+}
+
 ContentSettingImageModelStates::ContentSettingImageModelStates(
     content::WebContents* contents) {}
 
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_states.h b/chrome/browser/ui/content_settings/content_setting_image_model_states.h
index 1a0a893..24d37d4 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model_states.h
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_states.h
@@ -27,6 +27,9 @@
   void SetAccessibilityNotified(ImageType type, bool notified);
   bool GetAccessibilityNotified(ImageType type) const;
 
+  void SetBubbleWasAutoOpened(ImageType type, bool animation_has_run);
+  bool BubbleWasAutoOpened(ImageType type) const;
+
  private:
   friend class content::WebContentsUserData<ContentSettingImageModelStates>;
   explicit ContentSettingImageModelStates(content::WebContents* contents);
@@ -45,6 +48,10 @@
   bool accessibility_notified_[static_cast<int>(ImageType::NUM_IMAGE_TYPES)] =
       {};
 
+  // Array of bool for whether the bubble was auto-opened for a given image
+  // model. This bit is reset to false when the image is hidden.
+  bool auto_opened_bubbles_[static_cast<int>(ImageType::NUM_IMAGE_TYPES)] = {};
+
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 
   DISALLOW_COPY_AND_ASSIGN(ContentSettingImageModelStates);
diff --git a/chrome/browser/ui/libgtkui/gtk_event_loop_x11.cc b/chrome/browser/ui/libgtkui/gtk_event_loop_x11.cc
index 02011d0..5224e946 100644
--- a/chrome/browser/ui/libgtkui/gtk_event_loop_x11.cc
+++ b/chrome/browser/ui/libgtkui/gtk_event_loop_x11.cc
@@ -16,6 +16,22 @@
 
 namespace libgtkui {
 
+namespace {
+
+// Xkb Events stores group attribute into XKeyEvent::state bit field while
+// GdkEventKey objects has separate fields for that purpose, they are ::state
+// and ::group respectively. So recompose them when build XKeyEvent from
+// GdkEventKey here. This is similar to XkbBuildCoreState(), but takes takes a
+// uint instead of assuming a 8-bit Xkb state.
+//
+// More details:
+// https://code.woboq.org/qt5/include/X11/extensions/XKB.h.html#_M/XkbBuildCoreState
+int BuildXkbStateFromGdkEvent(const GdkEventKey& keyev) {
+  return keyev.state | ((keyev.group & 0x3) << 13);
+}
+
+}  // namespace
+
 // static
 GtkEventLoopX11* GtkEventLoopX11::GetInstance() {
   return base::Singleton<GtkEventLoopX11>::get();
@@ -69,7 +85,7 @@
   x_event.xkey.window = GDK_WINDOW_XID(gdk_event_key.window);
   x_event.xkey.root = DefaultRootWindow(x_event.xkey.display);
   x_event.xkey.time = gdk_event_key.time;
-  x_event.xkey.state = gdk_event_key.state;
+  x_event.xkey.state = BuildXkbStateFromGdkEvent(gdk_event_key);
   x_event.xkey.keycode = gdk_event_key.hardware_keycode;
   x_event.xkey.same_screen = true;
 
diff --git a/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc
index 44c39030..1020110 100644
--- a/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc
@@ -425,7 +425,7 @@
   EXPECT_TRUE(model()->ReplaceToShowPromotionIfNeeded());
 
   AccountInfo account;
-  account.account_id = "foo_account_id";
+  account.account_id = CoreAccountId("foo_account_id");
   account.gaia = "foo_gaia_id";
   account.email = "foo@bar.com";
   EXPECT_CALL(*controller(), EnableSync(AccountEq(account), false));
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
index ccc69ef..5b0d6209 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -403,7 +403,7 @@
 
 void ManagePasswordsUIController::NeverSavePassword() {
   DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, GetState());
-  NeverSavePasswordInternal();
+  passwords_data_.form_manager()->OnNeverClicked();
   ClearPopUpFlagForBubble();
   if (passwords_data_.GetCurrentForms().empty())
     passwords_data_.OnInactive();
@@ -431,11 +431,13 @@
   }
 
   save_fallback_timer_.Stop();
-  SavePasswordInternal();
+  passwords_data_.form_manager()->Save();
   passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE);
   // The icon is to be updated after the bubble (either "Save password" or "Sign
   // in to Chrome") is closed.
   bubble_status_ = BubbleStatus::SHOWN_PENDING_ICON_UPDATE;
+  if (Browser* browser = chrome::FindBrowserWithWebContents(web_contents()))
+    browser->window()->GetAutofillBubbleHandler()->OnPasswordSaved();
 }
 
 void ManagePasswordsUIController::ChooseCredential(
@@ -516,21 +518,6 @@
   return are_passwords_revealed_when_next_bubble_is_opened_;
 }
 
-void ManagePasswordsUIController::SavePasswordInternal() {
-  passwords_data_.form_manager()->Save();
-  Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
-  if (!browser)
-    return;
-  browser->window()->GetAutofillBubbleHandler()->OnPasswordSaved();
-}
-
-void ManagePasswordsUIController::NeverSavePasswordInternal() {
-  password_manager::PasswordFormManagerForUI* form_manager =
-      passwords_data_.form_manager();
-  DCHECK(form_manager);
-  form_manager->OnNeverClicked();
-}
-
 void ManagePasswordsUIController::HidePasswordBubble() {
   if (TabDialogs* tab_dialogs = TabDialogs::FromWebContents(web_contents()))
     tab_dialogs->HideManagePasswordsBubble();
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.h b/chrome/browser/ui/passwords/manage_passwords_ui_controller.h
index 016dd3c..9971d33 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.h
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.h
@@ -151,11 +151,6 @@
   explicit ManagePasswordsUIController(
       content::WebContents* web_contents);
 
-  // The pieces of saving and blacklisting passwords that interact with
-  // FormManager, split off into internal functions for testing/mocking.
-  virtual void SavePasswordInternal();
-  virtual void NeverSavePasswordInternal();
-
   // Hides the bubble if opened. Mocked in the tests.
   virtual void HidePasswordBubble();
 
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
index 428c41d..9bf7e8c 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
@@ -8,50 +8,42 @@
 #include <vector>
 
 #include "base/bind.h"
-#include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/mock_callback.h"
 #include "build/build_config.h"
 #include "chrome/browser/ui/passwords/credential_leak_dialog_controller.h"
 #include "chrome/browser/ui/passwords/credential_manager_dialog_controller.h"
-#include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h"
 #include "chrome/browser/ui/passwords/manage_passwords_icon_view.h"
 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller_mock.h"
 #include "chrome/browser/ui/passwords/password_dialog_prompts.h"
 #include "chrome/browser/ui/passwords/passwords_model_delegate.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
-#include "chrome/test/base/testing_profile.h"
-#include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/password_form.h"
-#include "components/password_manager/core/browser/fake_form_fetcher.h"
+#include "components/password_manager/core/browser/mock_password_form_manager_for_ui.h"
 #include "components/password_manager/core/browser/password_bubble_experiment.h"
-#include "components/password_manager/core/browser/password_form_manager.h"
+#include "components/password_manager/core/browser/password_form_metrics_recorder.h"
 #include "components/password_manager/core/browser/statistics_table.h"
-#include "components/password_manager/core/browser/stub_form_saver.h"
 #include "components/password_manager/core/browser/stub_password_manager_client.h"
-#include "components/password_manager/core/browser/stub_password_manager_driver.h"
 #include "components/password_manager/core/common/password_manager_ui.h"
 #include "components/prefs/pref_service.h"
 #include "components/ukm/test_ukm_recorder.h"
-#include "components/variations/variations_associated_data.h"
 #include "content/public/browser/navigation_handle.h"
-#include "content/public/test/browser_task_environment.h"
 #include "content/public/test/mock_navigation_handle.h"
 #include "content/public/test/test_utils.h"
 #include "content/public/test/web_contents_tester.h"
-#include "services/metrics/public/cpp/ukm_source.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using autofill::FormData;
-using autofill::FormFieldData;
 using autofill::PasswordForm;
 using base::ASCIIToUTF16;
-using password_manager::PasswordFormManager;
+using password_manager::MockPasswordFormManagerForUI;
 using ::testing::_;
+using ::testing::AtMost;
 using ::testing::Contains;
 using ::testing::DoAll;
 using ::testing::ElementsAre;
@@ -59,6 +51,7 @@
 using ::testing::Not;
 using ::testing::Pointee;
 using ::testing::Return;
+using ::testing::ReturnRef;
 using ::testing::SaveArg;
 
 namespace {
@@ -85,15 +78,11 @@
 
 class TestManagePasswordsIconView : public ManagePasswordsIconView {
  public:
-  TestManagePasswordsIconView() = default;
-
   void SetState(password_manager::ui::State state) override { state_ = state; }
   password_manager::ui::State state() { return state_; }
 
  private:
   password_manager::ui::State state_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestManagePasswordsIconView);
 };
 
 // This sublass is used to disable some code paths which are not essential for
@@ -103,7 +92,6 @@
   TestManagePasswordsUIController(
       content::WebContents* contents,
       password_manager::PasswordManagerClient* client);
-  ~TestManagePasswordsUIController() override;
 
   bool opened_bubble() const { return opened_bubble_; }
   bool opened_automatic_bubble() const { return opened_automatic_bubble_; }
@@ -123,8 +111,6 @@
 
  private:
   void UpdateBubbleAndIconVisibility() override;
-  void SavePasswordInternal() override {}
-  void NeverSavePasswordInternal() override;
   void HidePasswordBubble() override;
   bool ShowAuthenticationDialog() override { return true; }
 
@@ -144,8 +130,6 @@
   set_client(client);
 }
 
-TestManagePasswordsUIController::~TestManagePasswordsUIController() = default;
-
 void TestManagePasswordsUIController::UpdateBubbleAndIconVisibility() {
   opened_bubble_ = ShouldBubblePopUp();
   opened_automatic_bubble_ = IsAutomaticallyOpeningBubble();
@@ -160,17 +144,6 @@
   }
 }
 
-void TestManagePasswordsUIController::NeverSavePasswordInternal() {
-  PasswordForm blacklisted;
-  blacklisted.origin = this->GetOrigin();
-  blacklisted.signon_realm = blacklisted.origin.spec();
-  blacklisted.blacklisted_by_user = true;
-  password_manager::PasswordStoreChange change(
-      password_manager::PasswordStoreChange::ADD, blacklisted);
-  password_manager::PasswordStoreChangeList list(1, change);
-  OnLoginsChanged(list);
-}
-
 void TestManagePasswordsUIController::HidePasswordBubble() {
   opened_automatic_bubble_ = false;
   are_passwords_revealed_in_opened_bubble_ = false;
@@ -184,22 +157,15 @@
 
 class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness {
  public:
-  ManagePasswordsUIControllerTest() : field_trial_list_(nullptr) {
-    fetcher_.Fetch();
-  }
-
   void SetUp() override;
 
   password_manager::StubPasswordManagerClient& client() { return client_; }
-  password_manager::FakeFormFetcher& fetcher() { return fetcher_; }
   PasswordForm& test_local_form() { return test_local_form_; }
   PasswordForm& test_federated_form() { return test_federated_form_; }
-  FormData& submitted_form() { return submitted_form_; }
-  FormData& observed_form() { return observed_form_; }
+  PasswordForm& submitted_form() { return submitted_form_; }
   CredentialManagementDialogPromptMock& dialog_prompt() {
     return dialog_prompt_;
   }
-  password_manager::PasswordManagerDriver& driver() { return driver_; }
 
   TestManagePasswordsUIController* controller() {
     return static_cast<TestManagePasswordsUIController*>(
@@ -209,39 +175,20 @@
   void ExpectIconStateIs(password_manager::ui::State state);
   void ExpectIconAndControllerStateIs(password_manager::ui::State state);
 
-  std::unique_ptr<PasswordFormManager> CreateFormManagerWithBestMatches(
-      const FormData& observed_form,
-      const std::vector<const PasswordForm*>& best_matches,
-      scoped_refptr<password_manager::PasswordFormMetricsRecorder>
-          metrics_recorder);
-
-  std::unique_ptr<PasswordFormManager> CreateFormManagerWithBlacklistedMatches(
-      const FormData& observed_form,
-      bool is_blacklisted,
-      scoped_refptr<password_manager::PasswordFormMetricsRecorder>
-          metrics_recorder);
-
-  std::unique_ptr<PasswordFormManager> CreateFormManager();
-
-  std::unique_ptr<PasswordFormManager> CreateFormManagerWithMetricsRecorder(
-      scoped_refptr<password_manager::PasswordFormMetricsRecorder>
-          metrics_recorder);
+  std::unique_ptr<MockPasswordFormManagerForUI>
+  CreateFormManagerWithBestMatches(
+      const std::vector<const PasswordForm*>* best_matches,
+      bool is_blacklisted = false);
 
   // Tests that the state is not changed when the password is autofilled.
   void TestNotChangingStateOnAutofill(password_manager::ui::State state);
 
-  MOCK_METHOD1(CredentialCallback, void(const PasswordForm*));
-
  private:
   password_manager::StubPasswordManagerClient client_;
-  password_manager::StubPasswordManagerDriver driver_;
-  password_manager::FakeFormFetcher fetcher_;
 
   PasswordForm test_local_form_;
   PasswordForm test_federated_form_;
-  FormData submitted_form_;
-  FormData observed_form_;
-  base::FieldTrialList field_trial_list_;
+  PasswordForm submitted_form_;
   CredentialManagementDialogPromptMock dialog_prompt_;
 };
 
@@ -264,24 +211,9 @@
   test_federated_form_.federation_origin =
       url::Origin::Create(GURL("https://federation.test/"));
 
-  // Create a simple sign-in form.
-  observed_form_.url = test_local_form_.origin;
-  FormFieldData field;
-  field.name = ASCIIToUTF16("username_element");
-  field.form_control_type = "text";
-  observed_form_.fields.push_back(field);
-  field.name = ASCIIToUTF16("password_element");
-  field.form_control_type = "password";
-  observed_form_.fields.push_back(field);
-
-  submitted_form_ = observed_form_;
-  // Set username and password.
-  submitted_form_.fields[0].value = test_local_form_.username_value;
-  submitted_form_.fields[1].value = test_local_form_.password_value;
-
-  // Turn off waiting for server predictions in order to avoid dealing with
-  // posted tasks.
-  PasswordFormManager::set_wait_for_server_predictions_for_filling(false);
+  submitted_form_ = test_local_form_;
+  submitted_form_.username_value = ASCIIToUTF16("submitted_username");
+  submitted_form_.password_value = ASCIIToUTF16("pass12345");
 
   // We need to be on a "webby" URL for most tests.
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
@@ -302,47 +234,35 @@
   EXPECT_EQ(state, controller()->GetState());
 }
 
-std::unique_ptr<PasswordFormManager>
+std::unique_ptr<MockPasswordFormManagerForUI>
 ManagePasswordsUIControllerTest::CreateFormManagerWithBestMatches(
-    const FormData& observed_form,
-    const std::vector<const PasswordForm*>& best_matches,
-    scoped_refptr<password_manager::PasswordFormMetricsRecorder>
-        metrics_recorder) {
-  auto form_manager = std::make_unique<PasswordFormManager>(
-      &client_, driver_.AsWeakPtr(), observed_form, &fetcher_,
-      std::make_unique<password_manager::StubFormSaver>(), metrics_recorder);
-  fetcher_.SetNonFederated(best_matches);
-  fetcher_.NotifyFetchCompleted();
+    const std::vector<const PasswordForm*>* best_matches,
+    bool is_blacklisted) {
+  auto form_manager =
+      std::make_unique<testing::StrictMock<MockPasswordFormManagerForUI>>();
+  EXPECT_CALL(*form_manager, GetBestMatches())
+      .Times(AtMost(1))
+      .WillOnce(ReturnRef(*best_matches));
+  EXPECT_CALL(*form_manager, GetFederatedMatches())
+      .Times(AtMost(1))
+      .WillOnce(Return(std::vector<const autofill::PasswordForm*>()));
+  EXPECT_CALL(*form_manager, GetOrigin())
+      .Times(AtMost(1))
+      .WillOnce(ReturnRef(test_local_form_.origin));
+  EXPECT_CALL(*form_manager, IsBlacklisted())
+      .Times(AtMost(1))
+      .WillOnce(Return(is_blacklisted));
+  EXPECT_CALL(*form_manager, GetInteractionsStats())
+      .Times(AtMost(1))
+      .WillOnce(
+          Return(base::span<const password_manager::InteractionsStats>()));
+  EXPECT_CALL(*form_manager, GetPendingCredentials())
+      .WillRepeatedly(ReturnRef(submitted_form_));
+  EXPECT_CALL(*form_manager, GetMetricsRecorder())
+      .WillRepeatedly(Return(nullptr));
   return form_manager;
 }
 
-std::unique_ptr<PasswordFormManager>
-ManagePasswordsUIControllerTest::CreateFormManagerWithBlacklistedMatches(
-    const FormData& observed_form,
-    bool is_blacklisted,
-    scoped_refptr<password_manager::PasswordFormMetricsRecorder>
-        metrics_recorder) {
-  auto form_manager = std::make_unique<PasswordFormManager>(
-      &client_, driver_.AsWeakPtr(), observed_form, &fetcher_,
-      std::make_unique<password_manager::StubFormSaver>(), metrics_recorder);
-  fetcher_.SetBlacklisted(is_blacklisted);
-  fetcher_.NotifyFetchCompleted();
-  return form_manager;
-}
-
-std::unique_ptr<PasswordFormManager>
-ManagePasswordsUIControllerTest::CreateFormManager() {
-  return CreateFormManagerWithMetricsRecorder(nullptr);
-}
-
-std::unique_ptr<PasswordFormManager>
-ManagePasswordsUIControllerTest::CreateFormManagerWithMetricsRecorder(
-    scoped_refptr<password_manager::PasswordFormMetricsRecorder>
-        metrics_recorder) {
-  return CreateFormManagerWithBestMatches(observed_form(), {},
-                                          metrics_recorder);
-}
-
 void ManagePasswordsUIControllerTest::TestNotChangingStateOnAutofill(
     password_manager::ui::State state) {
   DCHECK(state == password_manager::ui::PENDING_PASSWORD_STATE ||
@@ -350,8 +270,9 @@
          state == password_manager::ui::CONFIRMATION_STATE);
 
   // Set the bubble state to |state|.
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  std::unique_ptr<MockPasswordFormManagerForUI> test_form_manager =
+      CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   if (state == password_manager::ui::PENDING_PASSWORD_STATE)
     controller()->OnPasswordSubmitted(std::move(test_form_manager));
@@ -362,8 +283,7 @@
   ASSERT_EQ(state, controller()->GetState());
 
   // Autofill happens.
-  std::vector<const PasswordForm*> forms;
-  forms.push_back(&test_local_form());
+  std::vector<const PasswordForm*> forms = {&test_local_form()};
   controller()->OnPasswordAutofilled(forms, forms.front()->origin, nullptr);
 
   // State shouldn't changed.
@@ -377,26 +297,24 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, PasswordAutofilled) {
-  const PasswordForm* test_form_ptr = &test_local_form();
-  base::string16 kTestUsername = test_form_ptr->username_value;
-  std::vector<const PasswordForm*> forms;
-  forms.push_back(test_form_ptr);
+  std::vector<const PasswordForm*> forms = {&test_local_form()};
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnPasswordAutofilled(forms, forms.front()->origin, nullptr);
 
-  EXPECT_EQ(test_form_ptr->origin, controller()->GetOrigin());
+  EXPECT_EQ(test_local_form().origin, controller()->GetOrigin());
   ASSERT_EQ(1u, controller()->GetCurrentForms().size());
-  EXPECT_EQ(kTestUsername, controller()->GetCurrentForms()[0]->username_value);
+  EXPECT_EQ(test_local_form().username_value,
+            controller()->GetCurrentForms()[0]->username_value);
 
   // Controller should store a separate copy of the form as it doesn't own it.
-  EXPECT_NE(test_form_ptr, controller()->GetCurrentForms()[0].get());
+  EXPECT_NE(&test_local_form(), controller()->GetCurrentForms()[0].get());
 
   ExpectIconAndControllerStateIs(password_manager::ui::MANAGE_STATE);
 }
 
 TEST_F(ManagePasswordsUIControllerTest, PasswordSubmitted) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
   EXPECT_TRUE(controller()->opened_automatic_bubble());
@@ -406,9 +324,9 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, BlacklistedFormPasswordSubmitted) {
-  std::unique_ptr<PasswordFormManager> test_form_manager =
-      CreateFormManagerWithBlacklistedMatches(observed_form(),
-                                              /*is_blacklisted=*/true, nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager =
+      CreateFormManagerWithBestMatches(&best_matches, /*is_blacklisted=*/true);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
   EXPECT_FALSE(controller()->opened_automatic_bubble());
@@ -417,13 +335,14 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedBubbleSuppressed) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   std::vector<password_manager::InteractionsStats> stats(1);
-  stats[0].origin_domain = test_local_form().origin.GetOrigin();
-  stats[0].username_value = test_local_form().username_value;
+  stats[0].origin_domain = submitted_form().origin.GetOrigin();
+  stats[0].username_value = submitted_form().username_value;
   stats[0].dismissal_count = kGreatDissmisalCount;
-  fetcher().set_stats(stats);
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  EXPECT_CALL(*test_form_manager, GetInteractionsStats)
+      .WillRepeatedly(Return(stats));
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
   EXPECT_FALSE(controller()->opened_automatic_bubble());
@@ -431,24 +350,23 @@
   EXPECT_EQ(stats[0], *controller()->GetCurrentInteractionStats());
 
   ExpectIconAndControllerStateIs(password_manager::ui::PENDING_PASSWORD_STATE);
-  variations::testing::ClearAllVariationParams();
 }
 
 TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedBubbleNotSuppressed) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   std::vector<password_manager::InteractionsStats> stats(1);
-  stats[0].origin_domain = test_local_form().origin.GetOrigin();
+  stats[0].origin_domain = submitted_form().origin.GetOrigin();
   stats[0].username_value = ASCIIToUTF16("not my username");
   stats[0].dismissal_count = kGreatDissmisalCount;
-  fetcher().set_stats(stats);
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  EXPECT_CALL(*test_form_manager, GetInteractionsStats)
+      .WillRepeatedly(Return(stats));
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
   EXPECT_TRUE(controller()->opened_automatic_bubble());
   EXPECT_FALSE(controller()->GetCurrentInteractionStats());
 
   ExpectIconAndControllerStateIs(password_manager::ui::PENDING_PASSWORD_STATE);
-  variations::testing::ClearAllVariationParams();
 }
 
 TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedBubbleCancelled) {
@@ -461,8 +379,8 @@
       ManagePasswordsUIController::FromWebContents(web_content.get());
   controller->set_client(&client());
 
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   // The bubble is ready to open but the tab is inactive. Therefore, we don't
   // call UpdateIconAndBubbleState here.
   controller->OnPasswordSubmitted(std::move(test_form_manager));
@@ -476,14 +394,15 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, PasswordSaved) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
+  EXPECT_CALL(*test_form_manager, Save());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
 
   base::HistogramTester histogram_tester;
-  controller()->SavePassword(test_local_form().username_value,
-                             test_local_form().password_value);
+  controller()->SavePassword(submitted_form().username_value,
+                             submitted_form().password_value);
   ExpectIconAndControllerStateIs(password_manager::ui::MANAGE_STATE);
   histogram_tester.ExpectUniqueSample(
       "PasswordManager.PasswordSavedWithManualFallback", false, 1);
@@ -514,17 +433,25 @@
             true /*is_main_frame_secure*/, source_id);
 
     // Exercise controller.
-    std::unique_ptr<PasswordFormManager> test_form_manager(
-        CreateFormManagerWithMetricsRecorder(recorder));
-    test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+    std::vector<const PasswordForm*> best_matches;
+    auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
+    EXPECT_CALL(*test_form_manager, GetMetricsRecorder)
+        .WillRepeatedly(Return(recorder.get()));
     EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
+    EXPECT_CALL(*test_form_manager,
+                OnUpdateUsernameFromPrompt(ASCIIToUTF16("other_username")))
+        .Times(test.edit_username);
+    EXPECT_CALL(*test_form_manager,
+                OnUpdatePasswordFromPrompt(ASCIIToUTF16("other_pwd")))
+        .Times(test.change_password);
+    EXPECT_CALL(*test_form_manager, Save());
     controller()->OnPasswordSubmitted(std::move(test_form_manager));
 
     controller()->SavePassword(
         test.edit_username ? base::UTF8ToUTF16("other_username")
-                           : test_local_form().username_value,
+                           : submitted_form().username_value,
         test.change_password ? base::UTF8ToUTF16("other_pwd")
-                             : test_local_form().password_value);
+                             : submitted_form().password_value);
     ExpectIconAndControllerStateIs(password_manager::ui::MANAGE_STATE);
 
     // Fake navigation so that the old form manager gets destroyed and
@@ -573,9 +500,11 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, PasswordBlacklisted) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
+
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
+  EXPECT_CALL(*test_form_manager, OnNeverClicked());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
 
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
@@ -585,11 +514,10 @@
 
 TEST_F(ManagePasswordsUIControllerTest,
        PasswordBlacklistedWithExistingCredentials) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(
-      CreateFormManagerWithBestMatches(observed_form(), {&test_local_form()},
-                                       nullptr));
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches = {&test_local_form()};
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
+  EXPECT_CALL(*test_form_manager, OnNeverClicked());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
 
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
@@ -598,7 +526,8 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, NormalNavigations) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
+  std::vector<const PasswordForm*> best_matches = {&test_local_form()};
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
   ExpectIconAndControllerStateIs(password_manager::ui::PENDING_PASSWORD_STATE);
@@ -613,12 +542,13 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, NormalNavigationsClosedBubble) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
+  EXPECT_CALL(*test_form_manager, Save());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
-  controller()->SavePassword(test_local_form().username_value,
-                             test_local_form().password_value);
+  controller()->SavePassword(submitted_form().username_value,
+                             submitted_form().password_value);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnBubbleHidden();
   ExpectIconAndControllerStateIs(password_manager::ui::MANAGE_STATE);
@@ -637,8 +567,8 @@
   content::WebContentsTester::For(web_contents())
       ->NavigateAndCommit(GURL("chrome://sign-in"));
 
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
   EXPECT_EQ(GURL::EmptyGURL(), controller()->GetOrigin());
@@ -665,7 +595,8 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, AutomaticPasswordSave) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnAutomaticPasswordSave(std::move(test_form_manager));
   EXPECT_EQ(password_manager::ui::CONFIRMATION_STATE, controller()->GetState());
@@ -686,10 +617,9 @@
   EXPECT_CALL(dialog_prompt(), ShowAccountChooser());
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   EXPECT_CALL(*controller(), HasBrowserWindow()).WillOnce(Return(true));
-  EXPECT_TRUE(controller()->OnChooseCredentials(
-      std::move(local_credentials), origin,
-      base::Bind(&ManagePasswordsUIControllerTest::CredentialCallback,
-                 base::Unretained(this))));
+  base::MockCallback<ManagePasswordsState::CredentialsCallback> choose_callback;
+  EXPECT_TRUE(controller()->OnChooseCredentials(std::move(local_credentials),
+                                                origin, choose_callback.Get()));
   EXPECT_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE,
             controller()->GetState());
   EXPECT_EQ(origin, controller()->GetOrigin());
@@ -700,7 +630,7 @@
   ExpectIconStateIs(password_manager::ui::INACTIVE_STATE);
 
   EXPECT_CALL(dialog_prompt(), ControllerGone());
-  EXPECT_CALL(*this, CredentialCallback(Pointee(test_local_form())));
+  EXPECT_CALL(choose_callback, Run(Pointee(test_local_form())));
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   dialog_controller->OnChooseCredentials(
       *dialog_controller->GetLocalForms()[0],
@@ -719,10 +649,9 @@
   EXPECT_CALL(dialog_prompt(), ShowAccountChooser());
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   EXPECT_CALL(*controller(), HasBrowserWindow()).WillOnce(Return(true));
-  EXPECT_TRUE(controller()->OnChooseCredentials(
-      std::move(local_credentials), origin,
-      base::Bind(&ManagePasswordsUIControllerTest::CredentialCallback,
-                 base::Unretained(this))));
+  base::MockCallback<ManagePasswordsState::CredentialsCallback> choose_callback;
+  EXPECT_TRUE(controller()->OnChooseCredentials(std::move(local_credentials),
+                                                origin, choose_callback.Get()));
   EXPECT_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE,
             controller()->GetState());
   EXPECT_EQ(origin, controller()->GetOrigin());
@@ -733,7 +662,7 @@
   ExpectIconStateIs(password_manager::ui::INACTIVE_STATE);
 
   EXPECT_CALL(dialog_prompt(), ControllerGone());
-  EXPECT_CALL(*this, CredentialCallback(Pointee(test_federated_form())));
+  EXPECT_CALL(choose_callback, Run(Pointee(test_federated_form())));
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   dialog_controller->OnChooseCredentials(
       *dialog_controller->GetLocalForms()[0],
@@ -752,16 +681,15 @@
   EXPECT_CALL(dialog_prompt(), ShowAccountChooser());
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   EXPECT_CALL(*controller(), HasBrowserWindow()).WillOnce(Return(true));
-  EXPECT_TRUE(controller()->OnChooseCredentials(
-      std::move(local_credentials), origin,
-      base::Bind(&ManagePasswordsUIControllerTest::CredentialCallback,
-                 base::Unretained(this))));
+  base::MockCallback<ManagePasswordsState::CredentialsCallback> choose_callback;
+  EXPECT_TRUE(controller()->OnChooseCredentials(std::move(local_credentials),
+                                                origin, choose_callback.Get()));
   EXPECT_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE,
             controller()->GetState());
   EXPECT_EQ(origin, controller()->GetOrigin());
 
   EXPECT_CALL(dialog_prompt(), ControllerGone()).Times(0);
-  EXPECT_CALL(*this, CredentialCallback(nullptr));
+  EXPECT_CALL(choose_callback, Run(nullptr));
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   dialog_controller->OnCloseDialog();
   EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->GetState());
@@ -775,10 +703,9 @@
   // Simulate requesting a credential during prefetch. The tab has no associated
   // browser. Nothing should happen.
   EXPECT_CALL(*controller(), HasBrowserWindow()).WillOnce(Return(false));
+  base::MockCallback<ManagePasswordsState::CredentialsCallback> choose_callback;
   EXPECT_FALSE(controller()->OnChooseCredentials(
-      std::move(local_credentials), origin,
-      base::Bind(&ManagePasswordsUIControllerTest::CredentialCallback,
-                 base::Unretained(this))));
+      std::move(local_credentials), origin, choose_callback.Get()));
   EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->GetState());
 }
 
@@ -794,10 +721,9 @@
   EXPECT_CALL(dialog_prompt(), ShowAccountChooser());
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   EXPECT_CALL(*controller(), HasBrowserWindow()).WillOnce(Return(true));
-  EXPECT_TRUE(controller()->OnChooseCredentials(
-      std::move(local_credentials), origin,
-      base::Bind(&ManagePasswordsUIControllerTest::CredentialCallback,
-                 base::Unretained(this))));
+  base::MockCallback<ManagePasswordsState::CredentialsCallback> choose_callback;
+  EXPECT_TRUE(controller()->OnChooseCredentials(std::move(local_credentials),
+                                                origin, choose_callback.Get()));
   EXPECT_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE,
             controller()->GetState());
   EXPECT_EQ(origin, controller()->GetOrigin());
@@ -807,7 +733,7 @@
   ExpectIconStateIs(password_manager::ui::INACTIVE_STATE);
 
   EXPECT_CALL(dialog_prompt(), ControllerGone());
-  EXPECT_CALL(*this, CredentialCallback(Pointee(test_local_form())));
+  EXPECT_CALL(choose_callback, Run(Pointee(test_local_form())));
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   dialog_controller->OnChooseCredentials(
       *dialog_controller->GetLocalForms()[0],
@@ -909,7 +835,8 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, UpdatePasswordSubmitted) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnUpdatePasswordSubmitted(std::move(test_form_manager));
   ExpectIconAndControllerStateIs(
@@ -917,16 +844,17 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, PasswordUpdated) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> best_matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&best_matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
+  EXPECT_CALL(*test_form_manager, Save());
   controller()->OnUpdatePasswordSubmitted(std::move(test_form_manager));
 
   ExpectIconAndControllerStateIs(
       password_manager::ui::PENDING_PASSWORD_UPDATE_STATE);
   base::HistogramTester histogram_tester;
-  controller()->SavePassword(test_local_form().username_value,
-                             test_local_form().password_value);
+  controller()->SavePassword(submitted_form().username_value,
+                             submitted_form().password_value);
   ExpectIconAndControllerStateIs(password_manager::ui::MANAGE_STATE);
   histogram_tester.ExpectUniqueSample(
       "PasswordManager.PasswordSavedWithManualFallback", false, 1);
@@ -982,10 +910,12 @@
     auto recorder =
         base::MakeRefCounted<password_manager::PasswordFormMetricsRecorder>(
             true /*is_main_frame_secure*/, source_id);
-    std::unique_ptr<PasswordFormManager> test_form_manager(
-        CreateFormManagerWithMetricsRecorder(recorder));
+    std::vector<const PasswordForm*> matches;
+    auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
+    EXPECT_CALL(*test_form_manager, GetMetricsRecorder)
+        .WillRepeatedly(Return(recorder.get()));
+    EXPECT_CALL(*test_form_manager, Save());
 
-    test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
     EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility()).Times(3);
     controller()->OnShowManualFallbackForSaving(
         std::move(test_form_manager), false /* has_generated_password */,
@@ -996,8 +926,8 @@
     EXPECT_FALSE(controller()->opened_automatic_bubble());
 
     // A user clicks on omnibox icon, opens the bubble and press Save/Update.
-    controller()->SavePassword(test_local_form().username_value,
-                               test_local_form().password_value);
+    controller()->SavePassword(submitted_form().username_value,
+                               submitted_form().password_value);
 
     // Fake navigation so that the old form manager gets destroyed and
     // reports its metrics. Need to close the bubble, otherwise the bubble
@@ -1033,12 +963,8 @@
   for (bool is_update : {false, true}) {
     SCOPED_TRACE(testing::Message("is_update = ") << is_update);
     // Create password form manager with stored passwords.
-    std::unique_ptr<PasswordFormManager> test_form_manager(
-        CreateFormManagerWithBestMatches(observed_form(), {&test_local_form()},
-                                         nullptr));
-
-    // Simulate user typing a password.
-    test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+    std::vector<const PasswordForm*> matches = {&test_local_form()};
+    auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
 
     EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
     controller()->OnShowManualFallbackForSaving(
@@ -1064,11 +990,8 @@
 TEST_F(ManagePasswordsUIControllerTest,
        ManualFallbackForSaving_HideFallback_WithoutPreexistingPasswords) {
   // Create password form manager without stored passwords.
-  std::unique_ptr<PasswordFormManager> test_form_manager(
-      CreateFormManagerWithBestMatches(observed_form(), {}, nullptr));
-
-  // Simulate user typing a password.
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
 
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnShowManualFallbackForSaving(
@@ -1092,8 +1015,8 @@
                  << enforce_navigation);
     ManagePasswordsUIController::set_save_fallback_timeout_in_seconds(0);
 
-    std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-    test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+    std::vector<const PasswordForm*> matches;
+    auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
 
     EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
     controller()->OnShowManualFallbackForSaving(
@@ -1129,10 +1052,11 @@
                  << user_saved_password);
 
     ManagePasswordsUIController::set_save_fallback_timeout_in_seconds(0);
-    std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-    test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+    std::vector<const PasswordForm*> matches;
+    auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
 
     EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
+    EXPECT_CALL(*test_form_manager, Save()).Times(user_saved_password);
     controller()->OnShowManualFallbackForSaving(
         std::move(test_form_manager), false /* has_generated_password */,
         false /* is_update */);
@@ -1150,8 +1074,8 @@
         password_manager::ui::PENDING_PASSWORD_STATE);
 
     if (user_saved_password) {
-      controller()->SavePassword(test_local_form().username_value,
-                                 test_local_form().password_value);
+      controller()->SavePassword(submitted_form().username_value,
+                                 submitted_form().password_value);
       ExpectIconAndControllerStateIs(password_manager::ui::MANAGE_STATE);
     } else {
       // A user closed the bubble. The fallback should be hidden after
@@ -1169,8 +1093,13 @@
 
 TEST_F(ManagePasswordsUIControllerTest,
        ManualFallbackForSavingFollowedByAutomaticBubble) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
+  PasswordForm pending = test_local_form();
+  pending.username_value = ASCIIToUTF16("manual_username");
+  pending.password_value = ASCIIToUTF16("manual_pass1234");
+  EXPECT_CALL(*test_form_manager, GetPendingCredentials())
+      .WillRepeatedly(ReturnRef(pending));
 
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnShowManualFallbackForSaving(
@@ -1183,19 +1112,15 @@
   controller()->OnBubbleShown();
 
   // Automatic form submission detected.
-  test_form_manager = CreateFormManager();
-  FormData form = submitted_form();
-  form.fields[0].value = ASCIIToUTF16("some_other_username");
-  form.fields[1].value = ASCIIToUTF16("password123");
-  test_form_manager->ProvisionallySave(form, &driver(), nullptr);
+  test_form_manager = CreateFormManagerWithBestMatches(&matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility()).Times(0);
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
 
   // It should have no effect as the bubble was already open.
   ExpectIconAndControllerStateIs(password_manager::ui::PENDING_PASSWORD_STATE);
-  EXPECT_EQ(test_local_form().username_value,
+  EXPECT_EQ(ASCIIToUTF16("manual_username"),
             controller()->GetPendingPassword().username_value);
-  EXPECT_EQ(test_local_form().password_value,
+  EXPECT_EQ(ASCIIToUTF16("manual_pass1234"),
             controller()->GetPendingPassword().password_value);
 }
 
@@ -1204,10 +1129,8 @@
   for (bool user_closed_bubble : {false, true}) {
     SCOPED_TRACE(testing::Message("user_closed_bubble = ")
                  << user_closed_bubble);
-    std::unique_ptr<PasswordFormManager> test_form_manager(
-        CreateFormManagerWithBestMatches(observed_form(), {&test_local_form()},
-                                         nullptr));
-    test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+    std::vector<const PasswordForm*> matches = {&test_local_form()};
+    auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
     EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
     controller()->OnShowManualFallbackForSaving(
         std::move(test_form_manager), true /* has_generated_password */, false);
@@ -1228,13 +1151,14 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, AutofillDuringSignInPromo) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
+  EXPECT_CALL(*test_form_manager, Save());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
 
-  controller()->SavePassword(test_local_form().username_value,
-                             test_local_form().password_value);
+  controller()->SavePassword(submitted_form().username_value,
+                             submitted_form().password_value);
   // The state is 'Managed' but the bubble may still be on the screen showing
   // the sign-in promo.
   ExpectIconAndControllerStateIs(password_manager::ui::MANAGE_STATE);
@@ -1250,8 +1174,8 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, AuthenticateUserToRevealPasswords) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
-  test_form_manager->ProvisionallySave(submitted_form(), &driver(), nullptr);
+  std::vector<const PasswordForm*> matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnPasswordSubmitted(std::move(test_form_manager));
   EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE,
@@ -1280,7 +1204,8 @@
 }
 
 TEST_F(ManagePasswordsUIControllerTest, UpdateBubbleAfterLeakCheck) {
-  std::unique_ptr<PasswordFormManager> test_form_manager(CreateFormManager());
+  std::vector<const PasswordForm*> matches;
+  auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
   EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
   controller()->OnUpdatePasswordSubmitted(std::move(test_form_manager));
   EXPECT_TRUE(controller()->opened_automatic_bubble());
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
index 2246a6d..05e7491 100644
--- a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
+++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
@@ -110,6 +110,11 @@
     content_setting_image_model_->AccessibilityWasNotified(web_contents);
   }
 
+  if (content_setting_image_model_->ShouldAutoOpenBubble(web_contents)) {
+    ShowBubbleImpl();
+    content_setting_image_model_->SetBubbleWasAutoOpened(web_contents);
+  }
+
   // If the content usage or blockage should be indicated to the user, start the
   // animation and record that the icon has been shown.
   if (!can_animate_ ||
@@ -174,6 +179,10 @@
 }
 
 bool ContentSettingImageView::ShowBubble(const ui::Event& event) {
+  return ShowBubbleImpl();
+}
+
+bool ContentSettingImageView::ShowBubbleImpl() {
   PauseAnimation();
   content::WebContents* web_contents =
       delegate_->GetContentSettingWebContents();
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.h b/chrome/browser/ui/views/location_bar/content_setting_image_view.h
index 32a45df..c2aa9d9b 100644
--- a/chrome/browser/ui/views/location_bar/content_setting_image_view.h
+++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.h
@@ -67,6 +67,8 @@
 
   void disable_animation() { can_animate_ = false; }
 
+  bool ShowBubbleImpl();
+
   // IconLabelBubbleView:
   const char* GetClassName() const override;
   void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
diff --git a/chrome/browser/ui/webui/identity_internals_ui_browsertest.cc b/chrome/browser/ui/webui/identity_internals_ui_browsertest.cc
index ac4a25d..6a6d01d4 100644
--- a/chrome/browser/ui/webui/identity_internals_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/identity_internals_ui_browsertest.cc
@@ -51,8 +51,7 @@
       extensions::IdentityTokenCacheValue(token_id,
           base::TimeDelta::FromSeconds(time_to_live));
   extensions::ExtensionTokenKey key(
-      extension_id,
-      "test@example.com",
+      extension_id, CoreAccountId("account_id"),
       std::set<std::string>(scopes.begin(), scopes.end()));
   extensions::IdentityAPI::GetFactoryInstance()
       ->Get(browser()->profile())
diff --git a/chrome/browser/vr/metrics/session_metrics_helper.cc b/chrome/browser/vr/metrics/session_metrics_helper.cc
index 8703e9e..a5ee4a1 100644
--- a/chrome/browser/vr/metrics/session_metrics_helper.cc
+++ b/chrome/browser/vr/metrics/session_metrics_helper.cc
@@ -60,6 +60,106 @@
 
 }  // namespace
 
+WebXRSessionTracker::WebXRSessionTracker(
+    std::unique_ptr<ukm::builders::XR_WebXR_Session> entry)
+    : SessionTracker<ukm::builders::XR_WebXR_Session>(std::move(entry)),
+      receiver_(this) {}
+
+WebXRSessionTracker::~WebXRSessionTracker() = default;
+
+void WebXRSessionTracker::RecordRequestedFeatures(
+    const device::mojom::XRSessionOptions& session_options,
+    const std::set<device::mojom::XRSessionFeature>& enabled_features) {
+  using device::mojom::XRSessionFeature;
+  using device::mojom::XRSessionFeatureRequestStatus;
+
+  // Set all features as 'not requested', to begin
+  SetFeatureRequest(XRSessionFeature::REF_SPACE_VIEWER,
+                    XRSessionFeatureRequestStatus::kNotRequested);
+  SetFeatureRequest(XRSessionFeature::REF_SPACE_LOCAL,
+                    XRSessionFeatureRequestStatus::kNotRequested);
+  SetFeatureRequest(XRSessionFeature::REF_SPACE_LOCAL_FLOOR,
+                    XRSessionFeatureRequestStatus::kNotRequested);
+  SetFeatureRequest(XRSessionFeature::REF_SPACE_BOUNDED_FLOOR,
+                    XRSessionFeatureRequestStatus::kNotRequested);
+  SetFeatureRequest(XRSessionFeature::REF_SPACE_UNBOUNDED,
+                    XRSessionFeatureRequestStatus::kNotRequested);
+  // Not currently recording metrics for
+  // XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR
+
+  // Record required feature requests
+  for (auto feature : session_options.required_features) {
+    DCHECK(enabled_features.find(feature) != enabled_features.end());
+    SetFeatureRequest(feature, XRSessionFeatureRequestStatus::kRequired);
+  }
+
+  // Record optional feature requests
+  for (auto feature : session_options.optional_features) {
+    bool enabled = enabled_features.find(feature) != enabled_features.end();
+    SetFeatureRequest(
+        feature, enabled ? XRSessionFeatureRequestStatus::kOptionalAccepted
+                         : XRSessionFeatureRequestStatus::kOptionalRejected);
+  }
+}
+
+void WebXRSessionTracker::ReportFeatureUsed(
+    device::mojom::XRSessionFeature feature) {
+  using device::mojom::XRSessionFeature;
+
+  switch (feature) {
+    case XRSessionFeature::REF_SPACE_VIEWER:
+      ukm_entry_->SetFeatureUse_Viewer(true);
+      break;
+    case XRSessionFeature::REF_SPACE_LOCAL:
+      ukm_entry_->SetFeatureUse_Local(true);
+      break;
+    case XRSessionFeature::REF_SPACE_LOCAL_FLOOR:
+      ukm_entry_->SetFeatureUse_LocalFloor(true);
+      break;
+    case XRSessionFeature::REF_SPACE_BOUNDED_FLOOR:
+      ukm_entry_->SetFeatureUse_BoundedFloor(true);
+      break;
+    case XRSessionFeature::REF_SPACE_UNBOUNDED:
+      ukm_entry_->SetFeatureUse_Unbounded(true);
+      break;
+    case XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR:
+      // Not recording metrics for this feature currently
+      break;
+  }
+}
+
+mojo::PendingRemote<device::mojom::XRSessionMetricsRecorder>
+WebXRSessionTracker::BindMetricsRecorderPipe() {
+  return receiver_.BindNewPipeAndPassRemote();
+}
+
+void WebXRSessionTracker::SetFeatureRequest(
+    device::mojom::XRSessionFeature feature,
+    device::mojom::XRSessionFeatureRequestStatus status) {
+  using device::mojom::XRSessionFeature;
+
+  switch (feature) {
+    case XRSessionFeature::REF_SPACE_VIEWER:
+      ukm_entry_->SetFeatureRequest_Viewer(static_cast<int64_t>(status));
+      break;
+    case XRSessionFeature::REF_SPACE_LOCAL:
+      ukm_entry_->SetFeatureRequest_Local(static_cast<int64_t>(status));
+      break;
+    case XRSessionFeature::REF_SPACE_LOCAL_FLOOR:
+      ukm_entry_->SetFeatureRequest_Local(static_cast<int64_t>(status));
+      break;
+    case XRSessionFeature::REF_SPACE_BOUNDED_FLOOR:
+      ukm_entry_->SetFeatureRequest_Local(static_cast<int64_t>(status));
+      break;
+    case XRSessionFeature::REF_SPACE_UNBOUNDED:
+      ukm_entry_->SetFeatureRequest_Local(static_cast<int64_t>(status));
+      break;
+    case XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR:
+      // Not recording metrics for this feature currently.
+      break;
+  }
+}
+
 // SessionTimer will monitor the time between calls to StartSession and
 // StopSession.  It will combine multiple segments into a single session if they
 // are sufficiently close in time.  It will also only include segments if they
@@ -222,7 +322,8 @@
   }
 }
 
-void SessionMetricsHelper::RecordInlineSessionStart(size_t session_id) {
+WebXRSessionTracker* SessionMetricsHelper::RecordInlineSessionStart(
+    size_t session_id) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   DCHECK(webxr_inline_session_trackers_.find(session_id) ==
@@ -230,9 +331,10 @@
 
   auto result = webxr_inline_session_trackers_.emplace(
       session_id,
-      std::make_unique<SessionTracker<ukm::builders::XR_WebXR_Session>>(
+      std::make_unique<WebXRSessionTracker>(
           std::make_unique<ukm::builders::XR_WebXR_Session>(
               ukm::GetSourceIdForWebContentsDocument(web_contents()))));
+  auto* tracker = result.first->second.get();
 
   // TODO(https://crbug.com/968546): StartAction is currently not present in
   // XR.WebXR.Session event. Remove this & change the below code with
@@ -240,8 +342,10 @@
   // result.first->second->ukm_entry()->SetStartAction(
   //    PresentationStartAction::kOther);
   // TODO(crbug.com/1021212): Remove IsLegacyWebVR when safe.
-  result.first->second->ukm_entry()->SetIsLegacyWebVR(false).SetMode(
+  tracker->ukm_entry()->SetIsLegacyWebVR(false).SetMode(
       static_cast<int64_t>(device::SessionMode::kInline));
+
+  return tracker;
 }
 
 void SessionMetricsHelper::RecordInlineSessionStop(size_t session_id) {
@@ -252,6 +356,7 @@
   if (it == webxr_inline_session_trackers_.end())
     return;
 
+  it->second->SetSessionEnd(base::Time::Now());
   it->second->ukm_entry()->SetDuration(
       it->second->GetRoundedDurationInSeconds());
   it->second->RecordEntry();
@@ -259,6 +364,27 @@
   webxr_inline_session_trackers_.erase(it);
 }
 
+WebXRSessionTracker* SessionMetricsHelper::GetImmersiveSessionTracker() {
+  return webxr_immersive_session_tracker_.get();
+}
+
+WebXRSessionTracker* SessionMetricsHelper::RecordImmersiveSessionStart() {
+  DCHECK(!webxr_immersive_session_tracker_);
+  webxr_immersive_session_tracker_ = std::make_unique<WebXRSessionTracker>(
+      std::make_unique<ukm::builders::XR_WebXR_Session>(
+          ukm::GetSourceIdForWebContentsDocument(web_contents())));
+  return webxr_immersive_session_tracker_.get();
+}
+
+void SessionMetricsHelper::RecordImmersiveSessionStop() {
+  DCHECK(webxr_immersive_session_tracker_);
+  webxr_immersive_session_tracker_->SetSessionEnd(base::Time::Now());
+  webxr_immersive_session_tracker_->ukm_entry()->SetDuration(
+      webxr_immersive_session_tracker_->GetRoundedDurationInSeconds());
+  webxr_immersive_session_tracker_->RecordEntry();
+  webxr_immersive_session_tracker_ = nullptr;
+}
+
 void SessionMetricsHelper::RecordPresentationStartAction(
     PresentationStartAction action,
     const device::mojom::XRRuntimeSessionOptions& options) {
@@ -266,8 +392,7 @@
 
   // TODO(https://crbug.com/965729): Ensure we correctly handle AR cases
   // throughout session metrics helper.
-  if (!webxr_immersive_session_tracker_ ||
-      mode_ != Mode::kWebXrVrPresentation) {
+  if (!GetImmersiveSessionTracker() || mode_ != Mode::kWebXrVrPresentation) {
     pending_immersive_session_start_info_ =
         PendingImmersiveSessionStartInfo{action, xr_session_mode};
   } else {
@@ -316,7 +441,7 @@
 void SessionMetricsHelper::LogPresentationStartAction(
     PresentationStartAction action,
     device::SessionMode xr_session_mode) {
-  DCHECK(webxr_immersive_session_tracker_);
+  DCHECK(GetImmersiveSessionTracker());
 
   UMA_HISTOGRAM_ENUMERATION("XR.WebXR.PresentationSession", action);
 
@@ -325,9 +450,8 @@
   // replacement metrics once they are designed:
   // webxr_immersive_session_tracker_->ukm_entry()->SetStartAction(action);
   // TODO(crbug.com/1021212): Remove IsLegacyWebVR when safe.
-  webxr_immersive_session_tracker_->ukm_entry()
-      ->SetIsLegacyWebVR(false)
-      .SetMode(static_cast<int64_t>(xr_session_mode));
+  GetImmersiveSessionTracker()->ukm_entry()->SetIsLegacyWebVR(false).SetMode(
+      static_cast<int64_t>(xr_session_mode));
 }
 
 void SessionMetricsHelper::SetWebVREnabled(bool is_webvr_presenting) {
@@ -480,11 +604,10 @@
       kMinimumHeadsetSessionDuration);
 
   // If we are switching to WebVR presentation, start the new presentation
-  // session.
-  webxr_immersive_session_tracker_ =
-      std::make_unique<SessionTracker<ukm::builders::XR_WebXR_Session>>(
-          std::make_unique<ukm::builders::XR_WebXR_Session>(
-              ukm::GetSourceIdForWebContentsDocument(web_contents())));
+  // session tracker, if it hasn't been started already.
+  if (!GetImmersiveSessionTracker()) {
+    RecordImmersiveSessionStart();
+  }
 
   // TODO(https://crbug.com/967764): Can pending_immersive_session_start_info_
   // be not set? What is the ordering of calls to RecordPresentationStartAction?
@@ -499,12 +622,8 @@
   // If we are switching off WebVR presentation, then the presentation session
   // is done. As with the page session, do not assume
   // webxr_immersive_session_tracker_ is valid.
-  if (webxr_immersive_session_tracker_) {
-    webxr_immersive_session_tracker_->SetSessionEnd(base::Time::Now());
-    webxr_immersive_session_tracker_->ukm_entry()->SetDuration(
-        webxr_immersive_session_tracker_->GetRoundedDurationInSeconds());
-    webxr_immersive_session_tracker_->RecordEntry();
-    webxr_immersive_session_tracker_ = nullptr;
+  if (GetImmersiveSessionTracker()) {
+    RecordImmersiveSessionStop();
   }
 }
 
@@ -578,12 +697,8 @@
       page_session_tracker_ = nullptr;
     }
 
-    if (webxr_immersive_session_tracker_) {
-      webxr_immersive_session_tracker_->SetSessionEnd(base::Time::Now());
-      webxr_immersive_session_tracker_->ukm_entry()->SetDuration(
-          webxr_immersive_session_tracker_->GetRoundedDurationInSeconds());
-      webxr_immersive_session_tracker_->RecordEntry();
-      webxr_immersive_session_tracker_ = nullptr;
+    if (GetImmersiveSessionTracker()) {
+      RecordImmersiveSessionStop();
     }
 
     for (auto& inline_session_tracker : webxr_inline_session_trackers_) {
@@ -642,10 +757,10 @@
     last_requested_url_ = GURL();
 
     if (mode_ == Mode::kWebXrVrPresentation) {
-      webxr_immersive_session_tracker_ =
-          std::make_unique<SessionTracker<ukm::builders::XR_WebXR_Session>>(
-              std::make_unique<ukm::builders::XR_WebXR_Session>(
-                  ukm::GetSourceIdForWebContentsDocument(web_contents())));
+      // Start the immersive session tracker if it hasn't already
+      if (!GetImmersiveSessionTracker()) {
+        RecordImmersiveSessionStart();
+      }
       if (pending_immersive_session_start_info_) {
         // TODO(https://crbug.com/968546): StartAction is currently not present
         // in XR.WebXR.Session event. Remove this & change the below code with
@@ -653,7 +768,8 @@
         // webxr_immersive_session_tracker_->ukm_entry()->SetStartAction(
         //    pending_immersive_session_start_info_->action);
         // TODO(crbug.com/1021212): Remove IsLegacyWebVR when safe.
-        webxr_immersive_session_tracker_->ukm_entry()
+        GetImmersiveSessionTracker()
+            ->ukm_entry()
             ->SetIsLegacyWebVR(false)
             .SetMode(static_cast<int64_t>(
                 pending_immersive_session_start_info_->mode));
diff --git a/chrome/browser/vr/metrics/session_metrics_helper.h b/chrome/browser/vr/metrics/session_metrics_helper.h
index 030192c..ee5a0d4b 100644
--- a/chrome/browser/vr/metrics/session_metrics_helper.h
+++ b/chrome/browser/vr/metrics/session_metrics_helper.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_VR_METRICS_SESSION_METRICS_HELPER_H_
 
 #include <memory>
+#include <set>
 
 #include "base/time/time.h"
 #include "chrome/browser/vr/mode.h"
@@ -14,6 +15,8 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "device/vr/public/cpp/session_mode.h"
 #include "device/vr/public/mojom/isolated_xr_service.mojom.h"
+#include "device/vr/public/mojom/vr_service.mojom.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "url/gurl.h"
@@ -111,6 +114,36 @@
   DISALLOW_COPY_AND_ASSIGN(SessionTracker);
 };
 
+class VR_BASE_EXPORT WebXRSessionTracker
+    : public SessionTracker<ukm::builders::XR_WebXR_Session>,
+      device::mojom::XRSessionMetricsRecorder {
+ public:
+  explicit WebXRSessionTracker(
+      std::unique_ptr<ukm::builders::XR_WebXR_Session> entry);
+  ~WebXRSessionTracker() override;
+
+  // Records which features for the session have been requested as required or
+  // optional, which were accepted/rejeceted, and which weren't requested at
+  // all. This assumes that the session as a whole was accepted.
+  void RecordRequestedFeatures(
+      const device::mojom::XRSessionOptions& session_options,
+      const std::set<device::mojom::XRSessionFeature>& enabled_features);
+
+  // |XRSessionMetricsRecorder| implementation
+  void ReportFeatureUsed(device::mojom::XRSessionFeature feature) override;
+
+  // Binds this tracker's |XRSessionMetricsRecorder| receiver to a new pipe, and
+  // returns the |PendingRemote|.
+  mojo::PendingRemote<device::mojom::XRSessionMetricsRecorder>
+  BindMetricsRecorderPipe();
+
+ private:
+  void SetFeatureRequest(device::mojom::XRSessionFeature feature,
+                         device::mojom::XRSessionFeatureRequestStatus status);
+
+  mojo::Receiver<device::mojom::XRSessionMetricsRecorder> receiver_;
+};
+
 // This class is not thread-safe and must only be used from the main thread.
 // This class tracks metrics for various kinds of sessions, including VR
 // browsing sessions, WebXR presentation sessions, and others. It mainly tracks
@@ -147,10 +180,19 @@
       const device::mojom::XRRuntimeSessionOptions& options);
 
   // Records that inline session was started.
-  void RecordInlineSessionStart(size_t session_id);
+  WebXRSessionTracker* RecordInlineSessionStart(size_t session_id);
   // Records that inline session was stopped. Will record an UKM entry.
   void RecordInlineSessionStop(size_t session_id);
 
+  WebXRSessionTracker* GetImmersiveSessionTracker();
+
+  // Records that an immersive session was started. Two immersive sessions
+  // may not exist simultaneously.
+  WebXRSessionTracker* RecordImmersiveSessionStart();
+
+  // Records that an immersive session was stopped. Will record a UKM entry.
+  void RecordImmersiveSessionStop();
+
  private:
   SessionMetricsHelper(content::WebContents* contents, Mode initial_mode);
 
@@ -192,15 +234,12 @@
 
   std::unique_ptr<SessionTracker<ukm::builders::XR_PageSession>>
       page_session_tracker_;
-  std::unique_ptr<SessionTracker<ukm::builders::XR_WebXR_Session>>
-      webxr_immersive_session_tracker_;
+  std::unique_ptr<WebXRSessionTracker> webxr_immersive_session_tracker_;
 
-  // Map containing inline session trackers. The contents of the map are
-  // affected by calls to |RecordInlineSessionStart| & |RecordInlineSessionStop|
-  // public methods.
-  std::unordered_map<
-      size_t,
-      std::unique_ptr<SessionTracker<ukm::builders::XR_WebXR_Session>>>
+  // Map associating active inline session Ids to their trackers. The contents
+  // of the map are managed by |RecordInlineSessionStart| and
+  // |RecordInlineSessionStop|.
+  std::unordered_map<size_t, std::unique_ptr<WebXRSessionTracker>>
       webxr_inline_session_trackers_;
 
   Mode mode_ = Mode::kNoVr;
diff --git a/chrome/browser/vr/service/vr_service_impl.cc b/chrome/browser/vr/service/vr_service_impl.cc
index 3eb70048..9b1cfbb 100644
--- a/chrome/browser/vr/service/vr_service_impl.cc
+++ b/chrome/browser/vr/service/vr_service_impl.cc
@@ -239,6 +239,7 @@
 }
 
 void VRServiceImpl::OnInlineSessionCreated(
+    device::mojom::XRSessionOptionsPtr options,
     device::mojom::XRDeviceId session_runtime_id,
     device::mojom::VRService::RequestSessionCallback callback,
     const std::set<device::mojom::XRSessionFeature>& enabled_features,
@@ -262,10 +263,44 @@
            << " runtime_id=" << session_runtime_id;
 
   // Note: We might be recording an inline session that was created by WebVR.
-  GetSessionMetricsHelper()->RecordInlineSessionStart(id.GetUnsafeValue());
+  auto* session_metrics_tracker =
+      GetSessionMetricsHelper()->RecordInlineSessionStart(id.GetUnsafeValue());
 
-  OnSessionCreated(session_runtime_id, std::move(callback), enabled_features,
-                   std::move(session));
+  OnSessionCreated(std::move(options), session_runtime_id, std::move(callback),
+                   enabled_features, std::move(session),
+                   session_metrics_tracker);
+}
+
+void VRServiceImpl::OnImmersiveSessionCreated(
+    device::mojom::XRSessionOptionsPtr options,
+    device::mojom::XRDeviceId session_runtime_id,
+    device::mojom::VRService::RequestSessionCallback callback,
+    const std::set<device::mojom::XRSessionFeature>& enabled_features,
+    device::mojom::XRSessionPtr session) {
+  if (!session) {
+    std::move(callback).Run(
+        device::mojom::RequestSessionResult::NewFailureReason(
+            device::mojom::RequestSessionError::UNKNOWN_RUNTIME_ERROR));
+    return;
+  }
+
+  // Get the metrics tracker for the new immersive session
+  auto* session_metrics_tracker =
+      GetSessionMetricsHelper()->GetImmersiveSessionTracker();
+
+  // If the immersive session tracker hasn't already been started, start it.
+  // This only happens during certain tests, but this is ideally where we should
+  // be creating the session tracker anyway so the other cases should be
+  // removed.
+  // TODO(https://crbug.com/1021314)
+  if (!session_metrics_tracker) {
+    session_metrics_tracker =
+        GetSessionMetricsHelper()->RecordImmersiveSessionStart();
+  }
+
+  OnSessionCreated(std::move(options), session_runtime_id, std::move(callback),
+                   enabled_features, std::move(session),
+                   session_metrics_tracker);
 }
 
 void VRServiceImpl::OnInlineSessionDisconnected(
@@ -292,18 +327,16 @@
 }
 
 void VRServiceImpl::OnSessionCreated(
+    device::mojom::XRSessionOptionsPtr options,
     device::mojom::XRDeviceId session_runtime_id,
     device::mojom::VRService::RequestSessionCallback callback,
     const std::set<device::mojom::XRSessionFeature>& enabled_features,
-    device::mojom::XRSessionPtr session) {
+    device::mojom::XRSessionPtr session,
+    WebXRSessionTracker* session_metrics_tracker) {
   DVLOG(2) << __func__ << ": session_runtime_id=" << session_runtime_id;
 
-  if (!session) {
-    std::move(callback).Run(
-        device::mojom::RequestSessionResult::NewFailureReason(
-            device::mojom::RequestSessionError::UNKNOWN_RUNTIME_ERROR));
-    return;
-  }
+  // Not checking for validity of |session|, since that's done by
+  // |OnInlineSessionCreated| and |OnImmersiveSessionCreated|.
 
   UMA_HISTOGRAM_ENUMERATION("XR.RuntimeUsed", session_runtime_id);
 
@@ -318,8 +351,15 @@
   client->OnVisibilityStateChanged(visibility_state_);
   session_clients_.Add(std::move(client));
 
+  session_metrics_tracker->RecordRequestedFeatures(*options, enabled_features);
+
+  auto success = device::mojom::RequestSessionSuccess::New();
+  success->session = std::move(session);
+  success->metrics_recorder =
+      session_metrics_tracker->BindMetricsRecorderPipe();
+
   std::move(callback).Run(
-      device::mojom::RequestSessionResult::NewSession(std::move(session)));
+      device::mojom::RequestSessionResult::NewSuccess(std::move(success)));
 }
 
 void VRServiceImpl::RequestSession(
@@ -517,9 +557,10 @@
     GetSessionMetricsHelper()->ReportRequestPresent(*runtime_options);
 
     base::OnceCallback<void(device::mojom::XRSessionPtr)> immersive_callback =
-        base::BindOnce(&VRServiceImpl::OnSessionCreated,
-                       weak_ptr_factory_.GetWeakPtr(), session_runtime_id,
-                       std::move(callback), std::move(enabled_features));
+        base::BindOnce(&VRServiceImpl::OnImmersiveSessionCreated,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(options),
+                       session_runtime_id, std::move(callback),
+                       std::move(enabled_features));
     runtime->RequestSession(this, std::move(runtime_options),
                             std::move(immersive_callback));
   } else {
@@ -528,8 +569,9 @@
         mojo::PendingRemote<device::mojom::XRSessionController>)>
         non_immersive_callback =
             base::BindOnce(&VRServiceImpl::OnInlineSessionCreated,
-                           weak_ptr_factory_.GetWeakPtr(), session_runtime_id,
-                           std::move(callback), std::move(enabled_features));
+                           weak_ptr_factory_.GetWeakPtr(), std::move(options),
+                           session_runtime_id, std::move(callback),
+                           std::move(enabled_features));
     runtime->GetRuntime()->RequestSession(std::move(runtime_options),
                                           std::move(non_immersive_callback));
   }
@@ -606,6 +648,16 @@
 
 void VRServiceImpl::OnExitPresent() {
   DVLOG(2) << __func__;
+
+  // If the immersive session tracker hasn't already been stopped, stop it.
+  // This only happens during certain tests, but this is ideally where we should
+  // be stopping the session tracker anyway so the other cases should be
+  // removed.
+  // TODO(https://crbug.com/1021314)
+  if (GetSessionMetricsHelper()->GetImmersiveSessionTracker()) {
+    GetSessionMetricsHelper()->RecordImmersiveSessionStop();
+  }
+
   for (auto& client : session_clients_)
     client->OnExitPresent();
 }
diff --git a/chrome/browser/vr/service/vr_service_impl.h b/chrome/browser/vr/service/vr_service_impl.h
index 2a54729c..b17188d 100644
--- a/chrome/browser/vr/service/vr_service_impl.h
+++ b/chrome/browser/vr/service/vr_service_impl.h
@@ -116,17 +116,26 @@
 
   bool InternalSupportsSession(device::mojom::XRSessionOptions* options);
   void OnInlineSessionCreated(
+      device::mojom::XRSessionOptionsPtr options,
       device::mojom::XRDeviceId session_runtime_id,
       device::mojom::VRService::RequestSessionCallback callback,
       const std::set<device::mojom::XRSessionFeature>& enabled_features,
       device::mojom::XRSessionPtr session,
       mojo::PendingRemote<device::mojom::XRSessionController> controller);
-
-  void OnSessionCreated(
+  void OnImmersiveSessionCreated(
+      device::mojom::XRSessionOptionsPtr options,
       device::mojom::XRDeviceId session_runtime_id,
       device::mojom::VRService::RequestSessionCallback callback,
       const std::set<device::mojom::XRSessionFeature>& enabled_features,
       device::mojom::XRSessionPtr session);
+
+  void OnSessionCreated(
+      device::mojom::XRSessionOptionsPtr options,
+      device::mojom::XRDeviceId session_runtime_id,
+      device::mojom::VRService::RequestSessionCallback callback,
+      const std::set<device::mojom::XRSessionFeature>& enabled_features,
+      device::mojom::XRSessionPtr session,
+      WebXRSessionTracker* session_metrics_tracker);
   void DoRequestSession(
       device::mojom::XRSessionOptionsPtr options,
       device::mojom::VRService::RequestSessionCallback callback,
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index 87a9ad3..08bd8e08 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -63,6 +63,7 @@
   if (is_chromeos) {
     deps += [
       "//ash/public/cpp:cpp",
+      "//chromeos/components/help_app_ui",
       "//chromeos/components/media_app_ui",
       "//chromeos/constants",
       "//components/arc:arc_base",
diff --git a/chrome/browser/web_applications/components/app_registrar.h b/chrome/browser/web_applications/components/app_registrar.h
index d21055d..9c21746 100644
--- a/chrome/browser/web_applications/components/app_registrar.h
+++ b/chrome/browser/web_applications/components/app_registrar.h
@@ -104,11 +104,11 @@
   void RemoveObserver(AppRegistrarObserver* observer);
 
   void NotifyWebAppInstalled(const AppId& app_id);
+  void NotifyWebAppUninstalled(const AppId& app_id);
 
  protected:
   Profile* profile() const { return profile_; }
 
-  void NotifyWebAppUninstalled(const AppId& app_id);
   void NotifyWebAppProfileWillBeDeleted(const AppId& app_id);
   void NotifyAppRegistrarShutdown();
 
diff --git a/chrome/browser/web_applications/components/install_finalizer.h b/chrome/browser/web_applications/components/install_finalizer.h
index 8673f0e3..33d287b2 100644
--- a/chrome/browser/web_applications/components/install_finalizer.h
+++ b/chrome/browser/web_applications/components/install_finalizer.h
@@ -47,6 +47,9 @@
   virtual void FinalizeFallbackInstallAfterSync(
       const AppId& app_id,
       InstallFinalizedCallback callback) = 0;
+  // Delete app data from disk (icon .png files). |app_id| must be unregistered.
+  virtual void FinalizeUninstallAfterSync(const AppId& app_id,
+                                          UninstallWebAppCallback callback) = 0;
 
   // Write the new WebApp data to disk and update the app.
   virtual void FinalizeUpdate(const WebApplicationInfo& web_app_info,
diff --git a/chrome/browser/web_applications/components/install_manager.h b/chrome/browser/web_applications/components/install_manager.h
index 1745e35a..fd8a30aa 100644
--- a/chrome/browser/web_applications/components/install_manager.h
+++ b/chrome/browser/web_applications/components/install_manager.h
@@ -36,6 +36,8 @@
   // |app_id| may be empty on failure.
   using OnceInstallCallback =
       base::OnceCallback<void(const AppId& app_id, InstallResultCode code)>;
+  using OnceUninstallCallback =
+      base::OnceCallback<void(const AppId& app_id, bool uninstalled)>;
 
   // Callback used to indicate whether a user has accepted the installation of a
   // web app.
diff --git a/chrome/browser/web_applications/extensions/BUILD.gn b/chrome/browser/web_applications/extensions/BUILD.gn
index 7fb53aa..2e2b1fb1 100644
--- a/chrome/browser/web_applications/extensions/BUILD.gn
+++ b/chrome/browser/web_applications/extensions/BUILD.gn
@@ -112,6 +112,7 @@
 
   if (is_chromeos) {
     deps += [
+      "//chromeos/components/help_app_ui",
       "//chromeos/components/media_app_ui",
       "//chromeos/constants",
     ]
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
index 6532345..f8c08dab 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
@@ -110,6 +110,13 @@
   NOTREACHED();
 }
 
+void BookmarkAppInstallFinalizer::FinalizeUninstallAfterSync(
+    const web_app::AppId& app_id,
+    UninstallWebAppCallback callback) {
+  // Used only by the new USS-based sync system.
+  NOTREACHED();
+}
+
 void BookmarkAppInstallFinalizer::FinalizeUpdate(
     const WebApplicationInfo& web_app_info,
     InstallFinalizedCallback callback) {
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h
index 548ff9c3..1f80aad 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.h
@@ -38,6 +38,8 @@
   void FinalizeFallbackInstallAfterSync(
       const web_app::AppId& app_id,
       InstallFinalizedCallback callback) override;
+  void FinalizeUninstallAfterSync(const web_app::AppId& app_id,
+                                  UninstallWebAppCallback callback) override;
   void FinalizeUpdate(const WebApplicationInfo& web_app_info,
                       InstallFinalizedCallback callback) override;
   void UninstallExternalWebApp(const GURL& app_url,
diff --git a/chrome/browser/web_applications/extensions/pending_app_install_task_unittest.cc b/chrome/browser/web_applications/extensions/pending_app_install_task_unittest.cc
index 6ab55e8..a7e5c2fb 100644
--- a/chrome/browser/web_applications/extensions/pending_app_install_task_unittest.cc
+++ b/chrome/browser/web_applications/extensions/pending_app_install_task_unittest.cc
@@ -166,6 +166,11 @@
     NOTREACHED();
   }
 
+  void FinalizeUninstallAfterSync(const AppId& app_id,
+                                  UninstallWebAppCallback callback) override {
+    NOTREACHED();
+  }
+
   void FinalizeUpdate(const WebApplicationInfo& web_app_info,
                       InstallFinalizedCallback callback) override {
     NOTREACHED();
diff --git a/chrome/browser/web_applications/extensions/system_web_app_manager_browsertest_chromeos.cc b/chrome/browser/web_applications/extensions/system_web_app_manager_browsertest_chromeos.cc
index 928803ab..7d4de70 100644
--- a/chrome/browser/web_applications/extensions/system_web_app_manager_browsertest_chromeos.cc
+++ b/chrome/browser/web_applications/extensions/system_web_app_manager_browsertest_chromeos.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/web_applications/system_web_app_manager.h"
+#include "chromeos/components/help_app_ui/url_constants.h"
 #include "chromeos/components/media_app_ui/url_constants.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "content/public/browser/web_ui.h"
@@ -31,7 +32,47 @@
  public:
   SystemWebAppManagerBrowserTestChromeos()
       : SystemWebAppManagerBrowserTest(false /* install_mock */) {
-    scoped_feature_list_.InitAndEnableFeature(chromeos::features::kMediaApp);
+    scoped_feature_list_.InitWithFeatures(
+        {chromeos::features::kHelpAppV2, chromeos::features::kMediaApp}, {});
+  }
+
+  // Runs basic tests on a System Web App. E.g. ensures it exists, and
+  // loads/navigates with an expected title that matches the manifest app name.
+  void ExpectSystemWebAppValid(SystemAppType app_type,
+                               const GURL& url,
+                               const std::string& title) {
+    Browser* app_browser = WaitForSystemAppInstallAndLaunch(app_type);
+    const extensions::Extension* installed_app =
+        extensions::util::GetInstalledPwaForUrl(browser()->profile(), url);
+
+    EXPECT_TRUE(GetManager().IsSystemWebApp(installed_app->id()));
+    EXPECT_TRUE(installed_app->from_bookmark());
+
+    EXPECT_EQ(title, installed_app->name());
+    EXPECT_EQ(base::ASCIIToUTF16(title),
+              app_browser->window()->GetNativeWindow()->GetTitle());
+    EXPECT_EQ(extensions::Manifest::EXTERNAL_COMPONENT,
+              installed_app->location());
+
+    // The installed app should match the opened app window.
+    EXPECT_EQ(installed_app, GetExtensionForAppBrowser(app_browser));
+    content::WebContents* web_contents =
+        app_browser->tab_strip_model()->GetActiveWebContents();
+
+    // The opened window should be showing the url with attached WebUI.
+    EXPECT_EQ(url, web_contents->GetVisibleURL());
+
+    content::TestNavigationObserver observer(web_contents);
+    observer.WaitForNavigationFinished();
+    EXPECT_EQ(url, web_contents->GetLastCommittedURL());
+
+    content::WebUI* web_ui = web_contents->GetCommittedWebUI();
+    ASSERT_TRUE(web_ui);
+    EXPECT_TRUE(web_ui->GetController());
+
+    // A completed navigation could change the window title. Check again.
+    EXPECT_EQ(base::ASCIIToUTF16(title),
+              app_browser->window()->GetNativeWindow()->GetTitle());
   }
 
  private:
@@ -43,41 +84,17 @@
 // Test that the Media App installs and launches correctly. Runs some spot
 // checks on the manifest.
 IN_PROC_BROWSER_TEST_F(SystemWebAppManagerBrowserTestChromeos, MediaApp) {
-  Browser* app_browser = WaitForSystemAppInstallAndLaunch(SystemAppType::MEDIA);
-  const extensions::Extension* installed_app =
-      extensions::util::GetInstalledPwaForUrl(
-          browser()->profile(),
-          content::GetWebUIURL(chromeos::kChromeUIMediaAppHost));
+  const GURL* url = new GURL(chromeos::kChromeUIMediaAppURL);
+  EXPECT_NO_FATAL_FAILURE(
+      ExpectSystemWebAppValid(SystemAppType::MEDIA, *url, "Media App"));
+}
 
-  EXPECT_TRUE(GetManager().IsSystemWebApp(installed_app->id()));
-  EXPECT_TRUE(installed_app->from_bookmark());
-
-  EXPECT_EQ("Media App", installed_app->name());
-  EXPECT_EQ(base::ASCIIToUTF16("Media App"),
-            app_browser->window()->GetNativeWindow()->GetTitle());
-  EXPECT_EQ(extensions::Manifest::EXTERNAL_COMPONENT,
-            installed_app->location());
-
-  // The installed app should match the opened app window.
-  EXPECT_EQ(installed_app, GetExtensionForAppBrowser(app_browser));
-  content::WebContents* web_contents =
-      app_browser->tab_strip_model()->GetActiveWebContents();
-
-  // The opened window should be showing chrome://media-app with attached WebUI.
-  EXPECT_EQ(chromeos::kChromeUIMediaAppURL, web_contents->GetVisibleURL());
-
-  content::TestNavigationObserver observer(web_contents);
-  observer.WaitForNavigationFinished();
-  EXPECT_EQ(chromeos::kChromeUIMediaAppURL,
-            web_contents->GetLastCommittedURL());
-
-  content::WebUI* web_ui = web_contents->GetCommittedWebUI();
-  ASSERT_TRUE(web_ui);
-  EXPECT_TRUE(web_ui->GetController());
-
-  // A completed navigation could change the window title. Check again.
-  EXPECT_EQ(base::ASCIIToUTF16("Media App"),
-            app_browser->window()->GetNativeWindow()->GetTitle());
+// Test that the Help App installs and launches correctly. Runs some spot
+// checks on the manifest.
+IN_PROC_BROWSER_TEST_F(SystemWebAppManagerBrowserTestChromeos, HelpAppV2) {
+  const GURL* url = new GURL(chromeos::kChromeUIHelpAppURL);
+  EXPECT_NO_FATAL_FAILURE(
+      ExpectSystemWebAppValid(SystemAppType::HELP, *url, "Help App"));
 }
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/file_utils_wrapper.cc b/chrome/browser/web_applications/file_utils_wrapper.cc
index aac296fc..58cf897 100644
--- a/chrome/browser/web_applications/file_utils_wrapper.cc
+++ b/chrome/browser/web_applications/file_utils_wrapper.cc
@@ -59,4 +59,8 @@
   return base::DeleteFile(path, recursive);
 }
 
+bool FileUtilsWrapper::DeleteFileRecursively(const base::FilePath& path) {
+  return base::DeleteFileRecursively(path);
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/file_utils_wrapper.h b/chrome/browser/web_applications/file_utils_wrapper.h
index 8074386e..bf9e7d58 100644
--- a/chrome/browser/web_applications/file_utils_wrapper.h
+++ b/chrome/browser/web_applications/file_utils_wrapper.h
@@ -58,7 +58,9 @@
 
   bool DeleteFile(const base::FilePath& path, bool recursive);
 
-  DISALLOW_COPY_AND_ASSIGN(FileUtilsWrapper);
+  virtual bool DeleteFileRecursively(const base::FilePath& path);
+
+  DISALLOW_ASSIGN(FileUtilsWrapper);
 };
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/system_web_app_manager.cc b/chrome/browser/web_applications/system_web_app_manager.cc
index 509a1a0..e651663 100644
--- a/chrome/browser/web_applications/system_web_app_manager.cc
+++ b/chrome/browser/web_applications/system_web_app_manager.cc
@@ -31,6 +31,7 @@
 #if defined(OS_CHROMEOS)
 #include "ash/public/cpp/app_list/internal_app_id_constants.h"
 #include "chrome/browser/chromeos/extensions/default_web_app_ids.h"
+#include "chromeos/components/help_app_ui/url_constants.h"
 #include "chromeos/components/media_app_ui/url_constants.h"
 #include "chromeos/constants/chromeos_features.h"
 #endif  // defined(OS_CHROMEOS)
@@ -73,6 +74,10 @@
     constexpr char kChromeTerminalPWAURL[] = "chrome://terminal/html/pwa.html";
     infos[SystemAppType::TERMINAL].install_url = GURL(kChromeTerminalPWAURL);
   }
+  if (SystemWebAppManager::IsAppEnabled(SystemAppType::HELP)) {
+    constexpr char kChromeHelpAppPWAURL[] = "chrome://help-app/pwa.html";
+    infos[SystemAppType::HELP].install_url = {GURL(kChromeHelpAppPWAURL)};
+  }
   if (SystemWebAppManager::IsAppEnabled(SystemAppType::MEDIA)) {
     constexpr char kChromeMediaAppURL[] = "chrome://media-app/pwa.html";
     infos[SystemAppType::MEDIA].install_url = {GURL(kChromeMediaAppURL)};
@@ -128,6 +133,8 @@
       return base::FeatureList::IsEnabled(features::kTerminalSystemApp);
     case SystemAppType::MEDIA:
       return base::FeatureList::IsEnabled(chromeos::features::kMediaApp);
+    case SystemAppType::HELP:
+      return base::FeatureList::IsEnabled(chromeos::features::kHelpAppV2);
   }
 #else
   return false;
diff --git a/chrome/browser/web_applications/system_web_app_manager.h b/chrome/browser/web_applications/system_web_app_manager.h
index 30ef9b5..c7414a5b 100644
--- a/chrome/browser/web_applications/system_web_app_manager.h
+++ b/chrome/browser/web_applications/system_web_app_manager.h
@@ -42,6 +42,7 @@
   CAMERA,
   TERMINAL,
   MEDIA,
+  HELP,
 };
 
 // The configuration options for a System App.
diff --git a/chrome/browser/web_applications/test/test_file_utils.cc b/chrome/browser/web_applications/test/test_file_utils.cc
index 94f1f36c..cb2d29fd 100644
--- a/chrome/browser/web_applications/test/test_file_utils.cc
+++ b/chrome/browser/web_applications/test/test_file_utils.cc
@@ -8,16 +8,25 @@
 
 namespace web_app {
 
+TestFileUtils::TestFileUtils() = default;
+
+TestFileUtils::TestFileUtils(const TestFileUtils&) = default;
+
+TestFileUtils::~TestFileUtils() = default;
+
 std::unique_ptr<FileUtilsWrapper> TestFileUtils::Clone() {
-  auto clone = std::make_unique<TestFileUtils>();
-  clone->remaining_disk_space_ = remaining_disk_space_;
-  return clone;
+  return std::make_unique<TestFileUtils>(*this);
 }
 
 void TestFileUtils::SetRemainingDiskSpaceSize(int remaining_disk_space) {
   remaining_disk_space_ = remaining_disk_space;
 }
 
+void TestFileUtils::SetNextDeleteFileRecursivelyResult(
+    base::Optional<bool> delete_result) {
+  delete_file_recursively_result_ = delete_result;
+}
+
 int TestFileUtils::WriteFile(const base::FilePath& filename,
                              const char* data,
                              int size) {
@@ -37,4 +46,10 @@
   return FileUtilsWrapper::WriteFile(filename, data, size);
 }
 
+bool TestFileUtils::DeleteFileRecursively(const base::FilePath& path) {
+  return delete_file_recursively_result_
+             ? *delete_file_recursively_result_
+             : FileUtilsWrapper::DeleteFileRecursively(path);
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/test/test_file_utils.h b/chrome/browser/web_applications/test/test_file_utils.h
index 1168fad..3ba1bc7 100644
--- a/chrome/browser/web_applications/test/test_file_utils.h
+++ b/chrome/browser/web_applications/test/test_file_utils.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "base/optional.h"
 #include "chrome/browser/web_applications/file_utils_wrapper.h"
 
 namespace web_app {
@@ -15,24 +16,29 @@
 // A testing implementation to intercept calls to the file system.
 class TestFileUtils : public FileUtilsWrapper {
  public:
-  TestFileUtils() = default;
-  ~TestFileUtils() override = default;
+  TestFileUtils();
+  TestFileUtils(const TestFileUtils&);
+  ~TestFileUtils() override;
 
   // FileUtilsWrapper:
   std::unique_ptr<FileUtilsWrapper> Clone() override;
   int WriteFile(const base::FilePath& filename,
                 const char* data,
                 int size) override;
+  bool DeleteFileRecursively(const base::FilePath& path) override;
 
   static constexpr int kNoLimit = -1;
 
   // Simulate "disk full" error: limit disk space for |WriteFile| operations.
   void SetRemainingDiskSpaceSize(int remaining_disk_space);
 
+  void SetNextDeleteFileRecursivelyResult(base::Optional<bool> delete_result);
+
  private:
+  base::Optional<bool> delete_file_recursively_result_;
   int remaining_disk_space_ = kNoLimit;
 
-  DISALLOW_COPY_AND_ASSIGN(TestFileUtils);
+  DISALLOW_ASSIGN(TestFileUtils);
 };
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/test/test_install_finalizer.cc b/chrome/browser/web_applications/test/test_install_finalizer.cc
index 88cd19c..46bb79b 100644
--- a/chrome/browser/web_applications/test/test_install_finalizer.cc
+++ b/chrome/browser/web_applications/test/test_install_finalizer.cc
@@ -47,6 +47,12 @@
   NOTREACHED();
 }
 
+void TestInstallFinalizer::FinalizeUninstallAfterSync(
+    const AppId& app_id,
+    UninstallWebAppCallback callback) {
+  NOTREACHED();
+}
+
 void TestInstallFinalizer::UninstallExternalWebApp(
     const GURL& app_url,
     UninstallWebAppCallback callback) {
diff --git a/chrome/browser/web_applications/test/test_install_finalizer.h b/chrome/browser/web_applications/test/test_install_finalizer.h
index c335184..7eb6c99 100644
--- a/chrome/browser/web_applications/test/test_install_finalizer.h
+++ b/chrome/browser/web_applications/test/test_install_finalizer.h
@@ -31,6 +31,8 @@
   void FinalizeFallbackInstallAfterSync(
       const AppId& app_id,
       InstallFinalizedCallback callback) override;
+  void FinalizeUninstallAfterSync(const AppId& app_id,
+                                  UninstallWebAppCallback callback) override;
   void FinalizeUpdate(const WebApplicationInfo& web_app_info,
                       InstallFinalizedCallback callback) override;
   void UninstallExternalWebApp(const GURL& app_url,
diff --git a/chrome/browser/web_applications/test/test_web_app_registry_controller.cc b/chrome/browser/web_applications/test/test_web_app_registry_controller.cc
index e14bbfd..1cdcbe6 100644
--- a/chrome/browser/web_applications/test/test_web_app_registry_controller.cc
+++ b/chrome/browser/web_applications/test/test_web_app_registry_controller.cc
@@ -60,7 +60,11 @@
 }
 
 void TestWebAppRegistryController::UninstallWebAppsAfterSync(
-    std::vector<std::unique_ptr<WebApp>> web_apps) {}
+    std::vector<std::unique_ptr<WebApp>> web_apps,
+    RepeatingUninstallCallback callback) {
+  for (const std::unique_ptr<WebApp>& web_app : web_apps)
+    callback.Run(web_app->app_id(), /*uninstalled=*/true);
+}
 
 void TestWebAppRegistryController::DestroySubsystems() {
   mutable_registrar_.reset();
diff --git a/chrome/browser/web_applications/test/test_web_app_registry_controller.h b/chrome/browser/web_applications/test/test_web_app_registry_controller.h
index 02a8650e..3b891788 100644
--- a/chrome/browser/web_applications/test/test_web_app_registry_controller.h
+++ b/chrome/browser/web_applications/test/test_web_app_registry_controller.h
@@ -40,8 +40,8 @@
   // SyncInstallDelegate:
   void InstallWebAppsAfterSync(std::vector<WebApp*> web_apps,
                                RepeatingInstallCallback callback) override;
-  void UninstallWebAppsAfterSync(
-      std::vector<std::unique_ptr<WebApp>> web_apps) override;
+  void UninstallWebAppsAfterSync(std::vector<std::unique_ptr<WebApp>> web_apps,
+                                 RepeatingUninstallCallback callback) override;
 
   void DestroySubsystems();
 
diff --git a/chrome/browser/web_applications/test/web_app_install_observer.cc b/chrome/browser/web_applications/test/web_app_install_observer.cc
index 964967e92..a009414 100644
--- a/chrome/browser/web_applications/test/web_app_install_observer.cc
+++ b/chrome/browser/web_applications/test/web_app_install_observer.cc
@@ -8,10 +8,14 @@
 
 namespace web_app {
 
-WebAppInstallObserver::WebAppInstallObserver(Profile* profile) {
-  observer_.Add(&WebAppProviderBase::GetProviderBase(profile)->registrar());
+WebAppInstallObserver::WebAppInstallObserver(AppRegistrar* registrar) {
+  observer_.Add(registrar);
 }
 
+WebAppInstallObserver::WebAppInstallObserver(Profile* profile)
+    : WebAppInstallObserver(
+          &WebAppProviderBase::GetProviderBase(profile)->registrar()) {}
+
 WebAppInstallObserver::~WebAppInstallObserver() = default;
 
 AppId WebAppInstallObserver::AwaitNextInstall() {
@@ -19,9 +23,19 @@
   return std::move(app_id_);
 }
 
+void WebAppInstallObserver::SetWebAppUninstalledDelegate(
+    WebAppUninstalledDelegate delegate) {
+  app_uninstalled_delegate_ = delegate;
+}
+
 void WebAppInstallObserver::OnWebAppInstalled(const AppId& app_id) {
   app_id_ = app_id;
   run_loop_.Quit();
 }
 
+void WebAppInstallObserver::OnWebAppUninstalled(const AppId& app_id) {
+  if (app_uninstalled_delegate_)
+    app_uninstalled_delegate_.Run(app_id);
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/test/web_app_install_observer.h b/chrome/browser/web_applications/test/web_app_install_observer.h
index cf8de8d..80baa6c 100644
--- a/chrome/browser/web_applications/test/web_app_install_observer.h
+++ b/chrome/browser/web_applications/test/web_app_install_observer.h
@@ -11,22 +11,34 @@
 #include "base/scoped_observer.h"
 #include "chrome/browser/web_applications/components/app_registrar.h"
 #include "chrome/browser/web_applications/components/app_registrar_observer.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 
 namespace web_app {
 
+class AppRegistrar;
+
 class WebAppInstallObserver final : public AppRegistrarObserver {
  public:
+  explicit WebAppInstallObserver(AppRegistrar* registrar);
   explicit WebAppInstallObserver(Profile* profile);
   ~WebAppInstallObserver() override;
 
   AppId AwaitNextInstall();
 
+  using WebAppUninstalledDelegate =
+      base::RepeatingCallback<void(const AppId& app_id)>;
+  void SetWebAppUninstalledDelegate(WebAppUninstalledDelegate delegate);
+
   // AppRegistrarObserver:
   void OnWebAppInstalled(const AppId& app_id) override;
+  void OnWebAppUninstalled(const AppId& app_id) override;
 
  private:
   base::RunLoop run_loop_;
   AppId app_id_;
+
+  WebAppUninstalledDelegate app_uninstalled_delegate_;
+
   ScopedObserver<AppRegistrar, AppRegistrarObserver> observer_{this};
 
   DISALLOW_COPY_AND_ASSIGN(WebAppInstallObserver);
diff --git a/chrome/browser/web_applications/web_app_icon_manager.cc b/chrome/browser/web_applications/web_app_icon_manager.cc
index 3c5b064..a2e03c6 100644
--- a/chrome/browser/web_applications/web_app_icon_manager.cc
+++ b/chrome/browser/web_applications/web_app_icon_manager.cc
@@ -32,6 +32,11 @@
 constexpr base::FilePath::CharType kIconsDirectoryName[] =
     FILE_PATH_LITERAL("Icons");
 
+base::FilePath GetAppDirectory(const base::FilePath& web_apps_directory,
+                               const AppId& app_id) {
+  return web_apps_directory.AppendASCII(app_id);
+}
+
 base::FilePath GetTempDir(FileUtilsWrapper* utils,
                           const base::FilePath& web_apps_dir) {
   // Create the temp directory as a sub-directory of the WebApps directory.
@@ -127,8 +132,8 @@
     return false;
 
   // Commit: move whole app data dir to final destination in one mv operation.
-  const base::FilePath app_id_dir = web_apps_directory.AppendASCII(app_id);
-  if (!utils->Move(app_temp_dir.GetPath(), app_id_dir)) {
+  const base::FilePath app_dir = GetAppDirectory(web_apps_directory, app_id);
+  if (!utils->Move(app_temp_dir.GetPath(), app_dir)) {
     LOG(ERROR) << "Could not move temp WebApp directory to final destination.";
     return false;
   }
@@ -138,12 +143,21 @@
 }
 
 // Performs blocking I/O. May be called on another thread.
+// Returns true if no errors occurred.
+bool DeleteDataBlocking(std::unique_ptr<FileUtilsWrapper> utils,
+                        base::FilePath web_apps_directory,
+                        AppId app_id) {
+  const base::FilePath app_dir = GetAppDirectory(web_apps_directory, app_id);
+  return utils->DeleteFileRecursively(app_dir);
+}
+
+// Performs blocking I/O. May be called on another thread.
 // Returns empty SkBitmap if any errors occurred.
 SkBitmap ReadIconBlocking(std::unique_ptr<FileUtilsWrapper> utils,
                           base::FilePath web_apps_directory,
                           AppId app_id,
                           int icon_size_px) {
-  const base::FilePath app_dir = web_apps_directory.AppendASCII(app_id);
+  const base::FilePath app_dir = GetAppDirectory(web_apps_directory, app_id);
   const base::FilePath icons_dir = app_dir.Append(kIconsDirectoryName);
 
   base::FilePath icon_file =
@@ -194,6 +208,16 @@
       std::move(callback));
 }
 
+void WebAppIconManager::DeleteData(AppId app_id, WriteDataCallback callback) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  base::PostTaskAndReplyWithResult(
+      FROM_HERE, kTaskTraits,
+      base::BindOnce(DeleteDataBlocking, utils_->Clone(), web_apps_directory_,
+                     std::move(app_id)),
+      std::move(callback));
+}
+
 bool WebAppIconManager::ReadIcon(const AppId& app_id,
                                  int icon_size_in_px,
                                  ReadIconCallback callback) {
diff --git a/chrome/browser/web_applications/web_app_icon_manager.h b/chrome/browser/web_applications/web_app_icon_manager.h
index 99ead85e..6ccafe04 100644
--- a/chrome/browser/web_applications/web_app_icon_manager.h
+++ b/chrome/browser/web_applications/web_app_icon_manager.h
@@ -33,6 +33,7 @@
   void WriteData(AppId app_id,
                  std::vector<WebApplicationIconInfo> icon_infos,
                  WriteDataCallback callback);
+  void DeleteData(AppId app_id, WriteDataCallback callback);
 
   // AppIconManager:
   bool ReadIcon(const AppId& app_id,
diff --git a/chrome/browser/web_applications/web_app_icon_manager_unittest.cc b/chrome/browser/web_applications/web_app_icon_manager_unittest.cc
index c840076..5236bfb8 100644
--- a/chrome/browser/web_applications/web_app_icon_manager_unittest.cc
+++ b/chrome/browser/web_applications/web_app_icon_manager_unittest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/web_applications/web_app_icon_manager.h"
+
 #include <memory>
 
 #include "base/bind_helpers.h"
@@ -10,6 +11,7 @@
 #include "base/test/bind_test_util.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_icon_generator.h"
+#include "chrome/browser/web_applications/components/web_app_utils.h"
 #include "chrome/browser/web_applications/test/test_file_utils.h"
 #include "chrome/browser/web_applications/test/test_web_app_database_factory.h"
 #include "chrome/browser/web_applications/test/test_web_app_registry_controller.h"
@@ -22,6 +24,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkColor.h"
 
 namespace web_app {
 
@@ -54,6 +57,7 @@
 
     for (size_t i = 0; i < sizes_px.size(); ++i) {
       std::string icon_name = base::StringPrintf("app-%d.ico", sizes_px[i]);
+      // icon_url is empty if app_url is empty.
       GURL icon_url = app_url.Resolve(icon_name);
       icon_infos.push_back(GenerateIconInfo(icon_url, sizes_px[i], colors[i]));
     }
@@ -100,6 +104,10 @@
   WebAppRegistrar& registrar() { return controller().registrar(); }
   WebAppSyncBridge& sync_bridge() { return controller().sync_bridge(); }
   WebAppIconManager& icon_manager() { return *icon_manager_; }
+  TestFileUtils& file_utils() {
+    DCHECK(file_utils_);
+    return *file_utils_;
+  }
 
  private:
   std::unique_ptr<TestWebAppRegistryController> test_registry_controller_;
@@ -251,4 +259,54 @@
   }
 }
 
+TEST_F(WebAppIconManagerTest, DeleteData_Success) {
+  const AppId app1_id = GenerateAppIdFromURL(GURL("https://example.com/"));
+  const AppId app2_id = GenerateAppIdFromURL(GURL("https://example.org/"));
+  const GURL icons_root_url;  // url is empty to indicate autogenerated icons.
+
+  const std::vector<int> sizes_px{icon_size::k128};
+  const std::vector<SkColor> colors{SK_ColorMAGENTA};
+  WriteIcons(app1_id, icons_root_url, sizes_px, colors);
+  WriteIcons(app2_id, icons_root_url, sizes_px, colors);
+
+  const base::FilePath web_apps_directory = GetWebAppsDirectory(profile());
+  const base::FilePath app1_dir = web_apps_directory.AppendASCII(app1_id);
+  const base::FilePath app2_dir = web_apps_directory.AppendASCII(app2_id);
+
+  EXPECT_TRUE(file_utils().DirectoryExists(app1_dir));
+  EXPECT_FALSE(file_utils().IsDirectoryEmpty(app1_dir));
+
+  EXPECT_TRUE(file_utils().DirectoryExists(app2_dir));
+  EXPECT_FALSE(file_utils().IsDirectoryEmpty(app2_dir));
+
+  base::RunLoop run_loop;
+  icon_manager().DeleteData(app2_id,
+                            base::BindLambdaForTesting([&](bool success) {
+                              EXPECT_TRUE(success);
+                              run_loop.Quit();
+                            }));
+  run_loop.Run();
+
+  EXPECT_TRUE(file_utils().DirectoryExists(web_apps_directory));
+
+  EXPECT_TRUE(file_utils().DirectoryExists(app1_dir));
+  EXPECT_FALSE(file_utils().IsDirectoryEmpty(app1_dir));
+
+  EXPECT_FALSE(file_utils().DirectoryExists(app2_dir));
+}
+
+TEST_F(WebAppIconManagerTest, DeleteData_Failure) {
+  const AppId app_id = GenerateAppIdFromURL(GURL("https://example.com/"));
+
+  file_utils().SetNextDeleteFileRecursivelyResult(false);
+
+  base::RunLoop run_loop;
+  icon_manager().DeleteData(app_id,
+                            base::BindLambdaForTesting([&](bool success) {
+                              EXPECT_FALSE(success);
+                              run_loop.Quit();
+                            }));
+  run_loop.Run();
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.cc b/chrome/browser/web_applications/web_app_install_finalizer.cc
index b084fee4..dac55d6 100644
--- a/chrome/browser/web_applications/web_app_install_finalizer.cc
+++ b/chrome/browser/web_applications/web_app_install_finalizer.cc
@@ -205,6 +205,27 @@
                      std::move(fallback_install_callback), std::move(web_app)));
 }
 
+void WebAppInstallFinalizer::FinalizeUninstallAfterSync(
+    const AppId& app_id,
+    UninstallWebAppCallback callback) {
+  // WebAppSyncBridge::ApplySyncChangesToRegistrar does the actual
+  // unregistration of the app from the registry.
+  DCHECK(!sync_bridge_->registrar().GetAppById(app_id));
+
+  icon_manager_->DeleteData(
+      app_id, base::BindOnce(&WebAppInstallFinalizer::OnIconsDataDeleted,
+                             weak_ptr_factory_.GetWeakPtr(), app_id,
+                             std::move(callback)));
+}
+
+void WebAppInstallFinalizer::OnIconsDataDeleted(
+    const AppId& app_id,
+    UninstallWebAppCallback callback,
+    bool success) {
+  registrar().NotifyWebAppUninstalled(app_id);
+  std::move(callback).Run(success);
+}
+
 void WebAppInstallFinalizer::UninstallExternalWebApp(
     const GURL& app_url,
     UninstallWebAppCallback callback) {
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.h b/chrome/browser/web_applications/web_app_install_finalizer.h
index ea0ba7b..9c7c3a46 100644
--- a/chrome/browser/web_applications/web_app_install_finalizer.h
+++ b/chrome/browser/web_applications/web_app_install_finalizer.h
@@ -32,6 +32,8 @@
   void FinalizeFallbackInstallAfterSync(
       const AppId& app_id,
       InstallFinalizedCallback callback) override;
+  void FinalizeUninstallAfterSync(const AppId& app_id,
+                                  UninstallWebAppCallback callback) override;
   void FinalizeUpdate(const WebApplicationInfo& web_app_info,
                       InstallFinalizedCallback callback) override;
   void UninstallExternalWebApp(const GURL& app_url,
@@ -45,6 +47,9 @@
   void OnIconsDataWritten(InstallFinalizedCallback callback,
                           std::unique_ptr<WebApp> web_app,
                           bool success);
+  void OnIconsDataDeleted(const AppId& app_id,
+                          UninstallWebAppCallback callback,
+                          bool success);
   void OnDatabaseCommitCompleted(InstallFinalizedCallback callback,
                                  const AppId& app_id,
                                  bool success);
diff --git a/chrome/browser/web_applications/web_app_install_manager.cc b/chrome/browser/web_applications/web_app_install_manager.cc
index 3fd83c8e..be3d652 100644
--- a/chrome/browser/web_applications/web_app_install_manager.cc
+++ b/chrome/browser/web_applications/web_app_install_manager.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/components/app_registrar.h"
@@ -212,9 +213,17 @@
 }
 
 void WebAppInstallManager::UninstallWebAppsAfterSync(
-    std::vector<std::unique_ptr<WebApp>> web_apps) {
-  // TODO(crbug.com/860583): Implement sync-initiated app uninstalls.
-  NOTIMPLEMENTED();
+    std::vector<std::unique_ptr<WebApp>> web_apps,
+    RepeatingUninstallCallback callback) {
+  for (std::unique_ptr<WebApp>& web_app : web_apps) {
+    const AppId& app_id = web_app->app_id();
+
+    finalizer()->FinalizeUninstallAfterSync(
+        app_id,
+        base::BindOnce(&WebAppInstallManager::OnWebAppUninstalledAfterSync,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(web_app),
+                       callback));
+  }
 }
 
 void WebAppInstallManager::SetUrlLoaderForTesting(
@@ -326,6 +335,15 @@
   }
 }
 
+void WebAppInstallManager::OnWebAppUninstalledAfterSync(
+    std::unique_ptr<WebApp> web_app,
+    OnceUninstallCallback callback,
+    bool uninstalled) {
+  UMA_HISTOGRAM_BOOLEAN("Webapp.SyncInitiatedUninstallResult", uninstalled);
+  std::move(callback).Run(web_app->app_id(), uninstalled);
+  // web_app data is destroyed here.
+}
+
 content::WebContents* WebAppInstallManager::EnsureWebContentsCreated() {
   if (web_contents_)
     return web_contents_.get();
diff --git a/chrome/browser/web_applications/web_app_install_manager.h b/chrome/browser/web_applications/web_app_install_manager.h
index ef67405..fc791e61 100644
--- a/chrome/browser/web_applications/web_app_install_manager.h
+++ b/chrome/browser/web_applications/web_app_install_manager.h
@@ -75,8 +75,8 @@
   // For the new USS-based system only. SyncInstallDelegate:
   void InstallWebAppsAfterSync(std::vector<WebApp*> web_apps,
                                RepeatingInstallCallback callback) override;
-  void UninstallWebAppsAfterSync(
-      std::vector<std::unique_ptr<WebApp>> web_apps) override;
+  void UninstallWebAppsAfterSync(std::vector<std::unique_ptr<WebApp>> web_apps,
+                                 RepeatingUninstallCallback callback) override;
 
   using DataRetrieverFactory =
       base::RepeatingCallback<std::unique_ptr<WebAppDataRetriever>()>;
@@ -105,6 +105,9 @@
                                   OnceInstallCallback callback,
                                   const AppId& installed_app_id,
                                   InstallResultCode code);
+  void OnWebAppUninstalledAfterSync(std::unique_ptr<WebApp> web_app,
+                                    OnceUninstallCallback callback,
+                                    bool uninstalled);
 
   void OnLoadWebAppAndCheckInstallabilityCompleted(
       WebAppInstallTask* task,
diff --git a/chrome/browser/web_applications/web_app_install_manager_unittest.cc b/chrome/browser/web_applications/web_app_install_manager_unittest.cc
index d916faf..6e6ce07 100644
--- a/chrome/browser/web_applications/web_app_install_manager_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_manager_unittest.cc
@@ -26,6 +26,7 @@
 #include "chrome/browser/web_applications/test/test_web_app_ui_manager.h"
 #include "chrome/browser/web_applications/test/test_web_app_url_loader.h"
 #include "chrome/browser/web_applications/test/web_app_icon_test_utils.h"
+#include "chrome/browser/web_applications/test/web_app_install_observer.h"
 #include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_icon_manager.h"
@@ -148,6 +149,10 @@
   TestAppShortcutManager& shortcut_manager() { return *shortcut_manager_; }
   WebAppInstallFinalizer& finalizer() { return *install_finalizer_; }
   TestWebAppUrlLoader& url_loader() { return *test_url_loader_; }
+  TestFileUtils& file_utils() {
+    DCHECK(file_utils_);
+    return *file_utils_;
+  }
 
   std::unique_ptr<WebApplicationInfo> CreateWebAppInfo(const GURL& url) {
     auto web_app_info = std::make_unique<WebApplicationInfo>();
@@ -556,4 +561,55 @@
   EXPECT_EQ(*expected_app, *app);
 }
 
+TEST_F(WebAppInstallManagerTest, UninstallWebAppsAfterSync) {
+  std::unique_ptr<WebApp> app =
+      CreateWebApp(GURL("https://example.com/path"), Source::kSync,
+                   /*user_display_mode=*/DisplayMode::kStandalone);
+
+  const AppId app_id = app->app_id();
+  InitRegistrarWithApp(std::move(app));
+
+  // Remove app from the in-memory registry.
+  std::vector<std::unique_ptr<WebApp>> apps_unregistered;
+  {
+    Registry& registry = controller().mutable_registrar().registry();
+    auto it = registry.find(app_id);
+    DCHECK(it != registry.end());
+    apps_unregistered.push_back(std::move(it->second));
+    registry.erase(it);
+  }
+
+  file_utils().SetNextDeleteFileRecursivelyResult(true);
+
+  enum Event {
+    kObserver_OnWebAppUninstalled,
+    kUninstallWebAppsAfterSync_Callback
+  };
+  std::vector<Event> event_order;
+
+  WebAppInstallObserver observer(&registrar());
+  observer.SetWebAppUninstalledDelegate(
+      base::BindLambdaForTesting([&](const AppId& uninstalled_app_id) {
+        EXPECT_EQ(uninstalled_app_id, app_id);
+        event_order.push_back(Event::kObserver_OnWebAppUninstalled);
+      }));
+
+  base::RunLoop run_loop;
+  install_manager().UninstallWebAppsAfterSync(
+      std::move(apps_unregistered),
+      base::BindLambdaForTesting(
+          [&](const AppId& uninstalled_app_id, bool uninstalled) {
+            EXPECT_EQ(uninstalled_app_id, app_id);
+            EXPECT_TRUE(uninstalled);
+            event_order.push_back(Event::kUninstallWebAppsAfterSync_Callback);
+            run_loop.Quit();
+          }));
+  run_loop.Run();
+
+  const std::vector<Event> expected_event_order{
+      Event::kObserver_OnWebAppUninstalled,
+      Event::kUninstallWebAppsAfterSync_Callback};
+  EXPECT_EQ(expected_event_order, event_order);
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.cc b/chrome/browser/web_applications/web_app_sync_bridge.cc
index 37438fac..f18cc68 100644
--- a/chrome/browser/web_applications/web_app_sync_bridge.cc
+++ b/chrome/browser/web_applications/web_app_sync_bridge.cc
@@ -403,7 +403,8 @@
   // Do a full follow up uninstall for all deleted remote entities that exist
   // locally and not needed by other sources. We need to clean up disk data
   // (icons).
-  install_delegate_->UninstallWebAppsAfterSync(std::move(apps_unregistered));
+  install_delegate_->UninstallWebAppsAfterSync(std::move(apps_unregistered),
+                                               base::DoNothing());
 }
 
 std::unique_ptr<syncer::MetadataChangeList>
diff --git a/chrome/browser/web_applications/web_app_sync_install_delegate.h b/chrome/browser/web_applications/web_app_sync_install_delegate.h
index 205a926..d5708053 100644
--- a/chrome/browser/web_applications/web_app_sync_install_delegate.h
+++ b/chrome/browser/web_applications/web_app_sync_install_delegate.h
@@ -25,13 +25,16 @@
   using RepeatingInstallCallback =
       base::RepeatingCallback<void(const AppId& app_id,
                                    InstallResultCode code)>;
+  using RepeatingUninstallCallback =
+      base::RepeatingCallback<void(const AppId& app_id, bool uninstalled)>;
 
   // |web_apps| are already registered and owned by the registrar.
   virtual void InstallWebAppsAfterSync(std::vector<WebApp*> web_apps,
                                        RepeatingInstallCallback callback) = 0;
   // |web_apps| are already unregistered and not owned by the registrar.
   virtual void UninstallWebAppsAfterSync(
-      std::vector<std::unique_ptr<WebApp>> web_apps) = 0;
+      std::vector<std::unique_ptr<WebApp>> web_apps,
+      RepeatingUninstallCallback callback) = 0;
 };
 
 }  // namespace web_app
diff --git a/chrome/renderer/printing/chrome_print_render_frame_helper_delegate.cc b/chrome/renderer/printing/chrome_print_render_frame_helper_delegate.cc
index 69cde8a..0a58483 100644
--- a/chrome/renderer/printing/chrome_print_render_frame_helper_delegate.cc
+++ b/chrome/renderer/printing/chrome_print_render_frame_helper_delegate.cc
@@ -15,7 +15,7 @@
 #include "content/public/renderer/render_frame.h"
 #include "extensions/buildflags/buildflags.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "services/service_manager/public/cpp/interface_provider.h"
+#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/web/web_document.h"
 #include "third_party/blink/public/web/web_element.h"
 #include "third_party/blink/public/web/web_local_frame.h"
@@ -38,7 +38,7 @@
     return false;
 
   mojo::Remote<chrome::mojom::PrerenderCanceler> canceler;
-  render_frame->GetRemoteInterfaces()->GetInterface(
+  render_frame->GetBrowserInterfaceBroker()->GetInterface(
       canceler.BindNewPipeAndPassReceiver());
   canceler->CancelPrerenderForPrinting();
   return true;
diff --git a/chrome/renderer/url_loader_throttle_provider_impl.cc b/chrome/renderer/url_loader_throttle_provider_impl.cc
index 73850aab..6b01bd4 100644
--- a/chrome/renderer/url_loader_throttle_provider_impl.cc
+++ b/chrome/renderer/url_loader_throttle_provider_impl.cc
@@ -28,7 +28,7 @@
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_thread.h"
 #include "content/public/renderer/render_view.h"
-#include "services/service_manager/public/cpp/interface_provider.h"
+#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "url/gurl.h"
 
@@ -55,7 +55,7 @@
     return nullptr;
 
   auto* canceler = new mojo::Remote<chrome::mojom::PrerenderCanceler>;
-  render_frame->GetRemoteInterfaces()->GetInterface(
+  render_frame->GetBrowserInterfaceBroker()->GetInterface(
       canceler->BindNewPipeAndPassReceiver());
   base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, canceler);
   return canceler->get();
diff --git a/chrome/services/app_service/OWNERS b/chrome/services/app_service/OWNERS
index fc5c3bf..fb7902ac 100644
--- a/chrome/services/app_service/OWNERS
+++ b/chrome/services/app_service/OWNERS
@@ -1,5 +1 @@
-benwells@chromium.org
-dominickn@chromium.org
-nigeltao@chromium.org
-
-# COMPONENT: Platform>Apps>Foundation
+file://components/services/app_service/OWNERS
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 68ab98d9..8129540d 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -6585,3 +6585,12 @@
     ]
   }
 }
+
+group("closure_compile") {
+  testonly = true
+
+  deps = [
+    "data:closure_compile",
+    # TODO(crbug/1000989): Add a dep for base/js2gtest.js.
+  ]
+}
diff --git a/chrome/test/data/BUILD.gn b/chrome/test/data/BUILD.gn
index befb2de..af345a4 100644
--- a/chrome/test/data/BUILD.gn
+++ b/chrome/test/data/BUILD.gn
@@ -4,6 +4,7 @@
 
 import("//chrome/common/features.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
+import("//third_party/closure_compiler/compile_js.gni")
 import("//tools/grit/grit_rule.gni")
 
 grit("webui_test_resources") {
@@ -30,3 +31,23 @@
     "webui/web_ui_test.mojom",
   ]
 }
+
+js_type_check("closure_compile") {
+  deps = [
+    ":test_api_js",
+  ]
+}
+
+js_library("test_api_js") {
+  sources = [
+    "webui/test_api.js",
+  ]
+  externs_list = [
+    "webui/mock4js_externs.js",
+    "//third_party/chaijs/externs/chai-3.5.js",
+    "//ui/webui/resources/js/dom_automation_controller.js",
+  ]
+  deps = [
+    ":web_ui_test_bindings_js_library_for_compile",
+  ]
+}
diff --git a/chrome/test/data/local_ntp/realbox_browsertest.js b/chrome/test/data/local_ntp/realbox_browsertest.js
index 97c45320..0bcfc0bf 100644
--- a/chrome/test/data/local_ntp/realbox_browsertest.js
+++ b/chrome/test/data/local_ntp/realbox_browsertest.js
@@ -934,6 +934,7 @@
   test.realbox.realboxEl.value = 'hello world';
   test.realbox.realboxEl.dispatchEvent(new CustomEvent('input'));
 
+  assertEquals(1, test.realbox.queries.length);
   chrome.embeddedSearch.searchBox.onqueryautocompletedone({
     input: test.realbox.realboxEl.value,
     matches: [test.realbox.getSearchMatch(), test.realbox.getUrlMatch()],
@@ -963,6 +964,15 @@
   test.realbox.realboxEl.dispatchEvent(arrowDown);
   assertTrue(arrowDown.defaultPrevented);
 
+  assertFalse(test.realbox.wrapperEl.classList.contains(
+      test.realbox.CLASSES.SHOW_MATCHES));
+
+  assertEquals(2, test.realbox.queries.length);
+  chrome.embeddedSearch.searchBox.onqueryautocompletedone({
+    input: test.realbox.realboxEl.value,
+    matches: [test.realbox.getSearchMatch(), test.realbox.getUrlMatch()],
+  });
+
   assertTrue(test.realbox.wrapperEl.classList.contains(
       test.realbox.CLASSES.SHOW_MATCHES));
 };
diff --git a/chrome/test/data/webui/mock4js_externs.js b/chrome/test/data/webui/mock4js_externs.js
new file mode 100644
index 0000000..082bcd3d
--- /dev/null
+++ b/chrome/test/data/webui/mock4js_externs.js
@@ -0,0 +1,24 @@
+// Copyright 2019 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
+ * Limited externs used by webui testing from http://mock4js.sourceforge.net/.
+ * Mock4JS is not closure-annotated and unmaintained.
+ * TODO(crbug/844820): Eliminate/replace usage of mock4js and delete this file.
+ */
+
+function mock(klass) {}
+
+const Mock4JS = {
+  verifyAllMocks: function() {},
+  addMockSupport: function(exports) {},
+};
+
+class Mock {
+  proxy() {}
+  expects(expectedCallCount) {}
+  stubs() {}
+  verify() {}
+}
diff --git a/chrome/test/data/webui/tab_strip/tab_list_test.js b/chrome/test/data/webui/tab_strip/tab_list_test.js
index cc6dcf2..563dd6e9b 100644
--- a/chrome/test/data/webui/tab_strip/tab_list_test.js
+++ b/chrome/test/data/webui/tab_strip/tab_list_test.js
@@ -419,6 +419,7 @@
     // Wait for slideIn animations to complete updating widths and reset
     // resolvers to track new calls.
     await tabList.animationPromises;
+    await testTabsApiProxy.whenCalled('setThumbnailTracked');
     testTabsApiProxy.reset();
     const tabElements = getUnpinnedTabs();
 
@@ -460,6 +461,7 @@
 
   test('tracks and untracks thumbnails based on pinned state', async () => {
     await tabList.animationPromises;
+    await testTabsApiProxy.whenCalled('setThumbnailTracked');
     testTabsApiProxy.reset();
 
     // Update width such that at all tabs can fit and do not fire the
@@ -480,18 +482,13 @@
     [tabId, thumbnailTracked] =
         await testTabsApiProxy.whenCalled('setThumbnailTracked');
 
-    // TODO(johntlee): Remove debug logs if tests are no longer flaky.
-    console.log(`Window width is ${window.innerWidth}px`);
-    for (const tabElement of getUnpinnedTabs()) {
-      console.log(`Tab ${tabElement.tab.id} is at ${tabElement.offsetLeft}`);
-    }
-
     assertEquals(tabId, tabs[2].id);
     assertEquals(thumbnailTracked, true);
   });
 
   test('should update thumbnail track status on visibilitychange', async () => {
     await tabList.animationPromises;
+    await testTabsApiProxy.whenCalled('setThumbnailTracked');
     testTabsApiProxy.reset();
 
     testTabStripEmbedderProxy.setVisible(false);
diff --git a/chrome/test/data/webui/tab_strip/tab_strip_browsertest.js b/chrome/test/data/webui/tab_strip/tab_strip_browsertest.js
index 8082a5c..1f8988ab 100644
--- a/chrome/test/data/webui/tab_strip/tab_strip_browsertest.js
+++ b/chrome/test/data/webui/tab_strip/tab_strip_browsertest.js
@@ -36,8 +36,7 @@
   }
 };
 
-// Flaky on debug builds - crbug.com/1022008
-TEST_F('TabStripTabListTest', 'DISABLED_All', function() {
+TEST_F('TabStripTabListTest', 'All', function() {
   mocha.run();
 });
 
diff --git a/chrome/test/data/webui/test_api.js b/chrome/test/data/webui/test_api.js
index 2e4327c..059e5b8d 100644
--- a/chrome/test/data/webui/test_api.js
+++ b/chrome/test/data/webui/test_api.js
@@ -6,9 +6,13 @@
  * @fileoverview Library providing basic test framework functionality.
  */
 
-// See assert.js for where this is used.
+/**
+ * See assert.js for where this is used.
+ * @suppress {globalThis}
+ */
 this.traceAssertionsForTesting = true;
 
+/** @suppress {globalThis} */
 var hasWindow = !!this.window;
 
 /**
@@ -101,7 +105,7 @@
    * When set to a string value representing a url, generate BrowsePreload
    * call, which will browse to the url and call fixture.preLoad of the
    * currentTestCase.
-   * @type {string}
+   * @type {?string}
    */
   browsePreload: null,
 
@@ -110,7 +114,7 @@
    * directory, generate BrowsePrintPreload call, which will browse to a url
    * representing the file, cause print, and call fixture.preLoad of the
    * currentTestCase.
-   * @type {string}
+   * @type {?string}
    */
   browsePrintPreload: null,
 
@@ -118,14 +122,14 @@
    * When set to a function, will be called in the context of the test
    * generation inside the function, after AddLibrary calls and before
    * generated C++.
-   * @type {function(string,string)}
+   * @type {?function(string,string)}
    */
   testGenPreamble: null,
 
   /**
    * When set to a function, will be called in the context of the test
    * generation inside the function, and after any generated C++.
-   * @type {function(string,string)}
+   * @type {?function(string,string)}
    */
   testGenPostamble: null,
 
@@ -139,7 +143,7 @@
   /**
    * This should be initialized by the test fixture and can be referenced
    * during the test run. It holds any mocked handler methods.
-   * @type {?Mock4JS.Mock}
+   * @type {?Mock}
    */
   mockHandler: null,
 
@@ -180,14 +184,17 @@
 
   /**
    * Configuration for the accessibility audit.
-   * @type {axs.AuditConfiguration}
+   * TODO(crbug/1000989): Enable type checks for axs.
+   * @type {Object} an axs.AuditConfiguration
    */
   accessibilityAuditConfig_: null,
 
   /**
    * Returns the configuration for the accessibility audit, creating it
    * on-demand.
-   * @return {!axs.AuditConfiguration}
+   * TODO(crbug/1000989): Enable type checks for axs.
+   * @suppress {undefinedVars|missingProperties}
+   * @return {Object} an axs.AuditConfiguration!
    */
   get accessibilityAuditConfig() {
     if (!this.accessibilityAuditConfig_) {
@@ -294,6 +301,8 @@
 
   /**
    * Override this method to perform tasks before running your test.
+   * TODO(crbug/1000989): Enable type checks for axs.
+   * @suppress {missingProperties}
    * @type {Function}
    */
   setUp: function() {
@@ -357,12 +366,12 @@
    * used as a listener function.
    * @param {WhenTestDone} whenTestDone Call testDone() at the appropriate
    *     time.
-   * @param {Function} completion The function to call to complete the test.
+   * @param {!Function} completion The function to call to complete the test.
    * @param {...*} var_args Arguments to pass when calling completionAction.
    * @return {function(): void} Return a function, bound to this test fixture,
    *     which continues the test.
    */
-  continueTest: function(whenTestDone, completion) {
+  continueTest: function(whenTestDone, completion, var_args) {
     var savedArgs = new SaveMockArguments();
     var completionAction = new CallFunctionAction(
         this, savedArgs, completion, Array.prototype.slice.call(arguments, 2));
@@ -379,7 +388,6 @@
   /**
    * Call this during setUp to defer the call to runTest() until later. The
    * caller must call the returned function at some point to run the test.
-   * @type {Function}
    * @param {WhenTestDone} whenTestDone Call testDone() at the appropriate
    *     time.
    * @param {...*} var_args Arguments to pass when running the
@@ -387,7 +395,7 @@
    * @return {function(): void} A function which will run the current body of
    *     the currentTestCase.
    */
-  deferRunTest: function(whenTestDone) {
+  deferRunTest: function(whenTestDone, var_args) {
     if (whenTestDone === WhenTestDone.DEFAULT) {
       whenTestDone = WhenTestDone.ALWAYS;
     }
@@ -415,13 +423,13 @@
 TestCase.prototype = {
   /**
    * The name of this test.
-   * @type {string}
+   * @type {?string}
    */
   name: null,
 
   /**
    * The test fixture to set |this| to when running the test |body|.
-   * @type {testing.Test}
+   * @type {Test}
    */
   fixture: null,
 
@@ -512,7 +520,6 @@
   /**
    * Cause this TestCase to be deferred (don't call runTest()) until the
    * returned function is called.
-   * @type {Function}
    * @param {WhenTestDone} whenTestDone Call testDone() at the appropriate
    *     time.
    * @param {...*} var_args Arguments to pass when running the
@@ -520,7 +527,7 @@
    * @return {function(): void} A function that will run this TestCase when
    *     called.
    */
-  deferRunTest: function(whenTestDone) {
+  deferRunTest: function(whenTestDone, var_args) {
     this.deferred_ = true;
     var savedArgs = new SaveMockArguments();
     var completionAction = new CallFunctionAction(
@@ -556,8 +563,8 @@
  * Register all methods of {@code mockClass.prototype} with messages of the
  * same name as the method, using the proxy of the |mockObject| as the
  * |messageHandler| when registering.
- * @param {Mock4JS.Mock} mockObject The mock to register callbacks against.
- * @param {function(new:Object)} mockClAss Constructor for the mocked class.
+ * @param {Mock} mockObject The mock to register callbacks against.
+ * @param {Function} mockClass Constructor for the mocked class.
  * @see registerMessageCallback
  * @see overrideChrome
  */
@@ -670,8 +677,8 @@
 
 /**
  * Notifies the running browser test of the test results. Clears |errors|.
- * @param {Array<boolean, string>=} result When passed, this is used for the
- *     testResult message.
+ * No tuple type: b/131114945 (result should be {[boolean, string]}).
+ * @param {Array=} result When passed, this is used for the testResult message.
  */
 function testDone(result) {
   if (!testIsDone) {
@@ -701,9 +708,15 @@
       if (webUiTest.mojom.TestRunnerPtr) {
         // For mojo WebUI tests.
         testRunner = new webUiTest.mojom.TestRunnerPtr();
+
+        /**
+         * @suppress {missingProperties} for mojo.makeRequest - internal method
+         * declared in mojo/public/js/bindings.js.
+         */
+        const mojoMakeRequest = () => mojo.makeRequest(testRunner);
+
         Mojo.bindInterface(
-            webUiTest.mojom.TestRunner.name,
-            mojo.makeRequest(testRunner).handle);
+            webUiTest.mojom.TestRunner.name, mojoMakeRequest().handle);
       } else if (webUiTest.mojom.TestRunnerRemote) {
         // For mojo-lite WebUI tests.
         testRunner = webUiTest.mojom.TestRunner.getRemote();
@@ -721,7 +734,7 @@
       chrome.send('testResult', result);
     } else if (window.domAutomationController.send) {
       // For extension tests.
-      valueResult = {'result': result[0], message: result[1]};
+      const valueResult = {'result': result[0], message: result[1]};
       window.domAutomationController.send(JSON.stringify(valueResult));
     } else {
       assertNotReached('No test framework available');
@@ -747,16 +760,20 @@
 
   for (var i = 0; i < errors.length; ++i) {
     var errorMessage = errors[i].stack || errors[i].message;
+    // Cast JSON.stringify to Function to avoid formal parameter mismatch.
     message += 'Failed: ' + currentTestFunction + '(' +
-        currentTestArguments.map(JSON.stringify) + ')\n' + errorMessage;
+        currentTestArguments.map(/** @type{Function} */ (JSON.stringify)) +
+        ')\n' + errorMessage;
   }
   return message;
 }
 
 /**
  * Returns [success, message] & clears |errors|.
- * @param {boolean} errorsOk When true, errors are ok.
- * @return {Array<boolean, string>}
+ * @param {boolean=} errorsOk When true, errors are ok.
+ *
+ * No tuple type: b/131114945 (result should be {[boolean, string]}).
+ * @return {Array}
  */
 function testResult(errorsOk) {
   var result = [true, ''];
@@ -867,22 +884,39 @@
 }
 
 /**
- * @param {Function} testFunction
- * @param {Function=|string=|RegExp=} opt_expected The expected Error
- *     constructor, partial or complete error message string, or RegExp to
+ * @param {function()} testFunction
+ * @param {(Function|string|RegExp)=} opt_expected_or_constructor The expected
+ *     Error constructor, partial or complete error message string, or RegExp to
  *     test the error message.
  * @param {string=} opt_message Additional error message.
  * @throws {Error}
  */
-function assertThrows(testFunction, opt_expected, opt_message) {
-  chai.assert.throws(testFunction, opt_expected, opt_message);
+function assertThrows(testFunction, opt_expected_or_constructor, opt_message) {
+  // The implementation of assert.throws goes like:
+  //  function (fn, errt, errs, msg) {
+  //    if ('string' === typeof errt || errt instanceof RegExp) {
+  //      errs = errt;
+  //      errt = null;
+  //    }
+  //    ...
+  // That is, if the second argument is string or RegExp, the type of the
+  // exception is not checked: only the error message. This is achieved by
+  // partially "shifting" parameters (the "additional error message" is not
+  // shifted and will be lost). "Shifting" isn't a thing Closure understands, so
+  // just cast to string.
+  // TODO(crbug/1000989): Refactor this into something that makes sense when
+  // tests are actually compiled and we can do that safely.
+  chai.assert.throws(
+      testFunction,
+      /** @type{string} */ (opt_expected_or_constructor), opt_message);
 }
 
 /**
  * Run an accessibility audit on the current page state.
- * @type {Function}
+ * TODO(crbug/1000989): Enable type checks for axs.
+ * @suppress {checkTypes}
  * @param {Array} a11yResults
- * @param {axs.AuditConfiguration=} opt_config
+ * @param {Object=} opt_config, an axs.AuditConfiguration=
  * @return {boolean} Whether there were any errors or warnings
  * @private
  */
@@ -907,11 +941,14 @@
  * |a11yResults| and
  * |a11yWarnings| in to an accessibility report, appends it to the given
  * |message| and returns the resulting message string.
- * @param {Array<string>} a11yResults The list of accessibility results
+ * TODO(crbug/1000989): Enable type checks for axs.
+ * @suppress {missingProperties}
+ * @param {Array<Object>} a11yResults The list of accessibility results
+ * @param {string=} opt_message
  * @return {string} |message| + accessibility report.
  */
-function accessibilityAuditReport(a11yResults, message) {
-  message = message ? message + '\n\n' : '\n';
+function accessibilityAuditReport(a11yResults, opt_message) {
+  let message = opt_message ? opt_message + '\n\n' : '\n';
   message += 'Accessibility issues found on ' + window.location.href + '\n';
   message += axs.Audit.createReport(a11yResults);
   return message;
@@ -935,7 +972,7 @@
  * checking by runTest. This allows tests to continue running other checks,
  * while failing the overall test if any errors occurred.
  * @param {Function} assertFunc The function which may throw an Error.
- * @return {function(...*):bool} A function that applies its arguments to
+ * @return {function(...*):boolean} A function that applies its arguments to
  *     |assertFunc| and returns true if |assertFunc| passes.
  * @see errors
  * @see runTestFunction
@@ -976,6 +1013,7 @@
 
   // Avoid eval() if at all possible, since it will not work on pages
   // that have enabled content-security-policy.
+  /** @type {?Function} */
   var testBody = this[testFunction];  // global object -- not a method.
   var testName = testFunction;
 
@@ -986,7 +1024,7 @@
   }
 
   if (typeof testBody === 'undefined') {
-    testBody = eval(testFunction);
+    testBody = /** @type{Function} */ (eval(testFunction));
     testName = testBody.toString();
   }
   if (testBody != RUN_TEST_F) {
@@ -1012,7 +1050,9 @@
  * @param {Array} testArguments The arguments to call |testBody| with.
  * @param {boolean} onlyAssertFails When true, only assertions cause failing
  *     testResult.
- * @return {Array<boolean, string>} [test-succeeded, message-if-failed]
+ *
+ * No tuple type: b/131114945 (result should be {[boolean, string]}).
+ * @return {Array} [test-succeeded, message-if-failed]
  * @see createExpect
  * @see testResult
  */
@@ -1054,6 +1094,7 @@
   }
 
   originalChrome = chrome;
+  /** @suppress {const|checkTypes} */
   chrome = {
     __proto__: originalChrome,
     send: send,
@@ -1202,7 +1243,6 @@
  * @param {Array} args The array to push |actualArgument| onto.
  * @param {Object} realMatcher The real matcher check arguments with.
  * @constructor
- * @extends {realMatcher}
  */
 function SaveMockArgumentMatcher(args, realMatcher) {
   this.arguments_ = args;
@@ -1253,7 +1293,6 @@
  * the mocked method. This class works with SaveMockArgumentMatcher to save
  * arguments so that the invoked Action can pass arguments through to the
  * invoked function.
- * @param {!Object} realMatcher The real matcher to perform matching with.
  * @constructor
  */
 function SaveMockArguments() {
@@ -1284,44 +1323,39 @@
  * @param {Object} obj The object to set |this| to when calling |func_|.
  * @param {?SaveMockArguments} savedArgs when non-null, saved arguments are
  *     passed to |func|.
- * @param {Function} func The function to call.
+ * @param {!Function} func The function to call.
  * @param {Array=} args Any arguments to pass to func.
  * @constructor
  */
 function CallFunctionAction(obj, savedArgs, func, args) {
-  this.obj_ = obj;
-  this.savedArgs_ = savedArgs;
-  this.func_ = func;
-  this.args_ = args ? args : [];
-}
-
-CallFunctionAction.prototype = {
   /**
    * Set |this| to |obj_| when calling |func_|.
    * @type {?Object}
    */
-  obj_: null,
+  this.obj_ = obj;
 
   /**
    * The SaveMockArguments to hold arguments when invoking |func_|.
    * @type {?SaveMockArguments}
    * @private
    */
-  savedArgs_: null,
+  this.savedArgs_ = savedArgs;
 
   /**
    * The function to call when invoked.
    * @type {!Function}
    * @private
    */
-  func_: null,
+  this.func_ = func;
 
   /**
    * Arguments to pass to |func_| when invoked.
    * @type {!Array}
    */
-  args_: null,
+  this.args_ = args || [];
+}
 
+CallFunctionAction.prototype = {
   /**
    * Accessor for |func_|.
    * @return {Function} The function to invoke.
@@ -1356,11 +1390,11 @@
 
 /**
  * Syntactic sugar for use with will() on a Mock4JS.Mock.
- * @param {Function} func The function to call when the method is invoked.
+ * @param {!Function} func The function to call when the method is invoked.
  * @param {...*} var_args Arguments to pass when calling func.
  * @return {CallFunctionAction} Action for use in will.
  */
-function callFunction(func) {
+function callFunction(func, var_args) {
   return new CallFunctionAction(
       null, null, func, Array.prototype.slice.call(arguments, 1));
 }
@@ -1369,11 +1403,11 @@
  * Syntactic sugar for use with will() on a Mock4JS.Mock.
  * @param {SaveMockArguments} savedArgs Arguments saved with this object
  *     are passed to |func|.
- * @param {Function} func The function to call when the method is invoked.
+ * @param {!Function} func The function to call when the method is invoked.
  * @param {...*} var_args Arguments to pass when calling func.
  * @return {CallFunctionAction} Action for use in will.
  */
-function callFunctionWithSavedArgs(savedArgs, func) {
+function callFunctionWithSavedArgs(savedArgs, func, var_args) {
   return new CallFunctionAction(
       null, savedArgs, func, Array.prototype.slice.call(arguments, 2));
 }
@@ -1491,10 +1525,10 @@
 
 /**
  * Syntactic sugar for use with will() on a Mock4JS.Mock.
- * @param {...Object} var_actions Actions to run.
+ * @param {...*} var_args Actions to run.
  * @return {RunAllAction} Action for use in will.
  */
-function runAllActions() {
+function runAllActions(var_args) {
   return new RunAllAction(
       false, WhenTestDone.NEVER, Array.prototype.slice.call(arguments));
 }
@@ -1503,10 +1537,10 @@
  * Syntactic sugar for use with will() on a Mock4JS.Mock.
  * @param {WhenTestDone} whenTestDone Call testDone() at the appropriate
  *     time.
- * @param {...Object} var_actions Actions to run.
+ * @param {...*} var_args Actions to run.
  * @return {RunAllAction} Action for use in will.
  */
-function runAllActionsAsync(whenTestDone) {
+function runAllActionsAsync(whenTestDone, var_args) {
   return new RunAllAction(
       true, whenTestDone, Array.prototype.slice.call(arguments, 1));
 }
diff --git a/chromecast/base/metrics/cast_metrics_helper.cc b/chromecast/base/metrics/cast_metrics_helper.cc
index ae793cc..58cca4c 100644
--- a/chromecast/base/metrics/cast_metrics_helper.cc
+++ b/chromecast/base/metrics/cast_metrics_helper.cc
@@ -308,10 +308,17 @@
 }
 
 void CastMetricsHelper::RecordApplicationEvent(const std::string& event) {
+  RecordApplicationEvent(app_id_, session_id_, sdk_version_, event);
+}
+
+void CastMetricsHelper::RecordApplicationEvent(const std::string& app_id,
+                                               const std::string& session_id,
+                                               const std::string& sdk_version,
+                                               const std::string& event) {
   base::Value cast_event = CreateEventBase(event);
-  cast_event.SetKey("app_id", base::Value(app_id_));
-  cast_event.SetKey("session_id", base::Value(session_id_));
-  cast_event.SetKey("sdk_version", base::Value(sdk_version_));
+  cast_event.SetKey("app_id", base::Value(app_id));
+  cast_event.SetKey("session_id", base::Value(session_id));
+  cast_event.SetKey("sdk_version", base::Value(sdk_version));
   std::string message;
   base::JSONWriter::Write(cast_event, &message);
   RecordSimpleAction(message);
diff --git a/chromecast/base/metrics/cast_metrics_helper.h b/chromecast/base/metrics/cast_metrics_helper.h
index 1b2ae40..9b6d348c 100644
--- a/chromecast/base/metrics/cast_metrics_helper.h
+++ b/chromecast/base/metrics/cast_metrics_helper.h
@@ -92,6 +92,10 @@
 
   // Logs application specific events.
   virtual void RecordApplicationEvent(const std::string& event);
+  virtual void RecordApplicationEvent(const std::string& app_id,
+                                      const std::string& session_id,
+                                      const std::string& sdk_version,
+                                      const std::string& event);
   virtual void RecordApplicationEventWithValue(const std::string& event,
                                                int value);
 
diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc
index 4d04868d..5d11f77 100644
--- a/chromecast/browser/cast_content_browser_client.cc
+++ b/chromecast/browser/cast_content_browser_client.cc
@@ -547,7 +547,7 @@
     storage::OptionalQuotaSettingsCallback callback) {
   storage::GetNominalDynamicSettings(
       partition->GetPath(), context->IsOffTheRecord(),
-      storage::GetDefaultDiskInfoHelper(), std::move(callback));
+      storage::GetDefaultDeviceInfoHelper(), std::move(callback));
 }
 
 void CastContentBrowserClient::AllowCertificateError(
diff --git a/chromecast/browser/cast_web_view.cc b/chromecast/browser/cast_web_view.cc
index 986e5f25..e74bea8 100644
--- a/chromecast/browser/cast_web_view.cc
+++ b/chromecast/browser/cast_web_view.cc
@@ -33,4 +33,6 @@
 
 CastWebView::CreateParams::CreateParams(const CreateParams& other) = default;
 
+CastWebView::CreateParams::~CreateParams() = default;
+
 }  // namespace chromecast
diff --git a/chromecast/browser/cast_web_view.h b/chromecast/browser/cast_web_view.h
index dec69dd..97ed5697 100644
--- a/chromecast/browser/cast_web_view.h
+++ b/chromecast/browser/cast_web_view.h
@@ -66,6 +66,9 @@
     // Identifies the activity that is hosted by this CastWebView.
     std::string activity_id = "";
 
+    // Sdk version of the application (if available) hosted by this CastWebView.
+    std::string sdk_version = "";
+
     // Whether this CastWebView is granted media access.
     bool allow_media_access = false;
 
@@ -81,6 +84,7 @@
 
     CreateParams();
     CreateParams(const CreateParams& other);
+    ~CreateParams();
   };
 
   CastWebView();
diff --git a/chromecast/browser/cast_web_view_default.cc b/chromecast/browser/cast_web_view_default.cc
index a273a9e..44f1584 100644
--- a/chromecast/browser/cast_web_view_default.cc
+++ b/chromecast/browser/cast_web_view_default.cc
@@ -60,6 +60,9 @@
       browser_context_(browser_context),
       site_instance_(std::move(site_instance)),
       delegate_(params.delegate),
+      activity_id_(params.activity_id),
+      session_id_(params.window_params.session_id),
+      sdk_version_(params.sdk_version),
       allow_media_access_(params.allow_media_access),
       log_prefix_(params.log_prefix),
       web_contents_(CreateWebContents(browser_context_, site_instance_)),
@@ -272,6 +275,17 @@
              : WebContentsDelegate::RunBluetoothChooser(frame, event_handler);
 }
 
+bool CastWebViewDefault::ShouldAllowRunningInsecureContent(
+    content::WebContents* /* web_contents */,
+    bool allowed_per_prefs,
+    const url::Origin& /* origin */,
+    const GURL& /* resource_url */) {
+  metrics::CastMetricsHelper::GetInstance()->RecordApplicationEvent(
+      activity_id_, session_id_, sdk_version_,
+      "Cast.Platform.AppRunningInsecureContent");
+  return allowed_per_prefs;
+}
+
 void CastWebViewDefault::DidStartNavigation(
     content::NavigationHandle* navigation_handle) {
   if (!resize_window_when_navigation_starts_) {
diff --git a/chromecast/browser/cast_web_view_default.h b/chromecast/browser/cast_web_view_default.h
index 1bb1b9e9..5aaa091 100644
--- a/chromecast/browser/cast_web_view_default.h
+++ b/chromecast/browser/cast_web_view_default.h
@@ -80,12 +80,19 @@
   std::unique_ptr<content::BluetoothChooser> RunBluetoothChooser(
       content::RenderFrameHost* frame,
       const content::BluetoothChooser::EventHandler& event_handler) override;
+  bool ShouldAllowRunningInsecureContent(content::WebContents* web_contents,
+                                         bool allowed_per_prefs,
+                                         const url::Origin& origin,
+                                         const GURL& resource_url) override;
 
   CastWebContentsManager* const web_contents_manager_;
   content::BrowserContext* const browser_context_;
   const scoped_refptr<content::SiteInstance> site_instance_;
 
   Delegate* const delegate_;
+  const std::string activity_id_;
+  const std::string session_id_;
+  const std::string sdk_version_;
   const bool allow_media_access_;
   const std::string log_prefix_;
 
diff --git a/chromeos/components/help_app_ui/help_app_ui.cc b/chromeos/components/help_app_ui/help_app_ui.cc
index 2bafcde..378e0929 100644
--- a/chromeos/components/help_app_ui/help_app_ui.cc
+++ b/chromeos/components/help_app_ui/help_app_ui.cc
@@ -19,6 +19,9 @@
   // TODO(crbug.com/1012578): This is a placeholder only, update with the
   // actual app content.
   source->SetDefaultResource(IDR_HELP_APP_INDEX_HTML);
+  source->AddResourcePath("pwa.html", IDR_HELP_APP_PWA_HTML);
+  source->AddResourcePath("manifest.json", IDR_HELP_APP_MANIFEST);
+  source->AddResourcePath("app_icon_192.png", IDR_HELP_APP_ICON_192);
   return source;
 }
 }  // namespace
diff --git a/chromeos/components/help_app_ui/resources/app_icon_192.png b/chromeos/components/help_app_ui/resources/app_icon_192.png
new file mode 100644
index 0000000..1419460f
--- /dev/null
+++ b/chromeos/components/help_app_ui/resources/app_icon_192.png
Binary files differ
diff --git a/chromeos/components/help_app_ui/resources/help_app_resources.grd b/chromeos/components/help_app_ui/resources/help_app_resources.grd
index bee07b6..697fdeb 100644
--- a/chromeos/components/help_app_ui/resources/help_app_resources.grd
+++ b/chromeos/components/help_app_ui/resources/help_app_resources.grd
@@ -16,6 +16,11 @@
       <!-- TODO(crbug.com/1012578): Add the run time resources .grdp here. -->
       <include name="IDR_HELP_APP_INDEX_HTML" file="index.html"
           type="BINDATA" />
+      <include name="IDR_HELP_APP_PWA_HTML" file="pwa.html" type="BINDATA" />
+      <include name="IDR_HELP_APP_MANIFEST" file="manifest.json"
+          type="BINDATA" />
+      <include name="IDR_HELP_APP_ICON_192" file="app_icon_192.png"
+          type="BINDATA" />
     </includes>
   </release>
 </grit>
diff --git a/chromeos/components/help_app_ui/resources/manifest.json b/chromeos/components/help_app_ui/resources/manifest.json
new file mode 100644
index 0000000..4995ff9
--- /dev/null
+++ b/chromeos/components/help_app_ui/resources/manifest.json
@@ -0,0 +1,15 @@
+{
+  "name": "Help App",
+  "short_name": "Help App",
+  "start_url": "/",
+  "display": "standalone",
+  "theme_color": "#4285F4",
+  "background_color": "#ffffff",
+  "icons": [
+    {
+      "src": "app_icon_192.png",
+      "sizes": "192x192",
+      "type": "image/png"
+    }
+  ]
+}
diff --git a/chromeos/components/help_app_ui/resources/pwa.html b/chromeos/components/help_app_ui/resources/pwa.html
new file mode 100644
index 0000000..8cb86f24
--- /dev/null
+++ b/chromeos/components/help_app_ui/resources/pwa.html
@@ -0,0 +1,6 @@
+<!-- Copyright 2019 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. -->
+<!-- TODO(crbug/896575): Delete when manifest URL installs are implemented. -->
+<!DOCTYPE html>
+<link rel="manifest" href="manifest.json">
diff --git a/chromeos/profiles/airmont.afdo.newest.txt b/chromeos/profiles/airmont.afdo.newest.txt
index 9e798d3..885dc947 100644
--- a/chromeos/profiles/airmont.afdo.newest.txt
+++ b/chromeos/profiles/airmont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-airmont-80-3945.13-1572864139-benchmark-80.0.3954.0-r1-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-airmont-80-3945.13-1572864139-benchmark-80.0.3960.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/chromeos/profiles/broadwell.afdo.newest.txt b/chromeos/profiles/broadwell.afdo.newest.txt
index 824d390..acade739 100644
--- a/chromeos/profiles/broadwell.afdo.newest.txt
+++ b/chromeos/profiles/broadwell.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-broadwell-80-3943.1-1572873357-benchmark-80.0.3954.0-r1-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-broadwell-80-3943.1-1572873357-benchmark-80.0.3960.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt
index 495ca81..939d530 100644
--- a/chromeos/profiles/orderfile.newest.txt
+++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@
-chromeos-chrome-orderfile-field-80-3940.0-1572255699-benchmark-80.0.3951.3-r1.orderfile.xz
\ No newline at end of file
+chromeos-chrome-orderfile-field-80-3943.1-1572866479-benchmark-80.0.3954.0-r1.orderfile.xz
\ No newline at end of file
diff --git a/chromeos/profiles/silvermont.afdo.newest.txt b/chromeos/profiles/silvermont.afdo.newest.txt
index 9cdc789..2b766db 100644
--- a/chromeos/profiles/silvermont.afdo.newest.txt
+++ b/chromeos/profiles/silvermont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-silvermont-80-3943.1-1572866479-benchmark-80.0.3954.0-r1-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-silvermont-80-3943.1-1572866479-benchmark-80.0.3960.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index 78e1066dc..1a0717d 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -1357,6 +1357,7 @@
   UpdateMediaState();
 }
 
+
 void AssistantManagerServiceImpl::OnPlaybackStateChange(
     const MediaStatus& status) {
   if (media_session_)
diff --git a/chromeos/services/assistant/media_session/assistant_media_session.cc b/chromeos/services/assistant/media_session/assistant_media_session.cc
index 84c0699d..31bbbc9 100644
--- a/chromeos/services/assistant/media_session/assistant_media_session.cc
+++ b/chromeos/services/assistant/media_session/assistant_media_session.cc
@@ -4,10 +4,7 @@
 
 #include "chromeos/services/assistant/media_session/assistant_media_session.h"
 
-#include <utility>
-
 #include "base/bind.h"
-#include "base/memory/scoped_refptr.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/services/assistant/assistant_manager_service_impl.h"
 #include "services/media_session/public/cpp/features.h"
@@ -28,10 +25,7 @@
 AssistantMediaSession::AssistantMediaSession(
     mojom::Client* client,
     AssistantManagerServiceImpl* assistant_manager)
-    : assistant_manager_service_(assistant_manager),
-      client_(client),
-      ducking_observers_(base::MakeRefCounted<
-                         base::ObserverListThreadSafe<DuckingObserver>>()) {}
+    : assistant_manager_service_(assistant_manager), client_(client) {}
 
 AssistantMediaSession::~AssistantMediaSession() {
   AbandonAudioFocusIfNeeded();
@@ -58,18 +52,20 @@
   std::move(callback).Run(std::move(info));
 }
 
+// TODO(b/135064564): Update StartDucking() and StopDucking() after volume
+// control API for media streams is implemented.
 void AssistantMediaSession::StartDucking() {
   if (is_ducking_)
     return;
   is_ducking_ = true;
-  NotifyDucking(FROM_HERE);
+  Suspend(SuspendType::kSystem);
 }
 
 void AssistantMediaSession::StopDucking() {
   if (!is_ducking_)
     return;
   is_ducking_ = false;
-  NotifyDucking(FROM_HERE);
+  Resume(SuspendType::kSystem);
 }
 
 void AssistantMediaSession::Suspend(SuspendType suspend_type) {
@@ -137,40 +133,6 @@
   internal_audio_focus_id_ = base::UnguessableToken::Null();
 }
 
-void AssistantMediaSession::NotifyMediaSessionMetadataChanged(
-    const assistant_client::MediaStatus& status) {
-  media_session::MediaMetadata metadata;
-
-  metadata.title = base::UTF8ToUTF16(status.metadata.title);
-  metadata.artist = base::UTF8ToUTF16(status.metadata.artist);
-  metadata.album = base::UTF8ToUTF16(status.metadata.album);
-
-  bool metadata_changed = metadata_ != metadata;
-  if (!metadata_changed)
-    return;
-
-  metadata_ = metadata;
-
-  current_track_ = status.track_type;
-
-  for (auto& observer : observers_)
-    observer->MediaSessionMetadataChanged(this->metadata_);
-}
-
-void AssistantMediaSession::AddDuckingObserver(DuckingObserver* observer) {
-  ducking_observers_->AddObserver(observer);
-  if (is_ducking_)
-    observer->SetDucking(is_ducking_);
-}
-
-void AssistantMediaSession::RemoveDuckingObserver(DuckingObserver* observer) {
-  ducking_observers_->RemoveObserver(observer);
-}
-
-base::WeakPtr<AssistantMediaSession> AssistantMediaSession::GetWeakPtr() {
-  return weak_factory_.GetWeakPtr();
-}
-
 void AssistantMediaSession::EnsureServiceConnection() {
   DCHECK(base::FeatureList::IsEnabled(
       media_session::features::kMediaSessionService));
@@ -212,6 +174,26 @@
   NotifyMediaSessionInfoChanged();
 }
 
+void AssistantMediaSession::NotifyMediaSessionMetadataChanged(
+    const assistant_client::MediaStatus& status) {
+  media_session::MediaMetadata metadata;
+
+  metadata.title = base::UTF8ToUTF16(status.metadata.title);
+  metadata.artist = base::UTF8ToUTF16(status.metadata.artist);
+  metadata.album = base::UTF8ToUTF16(status.metadata.album);
+
+  bool metadata_changed = metadata_ != metadata;
+  if (!metadata_changed)
+    return;
+
+  metadata_ = metadata;
+
+  current_track_ = status.track_type;
+
+  for (auto& observer : observers_)
+    observer->MediaSessionMetadataChanged(this->metadata_);
+}
+
 media_session::mojom::MediaSessionInfoPtr
 AssistantMediaSession::GetMediaSessionInfoInternal() {
   media_session::mojom::MediaSessionInfoPtr info(
@@ -258,10 +240,8 @@
   return audio_focus_state_ == State::SUSPENDED;
 }
 
-void AssistantMediaSession::NotifyDucking(const base::Location& location) {
-  ducking_observers_->Notify(
-      location, &AssistantMediaSession::DuckingObserver::SetDucking,
-      is_ducking_);
+base::WeakPtr<AssistantMediaSession> AssistantMediaSession::GetWeakPtr() {
+  return weak_factory_.GetWeakPtr();
 }
 
 }  // namespace assistant
diff --git a/chromeos/services/assistant/media_session/assistant_media_session.h b/chromeos/services/assistant/media_session/assistant_media_session.h
index defea5e6..9705692 100644
--- a/chromeos/services/assistant/media_session/assistant_media_session.h
+++ b/chromeos/services/assistant/media_session/assistant_media_session.h
@@ -6,8 +6,6 @@
 #define CHROMEOS_SERVICES_ASSISTANT_MEDIA_SESSION_ASSISTANT_MEDIA_SESSION_H_
 
 #include "base/macros.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/observer_list_threadsafe.h"
 #include "base/timer/timer.h"
 #include "base/unguessable_token.h"
 #include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
@@ -34,12 +32,6 @@
  public:
   enum class State { ACTIVE, SUSPENDED, INACTIVE };
 
-  class DuckingObserver {
-   public:
-    virtual ~DuckingObserver() = default;
-    virtual void SetDucking(bool is_ducking) = 0;
-  };
-
   explicit AssistantMediaSession(
       mojom::Client* client,
       AssistantManagerServiceImpl* assistant_manager);
@@ -57,6 +49,8 @@
       override;
   void PreviousTrack() override {}
   void NextTrack() override {}
+  void NotifyMediaSessionMetadataChanged(
+      const assistant_client::MediaStatus& status);
   void SkipAd() override {}
   void Seek(base::TimeDelta seek_time) override {}
   void Stop(SuspendType suspend_type) override {}
@@ -71,12 +65,6 @@
   void RequestAudioFocus(media_session::mojom::AudioFocusType audio_focus_type);
   void AbandonAudioFocusIfNeeded();
 
-  void NotifyMediaSessionMetadataChanged(
-      const assistant_client::MediaStatus& status);
-
-  void AddDuckingObserver(DuckingObserver* observer);
-  void RemoveDuckingObserver(DuckingObserver* observer);
-
   base::WeakPtr<AssistantMediaSession> GetWeakPtr();
 
   // Returns internal audio focus id.
@@ -110,8 +98,6 @@
   // Returns if the session is currently suspended.
   bool IsSuspended() const;
 
-  void NotifyDucking(const base::Location& from_here);
-
   // The current metadata associated with the current media session.
   media_session::MediaMetadata metadata_;
 
@@ -133,9 +119,6 @@
   // StopDucking().
   bool is_ducking_ = false;
 
-  scoped_refptr<base::ObserverListThreadSafe<DuckingObserver>>
-      ducking_observers_;
-
   // If the media session has acquired audio focus then this will contain a
   // pointer to that requests AudioFocusRequestClient.
   mojo::Remote<media_session::mojom::AudioFocusRequestClient>
diff --git a/chromeos/services/assistant/platform/audio_device_owner.cc b/chromeos/services/assistant/platform/audio_device_owner.cc
index 46d77141a..3943b8f 100644
--- a/chromeos/services/assistant/platform/audio_device_owner.cc
+++ b/chromeos/services/assistant/platform/audio_device_owner.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include <utility>
 
-#include "chromeos/services/assistant/media_session/assistant_media_session.h"
 #include "media/audio/audio_device_description.h"
 #include "media/base/limits.h"
 #include "services/media_session/public/mojom/media_session.mojom.h"
@@ -71,17 +70,13 @@
 AudioDeviceOwner::AudioDeviceOwner(
     scoped_refptr<base::SequencedTaskRunner> task_runner,
     scoped_refptr<base::SequencedTaskRunner> background_task_runner,
-    const std::string& device_id,
-    AssistantMediaSession* media_session)
+    const std::string& device_id)
     : main_task_runner_(task_runner),
       background_task_runner_(background_task_runner),
-      device_id_(device_id),
-      media_session_(media_session) {}
+      device_id_(device_id) {}
 
 AudioDeviceOwner::~AudioDeviceOwner() {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
-  if (output_device_)
-    media_session_->RemoveDuckingObserver(this);
 }
 
 void AudioDeviceOwner::StartOnMainThread(
@@ -126,34 +121,20 @@
 
 void AudioDeviceOwner::StopOnBackgroundThread() {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
-  media_session_->RemoveDuckingObserver(this);
+  base::AutoLock lock(lock_);
   output_device_.reset();
-  {
-    base::AutoLock lock(lock_);
-    if (delegate_) {
-      delegate_->OnStopped();
-      delegate_ = nullptr;
-    }
+  if (delegate_) {
+    delegate_->OnStopped();
+    delegate_ = nullptr;
   }
 }
 
-void AudioDeviceOwner::SetDucking(bool is_ducking) {
-  // |output_device_| is only accessed on background thread.
-  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
-
-  constexpr double kDuckingVolume = 0.2;
-  if (output_device_)
-    output_device_->SetVolume(is_ducking ? kDuckingVolume : 1.0);
-}
-
 void AudioDeviceOwner::StartDeviceOnBackgroundThread(
     mojo::PendingRemote<audio::mojom::StreamFactory> stream_factory) {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   output_device_ = std::make_unique<audio::OutputDevice>(
       std::move(stream_factory), audio_param_, this, device_id_);
   output_device_->Play();
-
-  media_session_->AddDuckingObserver(this);
 }
 
 int AudioDeviceOwner::Render(base::TimeDelta delay,
diff --git a/chromeos/services/assistant/platform/audio_device_owner.h b/chromeos/services/assistant/platform/audio_device_owner.h
index 4ad2ae8..5d04752d 100644
--- a/chromeos/services/assistant/platform/audio_device_owner.h
+++ b/chromeos/services/assistant/platform/audio_device_owner.h
@@ -11,7 +11,6 @@
 
 #include "base/component_export.h"
 #include "base/macros.h"
-#include "chromeos/services/assistant/media_session/assistant_media_session.h"
 #include "libassistant/shared/public/platform_audio_output.h"
 #include "media/base/audio_block_fifo.h"
 #include "media/base/audio_parameters.h"
@@ -24,14 +23,12 @@
 namespace assistant {
 
 class COMPONENT_EXPORT(ASSISTANT_SERVICE) AudioDeviceOwner
-    : public media::AudioRendererSink::RenderCallback,
-      AssistantMediaSession::DuckingObserver {
+    : public media::AudioRendererSink::RenderCallback {
  public:
   AudioDeviceOwner(
       scoped_refptr<base::SequencedTaskRunner> task_runner,
       scoped_refptr<base::SequencedTaskRunner> background_task_runner,
-      const std::string& device_id,
-      AssistantMediaSession* media_session);
+      const std::string& device_id);
   ~AudioDeviceOwner() override;
 
   void StartOnMainThread(
@@ -41,9 +38,6 @@
 
   void StopOnBackgroundThread();
 
-  // AssistantMediaSession::DuckingObserver overrides:
-  void SetDucking(bool is_ducking) override;
-
   // media::AudioRenderSink::RenderCallback overrides:
   int Render(base::TimeDelta delay,
              base::TimeTicks delay_timestamp,
@@ -84,8 +78,6 @@
   assistant_client::OutputStreamFormat format_;
   media::AudioParameters audio_param_;
 
-  AssistantMediaSession* media_session_;
-
   DISALLOW_COPY_AND_ASSIGN(AudioDeviceOwner);
 };
 
diff --git a/chromeos/services/assistant/platform/audio_output_provider_impl.cc b/chromeos/services/assistant/platform/audio_output_provider_impl.cc
index 066e74b..4b23aba8 100644
--- a/chromeos/services/assistant/platform/audio_output_provider_impl.cc
+++ b/chromeos/services/assistant/platform/audio_output_provider_impl.cc
@@ -48,8 +48,7 @@
             std::make_unique<AudioStreamHandler>(task_runner)),
         device_owner_(std::make_unique<AudioDeviceOwner>(task_runner,
                                                          background_task_runner,
-                                                         device_id,
-                                                         media_session)) {}
+                                                         device_id)) {}
 
   ~AudioOutputImpl() override {
     // This ensures that it will be executed after StartOnMainThread.
diff --git a/components/arc/session/arc_vm_client_adapter.cc b/components/arc/session/arc_vm_client_adapter.cc
index 3873804f..f4751aa1 100644
--- a/components/arc/session/arc_vm_client_adapter.cc
+++ b/components/arc/session/arc_vm_client_adapter.cc
@@ -393,10 +393,9 @@
 
   void UpgradeArc(UpgradeParams params,
                   chromeos::VoidDBusMethodCallback callback) override {
-    VLOG(1) << "Starting arcvm-server-proxy";
-    chromeos::UpstartClient::Get()->StartJob(
-        kArcVmServerProxyJobName, /*environment=*/{},
-        base::BindOnce(&ArcVmClientAdapter::OnArcVmServerProxyJobStarted,
+    VLOG(1) << "Starting Concierge service";
+    chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->StartConcierge(
+        base::BindOnce(&ArcVmClientAdapter::OnConciergeStarted,
                        weak_factory_.GetWeakPtr(), std::move(params),
                        std::move(callback)));
   }
@@ -464,22 +463,6 @@
     std::move(callback).Run(true);
   }
 
-  void OnArcVmServerProxyJobStarted(UpgradeParams params,
-                                    chromeos::VoidDBusMethodCallback callback,
-                                    bool result) {
-    if (!result) {
-      LOG(ERROR) << "Failed to start arcvm-server-proxy job";
-      std::move(callback).Run(false);
-      return;
-    }
-
-    VLOG(1) << "Starting Concierge service";
-    chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->StartConcierge(
-        base::BindOnce(&ArcVmClientAdapter::OnConciergeStarted,
-                       weak_factory_.GetWeakPtr(), std::move(params),
-                       std::move(callback)));
-  }
-
   void OnConciergeStarted(UpgradeParams params,
                           chromeos::VoidDBusMethodCallback callback,
                           bool success) {
@@ -488,8 +471,22 @@
       std::move(callback).Run(false);
       return;
     }
-    VLOG(1) << "Concierge service started for arcvm.";
+    VLOG(1) << "Starting arcvm-server-proxy";
+    chromeos::UpstartClient::Get()->StartJob(
+        kArcVmServerProxyJobName, /*environment=*/{},
+        base::BindOnce(&ArcVmClientAdapter::OnArcVmServerProxyJobStarted,
+                       weak_factory_.GetWeakPtr(), std::move(params),
+                       std::move(callback)));
+  }
 
+  void OnArcVmServerProxyJobStarted(UpgradeParams params,
+                                    chromeos::VoidDBusMethodCallback callback,
+                                    bool result) {
+    if (!result) {
+      LOG(ERROR) << "Failed to start arcvm-server-proxy job";
+      std::move(callback).Run(false);
+      return;
+    }
     // TODO(pliard): Export host-side /data to the VM, and remove the call. Note
     // that ArcSessionImpl checks low disk conditions before calling UpgradeArc.
     base::PostTaskAndReplyWithResult(
diff --git a/components/arc/session/arc_vm_client_adapter_unittest.cc b/components/arc/session/arc_vm_client_adapter_unittest.cc
index 8941620..cfdde6b 100644
--- a/components/arc/session/arc_vm_client_adapter_unittest.cc
+++ b/components/arc/session/arc_vm_client_adapter_unittest.cc
@@ -346,7 +346,8 @@
   upstart_client->set_start_job_result(false);
 
   UpgradeArc(false);
-  EXPECT_FALSE(GetStartConciergeCalled());
+  EXPECT_TRUE(GetStartConciergeCalled());
+  EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called());
   EXPECT_FALSE(arc_instance_stopped_called());
   upstart_client->set_start_job_result(true);
 
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
index 2d8b2737..dc32c5a3 100644
--- a/components/autofill/content/renderer/password_autofill_agent.cc
+++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -1558,6 +1558,7 @@
                                         possible_email_domain) ||
          fill_data.username_may_use_prefilled_placeholder);
     if (!username_element.Value().IsEmpty() &&
+        username_element.GetAutofillState() == WebAutofillState::kNotFilled &&
         !prefilled_placeholder_username) {
       // Username is filled with content that was not on a list of known
       // placeholder texts (e.g. "username or email") nor there is server-side
@@ -1605,8 +1606,10 @@
 
   // Input matches the username, fill in required values.
   if (!username_element.IsNull() && IsElementEditable(username_element)) {
-    if (!username.empty() && (username_element.Value().IsEmpty() ||
-                              prefilled_placeholder_username)) {
+    if (!username.empty() &&
+        (username_element.Value().IsEmpty() ||
+         username_element.GetAutofillState() != WebAutofillState::kNotFilled ||
+         prefilled_placeholder_username)) {
       AutofillField(username, username_element);
       if (prefilled_placeholder_username) {
         LogPrefilledUsernameFillOutcome(
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index b0dc0e2..c787e88 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -280,7 +280,7 @@
   AccountInfo SetActiveSecondaryAccount() {
     AccountInfo account_info;
     account_info.email = kSyncTransportAccountEmail;
-    account_info.account_id = "account_id";
+    account_info.account_id = CoreAccountId("account_id");
     sync_service_.SetAuthenticatedAccountInfo(account_info);
     sync_service_.SetIsAuthenticatedAccountPrimary(false);
     return account_info;
@@ -7451,8 +7451,8 @@
 
 TEST_F(PersonalDataManagerTest, OnAccountsCookieDeletedByUserAction) {
   // Set up some sync transport opt-ins in the prefs.
-  ::autofill::prefs::SetUserOptedInWalletSyncTransport(prefs_.get(), "account1",
-                                                       true);
+  ::autofill::prefs::SetUserOptedInWalletSyncTransport(
+      prefs_.get(), CoreAccountId("account1"), true);
   EXPECT_FALSE(
       prefs_->GetDictionary(prefs::kAutofillSyncTransportOptIn)->DictEmpty());
 
@@ -7478,7 +7478,7 @@
   // Set an an active secondary account.
   AccountInfo active_info;
   active_info.email = kPrimaryAccountEmail;
-  active_info.account_id = "account_id";
+  active_info.account_id = CoreAccountId("account_id");
   sync_service_.SetAuthenticatedAccountInfo(active_info);
   sync_service_.SetIsAuthenticatedAccountPrimary(false);
 
diff --git a/components/consent_auditor/consent_auditor_impl_unittest.cc b/components/consent_auditor/consent_auditor_impl_unittest.cc
index d8cf416..e64d44d 100644
--- a/components/consent_auditor/consent_auditor_impl_unittest.cc
+++ b/components/consent_auditor/consent_auditor_impl_unittest.cc
@@ -38,9 +38,6 @@
 const char kCurrentAppVersion[] = "1.2.3.4";
 const char kCurrentAppLocale[] = "en-US";
 
-// Fake account ID for testing.
-const char kAccountId[] = "testing_account_id";
-
 // A helper function to load the |description|, |confirmation|, |version|,
 // and |locale|, in that order, from a record for the |feature| in
 // the |consents| dictionary.
@@ -110,6 +107,11 @@
 
 class ConsentAuditorImplTest : public testing::Test {
  public:
+  // Fake account ID for testing.
+  const CoreAccountId kAccountId;
+
+  ConsentAuditorImplTest() : kAccountId("testing_account_id") {}
+
   void SetUp() override {
     pref_service_ = std::make_unique<TestingPrefServiceSimple>();
     // Use normal clock by default.
@@ -258,7 +260,7 @@
 
   EXPECT_EQ(now.since_origin().InMicroseconds(),
             consent.client_consent_time_usec());
-  EXPECT_EQ(kAccountId, consent.account_id());
+  EXPECT_EQ(kAccountId.id, consent.account_id());
   EXPECT_EQ(kCurrentAppLocale, consent.locale());
 
   EXPECT_TRUE(consent.has_sync_consent());
@@ -305,7 +307,7 @@
   ASSERT_EQ(1U, consents.size());
   UserConsentSpecifics consent = consents[0];
 
-  EXPECT_EQ(kAccountId, consent.account_id());
+  EXPECT_EQ(kAccountId.id, consent.account_id());
   EXPECT_EQ(kCurrentAppLocale, consent.locale());
 
   EXPECT_TRUE(consent.has_arc_play_terms_of_service_consent());
@@ -361,7 +363,7 @@
   ASSERT_EQ(1U, consents.size());
   UserConsentSpecifics consent = consents[0];
 
-  EXPECT_EQ(kAccountId, consent.account_id());
+  EXPECT_EQ(kAccountId.id, consent.account_id());
   EXPECT_EQ(kCurrentAppLocale, consent.locale());
 
   EXPECT_TRUE(consent.has_arc_play_terms_of_service_consent());
@@ -421,7 +423,7 @@
   ASSERT_EQ(1U, consents.size());
   UserConsentSpecifics consent = consents[0];
 
-  EXPECT_EQ(kAccountId, consent.account_id());
+  EXPECT_EQ(kAccountId.id, consent.account_id());
   EXPECT_EQ(kCurrentAppLocale, consent.locale());
 
   EXPECT_EQ(true, consent.has_assistant_activity_control_consent());
diff --git a/components/feedback/anonymizer_tool.cc b/components/feedback/anonymizer_tool.cc
index ed0974bb..b8401d8 100644
--- a/components/feedback/anonymizer_tool.cc
+++ b/components/feedback/anonymizer_tool.cc
@@ -210,17 +210,18 @@
 
 #define H16 NCG(HEXDIG) "{1,4}"
 #define LS32 NCG(H16 ":" H16 "|" IPV4ADDRESS)
+#define WB "\\b"
 
 #define IPV6ADDRESS NCG( \
-                                          NCG(H16 ":") "{6}" LS32 "|" \
-                                     "::" NCG(H16 ":") "{5}" LS32 "|" \
-  OPT_NCG(                      H16) "::" NCG(H16 ":") "{4}" LS32 "|" \
-  OPT_NCG( NCG(H16 ":") "{0,1}" H16) "::" NCG(H16 ":") "{3}" LS32 "|" \
-  OPT_NCG( NCG(H16 ":") "{0,2}" H16) "::" NCG(H16 ":") "{2}" LS32 "|" \
-  OPT_NCG( NCG(H16 ":") "{0,3}" H16) "::" NCG(H16 ":")       LS32 "|" \
-  OPT_NCG( NCG(H16 ":") "{0,4}" H16) "::"                    LS32 "|" \
-  OPT_NCG( NCG(H16 ":") "{0,5}" H16) "::"                    H16 "|" \
-  OPT_NCG( NCG(H16 ":") "{0,6}" H16) "::")
+                                          WB NCG(H16 ":") "{6}" LS32 WB "|" \
+                                        "::" NCG(H16 ":") "{5}" LS32 WB "|" \
+  OPT_NCG( WB                      H16) "::" NCG(H16 ":") "{4}" LS32 WB "|" \
+  OPT_NCG( WB NCG(H16 ":") "{0,1}" H16) "::" NCG(H16 ":") "{3}" LS32 WB "|" \
+  OPT_NCG( WB NCG(H16 ":") "{0,2}" H16) "::" NCG(H16 ":") "{2}" LS32 WB "|" \
+  OPT_NCG( WB NCG(H16 ":") "{0,3}" H16) "::" NCG(H16 ":")       LS32 WB "|" \
+  OPT_NCG( WB NCG(H16 ":") "{0,4}" H16) "::"                    LS32 WB "|" \
+  OPT_NCG( WB NCG(H16 ":") "{0,5}" H16) "::"                    H16  WB "|" \
+  OPT_NCG( WB NCG(H16 ":") "{0,6}" H16) "::")
 
 #define IPVFUTURE                     \
   "v" HEXDIG                          \
@@ -593,14 +594,16 @@
   while (FindAndConsumeAndGetSkipped(&text, *re, &skipped, &pre_matched_id,
                                      &matched_id, &post_matched_id)) {
     std::string matched_id_as_string = matched_id.as_string();
-    std::string replacement_id = (*identifier_space)[matched_id_as_string];
-    if (replacement_id.empty()) {
+    std::string replacement_id;
+    if (identifier_space->count(matched_id_as_string) == 0) {
       // The weird NumberToString trick is because Windows does not like
       // to deal with %zu and a size_t in printf, nor does it support %llu.
       replacement_id = base::StringPrintf(
           "<%s: %s>", pattern.alias,
-          base::NumberToString(identifier_space->size()).c_str());
+          base::NumberToString(identifier_space->size() + 1).c_str());
       (*identifier_space)[matched_id_as_string] = replacement_id;
+    } else {
+      replacement_id = (*identifier_space)[matched_id_as_string];
     }
 
     skipped.AppendToString(&result);
@@ -680,8 +683,8 @@
       continue;
     }
     std::string matched_id_as_string = matched_id.as_string();
-    std::string replacement_id = (*identifier_space)[matched_id_as_string];
-    if (replacement_id.empty()) {
+    std::string replacement_id;
+    if (identifier_space->count(matched_id_as_string) == 0) {
       replacement_id = MaybeScrubIPAddress(matched_id_as_string);
       if (replacement_id != matched_id_as_string) {
         // The weird NumberToString trick is because Windows does not like
@@ -689,9 +692,11 @@
         replacement_id = base::StringPrintf(
             "<%s: %s>",
             replacement_id.empty() ? pattern.alias : replacement_id.c_str(),
-            base::NumberToString(identifier_space->size()).c_str());
+            base::NumberToString(identifier_space->size() + 1).c_str());
         (*identifier_space)[matched_id_as_string] = replacement_id;
       }
+    } else {
+      replacement_id = (*identifier_space)[matched_id_as_string];
     }
 
     skipped.AppendToString(&result);
diff --git a/components/feedback/anonymizer_tool_unittest.cc b/components/feedback/anonymizer_tool_unittest.cc
index 853338dd..39b47eb 100644
--- a/components/feedback/anonymizer_tool_unittest.cc
+++ b/components/feedback/anonymizer_tool_unittest.cc
@@ -220,6 +220,8 @@
             AnonymizeCustomPatterns("[2001:db8:0:0:0:ff00:42:8329]"));
   EXPECT_EQ("[<IPv6: 3>]", AnonymizeCustomPatterns("[2001:db8::ff00:42:8329]"));
   EXPECT_EQ("[<IPv6: 4>]", AnonymizeCustomPatterns("[aa::bb]"));
+  EXPECT_EQ("State::Abort", AnonymizeCustomPatterns("State::Abort"));
+
   EXPECT_EQ("<IPv4: 1>", AnonymizeCustomPatterns("192.160.0.1"));
 
   EXPECT_EQ("<URL: 1>",
@@ -359,7 +361,7 @@
     {"100.115.92.92",  // ChromeOS.
      "100.115.92.92"},
     {"100.115.91.92",  // IP address.
-     "<IPv4: 23>"},
+     "<IPv4: 21>"},
     {"1.1.1.1",  // DNS
      "1.1.1.1"},
     {"8.8.8.8",  // DNS
@@ -367,13 +369,13 @@
     {"8.8.4.4",  // DNS
      "8.8.4.4"},
     {"8.8.8.4",  // IP address.
-     "<IPv4: 27>"},
+     "<IPv4: 22>"},
     {"255.255.259.255",  // Not an IP address.
      "255.255.259.255"},
     {"255.300.255.255",  // Not an IP address.
      "255.300.255.255"},
     {"aaaa123.123.45.4aaa",  // IP address.
-     "aaaa<IPv4: 28>aaa"},
+     "aaaa<IPv4: 23>aaa"},
     {"11:11;11::11",  // IP address.
      "11:11;<IPv6: 5>"},
     {"11::11",  // IP address.
@@ -395,37 +397,37 @@
     {"ff01::2",  // All routers (interface local).
      "ff01::2"},
     {"ff01::3",  // Multicast (interface local).
-     "<ff01::/16: 13>"},
+     "<ff01::/16: 6>"},
     {"ff02::1",  // All nodes address (link local).
      "ff02::1"},
     {"ff02::2",  // All routers (link local).
      "ff02::2"},
     {"ff02::3",  // Multicast (link local).
-     "<ff02::/16: 16>"},
+     "<ff02::/16: 7>"},
     {"ff02::fb",  // mDNSv6 (link local).
-     "<ff02::/16: 17>"},
+     "<ff02::/16: 8>"},
     {"ff08::fb",  // mDNSv6.
-     "<IPv6: 18>"},
+     "<IPv6: 9>"},
     {"ff0f::101",  // All NTP servers.
-     "<IPv6: 19>"},
+     "<IPv6: 10>"},
     {"::ffff:cb0c:10ea",  // IPv4-mapped IPV6 (IP address).
-     "<IPv6: 20>"},
+     "<IPv6: 11>"},
     {"::ffff:a0a:a0a",  // IPv4-mapped IPV6 (private class A).
-     "<M 10.0.0.0/8: 21>"},
+     "<M 10.0.0.0/8: 12>"},
     {"::ffff:a0a:a0a",  // Intentional duplicate.
-     "<M 10.0.0.0/8: 21>"},
+     "<M 10.0.0.0/8: 12>"},
     {"::ffff:ac1e:1e1e",  // IPv4-mapped IPV6 (private class B).
-     "<M 172.16.0.0/12: 22>"},
+     "<M 172.16.0.0/12: 13>"},
     {"::ffff:c0a8:640a",  // IPv4-mapped IPV6 (private class C).
-     "<M 192.168.0.0/16: 23>"},
+     "<M 192.168.0.0/16: 14>"},
     {"::ffff:6473:5c01",  // IPv4-mapped IPV6 (Chrome).
-     "<M 100.115.92.1: 24>"},
+     "<M 100.115.92.1: 15>"},
     {"64:ff9b::a0a:a0a",  // IPv4-translated 6to4 IPV6 (private class A).
-     "<T 10.0.0.0/8: 25>"},
+     "<T 10.0.0.0/8: 16>"},
     {"64:ff9b::6473:5c01",  // IPv4-translated 6to4 IPV6 (Chrome).
-     "<T 100.115.92.1: 26>"},
+     "<T 100.115.92.1: 17>"},
     {"::0101:ffff:c0a8:640a",  // IP address.
-     "<IPv6: 27>"},
+     "<IPv6: 18>"},
     {"aa:aa:aa:aa:aa:aa",  // MAC address (BSSID).
      "[MAC OUI=aa:aa:aa IFACE=1]"},
     {"chrome://resources/foo",  // Secure chrome resource, whitelisted.
diff --git a/components/gcm_driver/account_tracker_unittest.cc b/components/gcm_driver/account_tracker_unittest.cc
index 0e20908..462d5970 100644
--- a/components/gcm_driver/account_tracker_unittest.cc
+++ b/components/gcm_driver/account_tracker_unittest.cc
@@ -25,24 +25,24 @@
 
 enum TrackingEventType { SIGN_IN, SIGN_OUT };
 
-std::string AccountKeyToObfuscatedId(const std::string& email) {
-  return "obfid-" + email;
+std::string AccountKeyToObfuscatedId(const CoreAccountId& account_id) {
+  return "obfid-" + account_id.id;
 }
 
 class TrackingEvent {
  public:
   TrackingEvent(TrackingEventType type,
-                const std::string& account_key,
+                const CoreAccountId& account_id,
                 const std::string& gaia_id)
-      : type_(type), account_key_(account_key), gaia_id_(gaia_id) {}
+      : type_(type), account_id_(account_id), gaia_id_(gaia_id) {}
 
-  TrackingEvent(TrackingEventType type, const std::string& account_key)
+  TrackingEvent(TrackingEventType type, const CoreAccountId& account_id)
       : type_(type),
-        account_key_(account_key),
-        gaia_id_(AccountKeyToObfuscatedId(account_key)) {}
+        account_id_(account_id),
+        gaia_id_(AccountKeyToObfuscatedId(account_id)) {}
 
   bool operator==(const TrackingEvent& event) const {
-    return type_ == event.type_ && account_key_ == event.account_key_ &&
+    return type_ == event.type_ && account_id_ == event.account_id_ &&
            gaia_id_ == event.gaia_id_;
   }
 
@@ -56,20 +56,20 @@
         typestr = "OUT";
         break;
     }
-    return base::StringPrintf("{ type: %s, email: %s, gaia: %s }", typestr,
-                              account_key_.c_str(), gaia_id_.c_str());
+    return base::StringPrintf("{ type: %s, account_id: %s, gaia: %s }", typestr,
+                              account_id_.id.c_str(), gaia_id_.c_str());
   }
 
  private:
   friend bool CompareByUser(TrackingEvent a, TrackingEvent b);
 
   TrackingEventType type_;
-  std::string account_key_;
+  CoreAccountId account_id_;
   std::string gaia_id_;
 };
 
 bool CompareByUser(TrackingEvent a, TrackingEvent b) {
-  return a.account_key_ < b.account_key_;
+  return a.account_id_ < b.account_id_;
 }
 
 std::string Str(const std::vector<TrackingEvent>& events) {
@@ -132,8 +132,8 @@
 
 void AccountTrackerObserver::OnAccountSignInChanged(const AccountIds& ids,
                                                     bool is_signed_in) {
-  events_.push_back(
-      TrackingEvent(is_signed_in ? SIGN_IN : SIGN_OUT, ids.email, ids.gaia));
+  events_.push_back(TrackingEvent(is_signed_in ? SIGN_IN : SIGN_OUT,
+                                  ids.account_key, ids.gaia));
 }
 
 void AccountTrackerObserver::Clear() {
@@ -265,7 +265,7 @@
   // the underlying GoogleSigninSucceeded callback is never sent). Tests that
   // exercise functionality dependent on that callback firing are not relevant
   // on ChromeOS and should simply not run on that platform.
-  std::string SetActiveAccount(const std::string& email) {
+  CoreAccountId SetActiveAccount(const std::string& email) {
     return identity_test_env_.SetPrimaryAccount(email).account_id;
   }
 
@@ -286,25 +286,25 @@
   }
 #endif
 
-  std::string AddAccountWithToken(const std::string& email) {
+  CoreAccountId AddAccountWithToken(const std::string& email) {
     return identity_test_env_.MakeAccountAvailable(email).account_id;
   }
 
-  void NotifyTokenAvailable(const std::string& account_id) {
+  void NotifyTokenAvailable(const CoreAccountId& account_id) {
     identity_test_env_.SetRefreshTokenForAccount(account_id);
   }
 
-  void NotifyTokenRevoked(const std::string& account_id) {
+  void NotifyTokenRevoked(const CoreAccountId& account_id) {
     identity_test_env_.RemoveRefreshTokenForAccount(account_id);
   }
 
   // Helpers to fake access token and user info fetching
-  void IssueAccessToken(const std::string& account_id) {
+  void IssueAccessToken(const CoreAccountId& account_id) {
     identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
-        account_id, "access_token-" + account_id, base::Time::Max());
+        account_id, "access_token-" + account_id.id, base::Time::Max());
   }
 
-  std::string GetValidTokenInfoResponse(const std::string& account_id) {
+  std::string GetValidTokenInfoResponse(const CoreAccountId& account_id) {
     return std::string("{ \"id\": \"") + AccountKeyToObfuscatedId(account_id) +
            "\" }";
   }
@@ -312,12 +312,12 @@
   void ReturnOAuthUrlFetchResults(net::HttpStatusCode response_code,
                                   const std::string& response_string);
 
-  void ReturnOAuthUrlFetchSuccess(const std::string& account_key);
-  void ReturnOAuthUrlFetchFailure(const std::string& account_key);
+  void ReturnOAuthUrlFetchSuccess(const CoreAccountId& account_id);
+  void ReturnOAuthUrlFetchFailure(const CoreAccountId& account_id);
 
-  std::string SetupPrimaryLogin() {
+  CoreAccountId SetupPrimaryLogin() {
     // Initial setup for tests that start with a signed in profile.
-    std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+    CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
     NotifyTokenAvailable(primary_account_id);
     ReturnOAuthUrlFetchSuccess(primary_account_id);
     observer()->Clear();
@@ -349,14 +349,14 @@
 }
 
 void AccountTrackerTest::ReturnOAuthUrlFetchSuccess(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   IssueAccessToken(account_id);
   ReturnOAuthUrlFetchResults(net::HTTP_OK,
                              GetValidTokenInfoResponse(account_id));
 }
 
 void AccountTrackerTest::ReturnOAuthUrlFetchFailure(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   IssueAccessToken(account_id);
   ReturnOAuthUrlFetchResults(net::HTTP_BAD_REQUEST, "");
 }
@@ -364,7 +364,7 @@
 // Primary tests just involve the Active account
 
 TEST_F(AccountTrackerTest, PrimaryNoEventsBeforeLogin) {
-  std::string account_id = AddAccountWithToken("me@dummy.com");
+  CoreAccountId account_id = AddAccountWithToken("me@dummy.com");
   NotifyTokenRevoked(account_id);
 
 // Logout is not possible on ChromeOS.
@@ -376,7 +376,7 @@
 }
 
 TEST_F(AccountTrackerTest, PrimaryLoginThenTokenAvailable) {
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   NotifyTokenAvailable(primary_account_id);
   EXPECT_TRUE(observer()->CheckEvents());
 
@@ -386,7 +386,7 @@
 }
 
 TEST_F(AccountTrackerTest, PrimaryRevoke) {
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   NotifyTokenAvailable(primary_account_id);
   ReturnOAuthUrlFetchSuccess(primary_account_id);
   observer()->Clear();
@@ -397,7 +397,7 @@
 }
 
 TEST_F(AccountTrackerTest, PrimaryRevokeThenTokenAvailable) {
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   NotifyTokenAvailable(primary_account_id);
   ReturnOAuthUrlFetchSuccess(primary_account_id);
   NotifyTokenRevoked(primary_account_id);
@@ -414,14 +414,14 @@
   AddAccountWithToken(kPrimaryAccountEmail);
   EXPECT_TRUE(observer()->CheckEvents());
 
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   ReturnOAuthUrlFetchSuccess(primary_account_id);
   EXPECT_TRUE(
       observer()->CheckEvents(TrackingEvent(SIGN_IN, primary_account_id)));
 }
 
 TEST_F(AccountTrackerTest, PrimaryTokenAvailableAndRevokedThenLogin) {
-  std::string primary_account_id = AddAccountWithToken(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = AddAccountWithToken(kPrimaryAccountEmail);
   EXPECT_TRUE(observer()->CheckEvents());
 
   NotifyTokenRevoked(primary_account_id);
@@ -432,7 +432,7 @@
 }
 
 TEST_F(AccountTrackerTest, PrimaryRevokeThenLogin) {
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   NotifyTokenAvailable(primary_account_id);
   ReturnOAuthUrlFetchSuccess(primary_account_id);
   NotifyLogoutOfAllAccounts();
@@ -443,7 +443,7 @@
 }
 
 TEST_F(AccountTrackerTest, PrimaryLogoutThenRevoke) {
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   NotifyTokenAvailable(primary_account_id);
   ReturnOAuthUrlFetchSuccess(primary_account_id);
   observer()->Clear();
@@ -457,7 +457,7 @@
 }
 
 TEST_F(AccountTrackerTest, PrimaryLogoutFetchCancelAvailable) {
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   NotifyTokenAvailable(primary_account_id);
   // TokenAvailable kicks off a fetch. Logout without satisfying it.
   NotifyLogoutOfAllAccounts();
@@ -476,7 +476,7 @@
 TEST_F(AccountTrackerTest, Available) {
   SetupPrimaryLogin();
 
-  std::string account_id = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id = AddAccountWithToken("user@example.com");
   EXPECT_TRUE(observer()->CheckEvents());
 
   ReturnOAuthUrlFetchSuccess(account_id);
@@ -486,7 +486,7 @@
 TEST_F(AccountTrackerTest, AvailableRevokeAvailable) {
   SetupPrimaryLogin();
 
-  std::string account_id = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id = AddAccountWithToken("user@example.com");
   ReturnOAuthUrlFetchSuccess(account_id);
   NotifyTokenRevoked(account_id);
   EXPECT_TRUE(observer()->CheckEvents(TrackingEvent(SIGN_IN, account_id),
@@ -499,7 +499,7 @@
 TEST_F(AccountTrackerTest, AvailableRevokeAvailableWithPendingFetch) {
   SetupPrimaryLogin();
 
-  std::string account_id = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id = AddAccountWithToken("user@example.com");
   NotifyTokenRevoked(account_id);
   EXPECT_TRUE(observer()->CheckEvents());
 
@@ -511,7 +511,7 @@
 TEST_F(AccountTrackerTest, AvailableRevokeRevoke) {
   SetupPrimaryLogin();
 
-  std::string account_id = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id = AddAccountWithToken("user@example.com");
   ReturnOAuthUrlFetchSuccess(account_id);
   NotifyTokenRevoked(account_id);
   EXPECT_TRUE(observer()->CheckEvents(TrackingEvent(SIGN_IN, account_id),
@@ -524,7 +524,7 @@
 TEST_F(AccountTrackerTest, AvailableAvailable) {
   SetupPrimaryLogin();
 
-  std::string account_id = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id = AddAccountWithToken("user@example.com");
   ReturnOAuthUrlFetchSuccess(account_id);
   EXPECT_TRUE(observer()->CheckEvents(TrackingEvent(SIGN_IN, account_id)));
 
@@ -535,12 +535,12 @@
 TEST_F(AccountTrackerTest, TwoAccounts) {
   SetupPrimaryLogin();
 
-  std::string alpha_account_id = AddAccountWithToken("alpha@example.com");
+  CoreAccountId alpha_account_id = AddAccountWithToken("alpha@example.com");
   ReturnOAuthUrlFetchSuccess(alpha_account_id);
   EXPECT_TRUE(
       observer()->CheckEvents(TrackingEvent(SIGN_IN, alpha_account_id)));
 
-  std::string beta_account_id = AddAccountWithToken("beta@example.com");
+  CoreAccountId beta_account_id = AddAccountWithToken("beta@example.com");
   ReturnOAuthUrlFetchSuccess(beta_account_id);
   EXPECT_TRUE(observer()->CheckEvents(TrackingEvent(SIGN_IN, beta_account_id)));
 
@@ -556,7 +556,7 @@
 TEST_F(AccountTrackerTest, AvailableTokenFetchFailAvailable) {
   SetupPrimaryLogin();
 
-  std::string account_id = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id = AddAccountWithToken("user@example.com");
   ReturnOAuthUrlFetchFailure(account_id);
   EXPECT_TRUE(observer()->CheckEvents());
 
@@ -568,11 +568,11 @@
 // These tests exercise true login/logout, which are not possible on ChromeOS.
 #if !defined(OS_CHROMEOS)
 TEST_F(AccountTrackerTest, MultiSignOutSignIn) {
-  std::string primary_account_id = SetupPrimaryLogin();
+  CoreAccountId primary_account_id = SetupPrimaryLogin();
 
-  std::string alpha_account_id = AddAccountWithToken("alpha@example.com");
+  CoreAccountId alpha_account_id = AddAccountWithToken("alpha@example.com");
   ReturnOAuthUrlFetchSuccess(alpha_account_id);
-  std::string beta_account_id = AddAccountWithToken("beta@example.com");
+  CoreAccountId beta_account_id = AddAccountWithToken("beta@example.com");
   ReturnOAuthUrlFetchSuccess(beta_account_id);
 
   observer()->SortEventsByUser();
@@ -590,7 +590,7 @@
 
   // No events fire at all while profile is signed out.
   NotifyTokenRevoked(alpha_account_id);
-  std::string gamma_account_id = AddAccountWithToken("gamma@example.com");
+  CoreAccountId gamma_account_id = AddAccountWithToken("gamma@example.com");
   EXPECT_TRUE(observer()->CheckEvents());
 
   // Signing the profile in again will resume tracking all accounts.
@@ -619,8 +619,8 @@
 // Primary/non-primary interactions
 
 TEST_F(AccountTrackerTest, MultiNoEventsBeforeLogin) {
-  std::string account_id1 = AddAccountWithToken("user@example.com");
-  std::string account_id2 = AddAccountWithToken("user2@example.com");
+  CoreAccountId account_id1 = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id2 = AddAccountWithToken("user2@example.com");
   NotifyTokenRevoked(account_id2);
   NotifyTokenRevoked(account_id1);
 
@@ -633,10 +633,10 @@
 }
 
 TEST_F(AccountTrackerTest, MultiRevokePrimaryDoesNotRemoveAllAccounts) {
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   NotifyTokenAvailable(primary_account_id);
   ReturnOAuthUrlFetchSuccess(primary_account_id);
-  std::string account_id = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id = AddAccountWithToken("user@example.com");
   ReturnOAuthUrlFetchSuccess(account_id);
   observer()->Clear();
 
@@ -647,7 +647,7 @@
 }
 
 TEST_F(AccountTrackerTest, GetAccountsPrimary) {
-  std::string primary_account_id = SetupPrimaryLogin();
+  CoreAccountId primary_account_id = SetupPrimaryLogin();
 
   std::vector<AccountIds> ids = account_tracker()->GetAccounts();
   EXPECT_EQ(1ul, ids.size());
@@ -661,10 +661,10 @@
 }
 
 TEST_F(AccountTrackerTest, GetAccountsOnlyReturnAccountsWithTokens) {
-  std::string primary_account_id = SetupPrimaryLogin();
+  CoreAccountId primary_account_id = SetupPrimaryLogin();
 
-  std::string alpha_account_id = AddAccountWithToken("alpha@example.com");
-  std::string beta_account_id = AddAccountWithToken("beta@example.com");
+  CoreAccountId alpha_account_id = AddAccountWithToken("alpha@example.com");
+  CoreAccountId beta_account_id = AddAccountWithToken("beta@example.com");
   ReturnOAuthUrlFetchSuccess(beta_account_id);
 
   std::vector<AccountIds> ids = account_tracker()->GetAccounts();
@@ -676,11 +676,11 @@
 }
 
 TEST_F(AccountTrackerTest, GetAccountsSortOrder) {
-  std::string primary_account_id = SetupPrimaryLogin();
+  CoreAccountId primary_account_id = SetupPrimaryLogin();
 
-  std::string zeta_account_id = AddAccountWithToken("zeta@example.com");
+  CoreAccountId zeta_account_id = AddAccountWithToken("zeta@example.com");
   ReturnOAuthUrlFetchSuccess(zeta_account_id);
-  std::string alpha_account_id = AddAccountWithToken("alpha@example.com");
+  CoreAccountId alpha_account_id = AddAccountWithToken("alpha@example.com");
   ReturnOAuthUrlFetchSuccess(alpha_account_id);
 
   // The primary account will be first in the vector. Remaining accounts
@@ -696,11 +696,11 @@
 }
 
 TEST_F(AccountTrackerTest, GetAccountsReturnNothingWhenPrimarySignedOut) {
-  std::string primary_account_id = SetupPrimaryLogin();
+  CoreAccountId primary_account_id = SetupPrimaryLogin();
 
-  std::string zeta_account_id = AddAccountWithToken("zeta@example.com");
+  CoreAccountId zeta_account_id = AddAccountWithToken("zeta@example.com");
   ReturnOAuthUrlFetchSuccess(zeta_account_id);
-  std::string alpha_account_id = AddAccountWithToken("alpha@example.com");
+  CoreAccountId alpha_account_id = AddAccountWithToken("alpha@example.com");
   ReturnOAuthUrlFetchSuccess(alpha_account_id);
 
   NotifyTokenRevoked(primary_account_id);
@@ -712,10 +712,10 @@
 // This test exercises true login/logout, which are not possible on ChromeOS.
 #if !defined(OS_CHROMEOS)
 TEST_F(AccountTrackerTest, MultiLogoutRemovesAllAccounts) {
-  std::string primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
+  CoreAccountId primary_account_id = SetActiveAccount(kPrimaryAccountEmail);
   NotifyTokenAvailable(primary_account_id);
   ReturnOAuthUrlFetchSuccess(primary_account_id);
-  std::string account_id = AddAccountWithToken("user@example.com");
+  CoreAccountId account_id = AddAccountWithToken("user@example.com");
   ReturnOAuthUrlFetchSuccess(account_id);
   observer()->Clear();
 
diff --git a/components/gcm_driver/gcm_account_mapper_unittest.cc b/components/gcm_driver/gcm_account_mapper_unittest.cc
index fa8f19cf..92952d56 100644
--- a/components/gcm_driver/gcm_account_mapper_unittest.cc
+++ b/components/gcm_driver/gcm_account_mapper_unittest.cc
@@ -28,14 +28,13 @@
 const char kTestCollapseKey[] = "test_collapse_key";
 const char kTestSenderId[] = "test_sender_id";
 
-
-AccountMapping MakeAccountMapping(const std::string& account_id,
+AccountMapping MakeAccountMapping(const CoreAccountId& account_id,
                                   AccountMapping::MappingStatus status,
                                   const base::Time& status_change_timestamp,
                                   const std::string& last_message_id) {
   AccountMapping account_mapping;
   account_mapping.account_id = account_id;
-  account_mapping.email = account_id + "@gmail.com";
+  account_mapping.email = account_id.id + "@gmail.com";
   // account_mapping.access_token intentionally left empty.
   account_mapping.status = status;
   account_mapping.status_change_timestamp = status_change_timestamp;
@@ -44,11 +43,11 @@
 }
 
 GCMClient::AccountTokenInfo MakeAccountTokenInfo(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   GCMClient::AccountTokenInfo account_token;
   account_token.account_id = account_id;
-  account_token.email = account_id + "@gmail.com";
-  account_token.access_token = account_id + "_token";
+  account_token.email = account_id.id + "@gmail.com";
+  account_token.access_token = account_id.id + "_token";
   return account_token;
 }
 
@@ -241,6 +240,12 @@
 
 class GCMAccountMapperTest : public testing::Test {
  public:
+  const CoreAccountId kAccountId;
+  const CoreAccountId kAccountId1;
+  const CoreAccountId kAccountId2;
+  const CoreAccountId kAccountId3;
+  const CoreAccountId kAccountId4;
+
   GCMAccountMapperTest();
   ~GCMAccountMapperTest() override;
 
@@ -273,7 +278,12 @@
   IncomingMessage last_received_message_;
 };
 
-GCMAccountMapperTest::GCMAccountMapperTest() {
+GCMAccountMapperTest::GCMAccountMapperTest()
+    : kAccountId("acc_id"),
+      kAccountId1("acc_id1"),
+      kAccountId2("acc_id2"),
+      kAccountId3("acc_id3"),
+      kAccountId4("acc_id4") {
   Restart();
 }
 
@@ -322,7 +332,7 @@
   gcm_driver().Clear();
 
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  account_tokens.push_back(MakeAccountTokenInfo("acc_id2"));
+  account_tokens.push_back(MakeAccountTokenInfo(kAccountId2));
   mapper()->SetAccountTokens(account_tokens);
   EXPECT_TRUE(gcm_driver().registration_id_requested());
   gcm_driver().Clear();
@@ -335,14 +345,10 @@
 // Tests the initialization of account mappings (from the store).
 TEST_F(GCMAccountMapperTest, InitializeAccountMappings) {
   GCMAccountMapper::AccountMappings account_mappings;
-  AccountMapping account_mapping1 = MakeAccountMapping("acc_id1",
-                                                       AccountMapping::MAPPED,
-                                                       base::Time::Now(),
-                                                       std::string());
-  AccountMapping account_mapping2 = MakeAccountMapping("acc_id2",
-                                                       AccountMapping::ADDING,
-                                                       base::Time::Now(),
-                                                       "add_message_1");
+  AccountMapping account_mapping1 = MakeAccountMapping(
+      kAccountId1, AccountMapping::MAPPED, base::Time::Now(), std::string());
+  AccountMapping account_mapping2 = MakeAccountMapping(
+      kAccountId2, AccountMapping::ADDING, base::Time::Now(), "add_message_1");
   account_mappings.push_back(account_mapping1);
   account_mappings.push_back(account_mapping2);
 
@@ -377,14 +383,14 @@
   Initialize(GCMAccountMapper::AccountMappings());
 
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  account_tokens.push_back(MakeAccountTokenInfo("acc_id"));
+  account_tokens.push_back(MakeAccountTokenInfo(kAccountId));
   mapper()->SetAccountTokens(account_tokens);
 
   EXPECT_TRUE(GetAccounts().empty());
 
   account_tokens.clear();
-  account_tokens.push_back(MakeAccountTokenInfo("acc_id1"));
-  account_tokens.push_back(MakeAccountTokenInfo("acc_id2"));
+  account_tokens.push_back(MakeAccountTokenInfo(kAccountId1));
+  account_tokens.push_back(MakeAccountTokenInfo(kAccountId2));
   mapper()->SetAccountTokens(account_tokens);
 
   EXPECT_TRUE(GetAccounts().empty());
@@ -393,8 +399,8 @@
 
   GCMAccountMapper::AccountMappings mappings = GetAccounts();
   EXPECT_EQ(2UL, mappings.size());
-  EXPECT_EQ("acc_id1", mappings[0].account_id);
-  EXPECT_EQ("acc_id2", mappings[1].account_id);
+  EXPECT_EQ(kAccountId1, mappings[0].account_id);
+  EXPECT_EQ(kAccountId2, mappings[1].account_id);
 }
 
 // Tests the part where a new account is added with a token, to the point when
@@ -404,14 +410,14 @@
   gcm_driver().CompleteRegister(kRegistrationId, GCMClient::SUCCESS);
 
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
+  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo(kAccountId);
   account_tokens.push_back(account_token);
   mapper()->SetAccountTokens(account_tokens);
 
   GCMAccountMapper::AccountMappings mappings = GetAccounts();
   EXPECT_EQ(1UL, mappings.size());
   GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
-  EXPECT_EQ("acc_id", iter->account_id);
+  EXPECT_EQ(kAccountId, iter->account_id);
   EXPECT_EQ("acc_id@gmail.com", iter->email);
   EXPECT_EQ("acc_id_token", iter->access_token);
   EXPECT_EQ(AccountMapping::NEW, iter->status);
@@ -426,7 +432,7 @@
   gcm_driver().CompleteRegister(kRegistrationId, GCMClient::SUCCESS);
 
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
+  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo(kAccountId);
   account_tokens.push_back(account_token);
   mapper()->SetAccountTokens(account_tokens);
 
@@ -461,7 +467,7 @@
   gcm_driver().CompleteRegister(kRegistrationId, GCMClient::SUCCESS);
 
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
+  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo(kAccountId);
   account_tokens.push_back(account_token);
   mapper()->SetAccountTokens(account_tokens);
 
@@ -498,7 +504,7 @@
   gcm_driver().CompleteRegister(kRegistrationId, GCMClient::SUCCESS);
 
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
+  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo(kAccountId);
   account_tokens.push_back(account_token);
   mapper()->SetAccountTokens(account_tokens);
 
@@ -541,7 +547,7 @@
   gcm_driver().CompleteRegister(kRegistrationId, GCMClient::SUCCESS);
 
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
+  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo(kAccountId);
   account_tokens.push_back(account_token);
   mapper()->SetAccountTokens(account_tokens);
 
@@ -563,10 +569,9 @@
 TEST_F(GCMAccountMapperTest, AddMappingMessageSendErrorForMappedAccount) {
   // Start with one account that is mapped.
   base::Time status_change_timestamp = base::Time::Now();
-  AccountMapping mapping = MakeAccountMapping("acc_id",
-                                              AccountMapping::MAPPED,
-                                              status_change_timestamp,
-                                              "add_message_id");
+  AccountMapping mapping =
+      MakeAccountMapping(kAccountId, AccountMapping::MAPPED,
+                         status_change_timestamp, "add_message_id");
 
   GCMAccountMapper::AccountMappings stored_mappings;
   stored_mappings.push_back(mapping);
@@ -595,10 +600,8 @@
 // account. This test goes only until the message is passed to GCM.
 TEST_F(GCMAccountMapperTest, RemoveMappingToMessageSent) {
   // Start with one account that is mapped.
-  AccountMapping mapping = MakeAccountMapping("acc_id",
-                                              AccountMapping::MAPPED,
-                                              base::Time::Now(),
-                                              std::string());
+  AccountMapping mapping = MakeAccountMapping(
+      kAccountId, AccountMapping::MAPPED, base::Time::Now(), std::string());
 
   GCMAccountMapper::AccountMappings stored_mappings;
   stored_mappings.push_back(mapping);
@@ -630,10 +633,8 @@
 // account. This test goes until the message is queued by GCM.
 TEST_F(GCMAccountMapperTest, RemoveMappingMessageQueued) {
   // Start with one account that is mapped.
-  AccountMapping mapping = MakeAccountMapping("acc_id",
-                                              AccountMapping::MAPPED,
-                                              base::Time::Now(),
-                                              std::string());
+  AccountMapping mapping = MakeAccountMapping(
+      kAccountId, AccountMapping::MAPPED, base::Time::Now(), std::string());
 
   GCMAccountMapper::AccountMappings stored_mappings;
   stored_mappings.push_back(mapping);
@@ -671,10 +672,8 @@
 // account mapping being completely gone.
 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAcknowledged) {
   // Start with one account that is mapped.
-  AccountMapping mapping = MakeAccountMapping("acc_id",
-                                              AccountMapping::MAPPED,
-                                              base::Time::Now(),
-                                              std::string());
+  AccountMapping mapping = MakeAccountMapping(
+      kAccountId, AccountMapping::MAPPED, base::Time::Now(), std::string());
 
   GCMAccountMapper::AccountMappings stored_mappings;
   stored_mappings.push_back(mapping);
@@ -697,10 +696,9 @@
 // Chrome was restarted.
 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAckedAfterRestart) {
   // Start with one account that is mapped.
-  AccountMapping mapping = MakeAccountMapping("acc_id",
-                                              AccountMapping::REMOVING,
-                                              base::Time::Now(),
-                                              "remove_message_id");
+  AccountMapping mapping =
+      MakeAccountMapping(kAccountId, AccountMapping::REMOVING,
+                         base::Time::Now(), "remove_message_id");
 
   GCMAccountMapper::AccountMappings stored_mappings;
   stored_mappings.push_back(mapping);
@@ -720,10 +718,9 @@
 TEST_F(GCMAccountMapperTest, RemoveMappingMessageSendError) {
   // Start with one account that is mapped.
   base::Time status_change_timestamp = base::Time::Now();
-  AccountMapping mapping = MakeAccountMapping("acc_id",
-                                              AccountMapping::REMOVING,
-                                              status_change_timestamp,
-                                              "remove_message_id");
+  AccountMapping mapping =
+      MakeAccountMapping(kAccountId, AccountMapping::REMOVING,
+                         status_change_timestamp, "remove_message_id");
 
   GCMAccountMapper::AccountMappings stored_mappings;
   stored_mappings.push_back(mapping);
@@ -763,7 +760,7 @@
 
   clock()->SetNow(base::Time::Now());
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
+  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo(kAccountId);
   account_tokens.push_back(account_token);
   mapper()->SetAccountTokens(account_tokens);
   DCHECK_EQ(CustomFakeGCMDriver::SEND_STARTED, gcm_driver().last_action());
@@ -784,7 +781,7 @@
 TEST_F(GCMAccountMapperTest, TokenIsRefreshedWhenRemoving) {
   // Start with one account that is mapped.
   AccountMapping mapping = MakeAccountMapping(
-      "acc_id", AccountMapping::MAPPED, base::Time::Now(), std::string());
+      kAccountId, AccountMapping::MAPPED, base::Time::Now(), std::string());
 
   GCMAccountMapper::AccountMappings stored_mappings;
   stored_mappings.push_back(mapping);
@@ -805,7 +802,7 @@
   // Adding the token for that account.
   clock()->SetNow(base::Time::Now());
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
+  GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo(kAccountId);
   account_tokens.push_back(account_token);
   mapper()->SetAccountTokens(account_tokens);
   DCHECK_EQ(CustomFakeGCMDriver::SEND_STARTED, gcm_driver().last_action());
@@ -836,11 +833,11 @@
   base::Time half_hour_ago = clock()->Now() - base::TimeDelta::FromMinutes(30);
   GCMAccountMapper::AccountMappings stored_mappings;
   stored_mappings.push_back(MakeAccountMapping(
-      "acc_id_0", AccountMapping::ADDING, half_hour_ago, "acc_id_0_msg"));
+      kAccountId, AccountMapping::ADDING, half_hour_ago, "acc_id_msg"));
   stored_mappings.push_back(MakeAccountMapping(
-      "acc_id_1", AccountMapping::MAPPED, half_hour_ago, "acc_id_1_msg"));
+      kAccountId1, AccountMapping::MAPPED, half_hour_ago, "acc_id_1_msg"));
   stored_mappings.push_back(MakeAccountMapping(
-      "acc_id_2", AccountMapping::REMOVING, half_hour_ago, "acc_id_2_msg"));
+      kAccountId2, AccountMapping::REMOVING, half_hour_ago, "acc_id_2_msg"));
 
   Initialize(stored_mappings);
   gcm_driver().AddAppHandler(kGCMAccountMapperAppId, mapper());
@@ -870,7 +867,7 @@
 
   // One of accounts gets removed.
   std::vector<GCMClient::AccountTokenInfo> account_tokens;
-  account_tokens.push_back(MakeAccountTokenInfo("acc_id_0"));
+  account_tokens.push_back(MakeAccountTokenInfo(kAccountId));
 
   // Advance a day to make sure existing mappings will be reported.
   clock()->SetNow(clock()->Now() + base::TimeDelta::FromDays(1));
@@ -895,9 +892,9 @@
       expected_mappings, GetAccounts(), "Step 3, Removing completed");
 
   account_tokens.clear();
-  account_tokens.push_back(MakeAccountTokenInfo("acc_id_0"));
-  account_tokens.push_back(MakeAccountTokenInfo("acc_id_3"));
-  account_tokens.push_back(MakeAccountTokenInfo("acc_id_4"));
+  account_tokens.push_back(MakeAccountTokenInfo(kAccountId));
+  account_tokens.push_back(MakeAccountTokenInfo(kAccountId3));
+  account_tokens.push_back(MakeAccountTokenInfo(kAccountId4));
 
   // Advance a day to make sure existing mappings will be reported.
   clock()->SetNow(clock()->Now() + base::TimeDelta::FromDays(1));
@@ -905,9 +902,9 @@
 
   // Mapping from acc_id_0 still in position 0
   expected_mappings.push_back(MakeAccountMapping(
-      "acc_id_3", AccountMapping::NEW, base::Time(), std::string()));
+      kAccountId3, AccountMapping::NEW, base::Time(), std::string()));
   expected_mappings.push_back(MakeAccountMapping(
-      "acc_id_4", AccountMapping::NEW, base::Time(), std::string()));
+      kAccountId4, AccountMapping::NEW, base::Time(), std::string()));
 
   VerifyMappings(expected_mappings, GetAccounts(), "Step 4, Two new accounts");
 
diff --git a/components/gcm_driver/gcm_account_tracker_unittest.cc b/components/gcm_driver/gcm_account_tracker_unittest.cc
index f3b7cf8..5450a4c 100644
--- a/components/gcm_driver/gcm_account_tracker_unittest.cc
+++ b/components/gcm_driver/gcm_account_tracker_unittest.cc
@@ -30,20 +30,20 @@
 const char kEmail1[] = "account_1@me.com";
 const char kEmail2[] = "account_2@me.com";
 
-std::string AccountIdToObfuscatedId(const std::string& account_id) {
-  return "obfid-" + account_id;
+std::string AccountIdToObfuscatedId(const CoreAccountId& account_id) {
+  return "obfid-" + account_id.id;
 }
 
-std::string GetValidTokenInfoResponse(const std::string& account_id) {
+std::string GetValidTokenInfoResponse(const CoreAccountId& account_id) {
   return std::string("{ \"id\": \"") + AccountIdToObfuscatedId(account_id) +
          "\" }";
 }
 
-std::string MakeAccessToken(const std::string& account_id) {
-  return "access_token-" + account_id;
+std::string MakeAccessToken(const CoreAccountId& account_id) {
+  return "access_token-" + account_id.id;
 }
 
-GCMClient::AccountTokenInfo MakeAccountToken(const std::string& account_id) {
+GCMClient::AccountTokenInfo MakeAccountToken(const CoreAccountId& account_id) {
   GCMClient::AccountTokenInfo token_info;
   token_info.account_id = account_id;
 
@@ -54,7 +54,7 @@
   // production code actually does :). If/when that bug gets fixed, this
   // function should be changed to take in the email address as well as the
   // account ID and populate this field with the email address.
-  token_info.email = account_id;
+  token_info.email = account_id.id;
   token_info.access_token = MakeAccessToken(account_id);
   return token_info;
 }
@@ -176,17 +176,17 @@
   // the account ID of the newly-added account, which can then be passed into
   // any methods that take in an account ID.
   // Call to RemoveAccount is not mandatory.
-  std::string StartAccountAddition(const std::string& email);
-  std::string StartPrimaryAccountAddition(const std::string& email);
-  void FinishAccountAddition(const std::string& account_id);
-  std::string AddAccount(const std::string& email);
-  std::string AddPrimaryAccount(const std::string& email);
-  void RemoveAccount(const std::string& account_id);
+  CoreAccountId StartAccountAddition(const std::string& email);
+  CoreAccountId StartPrimaryAccountAddition(const std::string& email);
+  void FinishAccountAddition(const CoreAccountId& account_id);
+  CoreAccountId AddAccount(const std::string& email);
+  CoreAccountId AddPrimaryAccount(const std::string& email);
+  void RemoveAccount(const CoreAccountId& account_id);
 
   // Helpers for dealing with OAuth2 access token requests.
-  void IssueAccessToken(const std::string& account_id);
-  void IssueExpiredAccessToken(const std::string& account_id);
-  void IssueError(const std::string& account_id);
+  void IssueAccessToken(const CoreAccountId& account_id);
+  void IssueExpiredAccessToken(const CoreAccountId& account_id);
+  void IssueError(const CoreAccountId& account_id);
 
   // Accessors to account tracker and gcm driver.
   GCMAccountTracker* tracker() { return tracker_.get(); }
@@ -227,25 +227,25 @@
     tracker_->Shutdown();
 }
 
-std::string GCMAccountTrackerTest::StartAccountAddition(
+CoreAccountId GCMAccountTrackerTest::StartAccountAddition(
     const std::string& email) {
   return identity_test_env_.MakeAccountAvailable(email).account_id;
 }
 
-std::string GCMAccountTrackerTest::StartPrimaryAccountAddition(
+CoreAccountId GCMAccountTrackerTest::StartPrimaryAccountAddition(
     const std::string& email) {
-// NOTE: Setting of the primary account info must be done first on ChromeOS
-// to ensure that AccountTracker and GCMAccountTracker respond as expected
-// when the token is added to the token service.
-// TODO(blundell): On non-ChromeOS, it would be good to add tests wherein
-// setting of the primary account is done afterward to check that the flow
-// that ensues from the GoogleSigninSucceeded callback firing works as
-// expected.
-return identity_test_env_.MakePrimaryAccountAvailable(email).account_id;
+  // NOTE: Setting of the primary account info must be done first on ChromeOS
+  // to ensure that AccountTracker and GCMAccountTracker respond as expected
+  // when the token is added to the token service.
+  // TODO(blundell): On non-ChromeOS, it would be good to add tests wherein
+  // setting of the primary account is done afterward to check that the flow
+  // that ensues from the GoogleSigninSucceeded callback firing works as
+  // expected.
+  return identity_test_env_.MakePrimaryAccountAvailable(email).account_id;
 }
 
 void GCMAccountTrackerTest::FinishAccountAddition(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   IssueAccessToken(account_id);
 
   EXPECT_TRUE(test_url_loader_factory()->IsPending(kOAuthURL));
@@ -257,34 +257,35 @@
   GetValidTokenInfoResponse(account_id);
 }
 
-std::string GCMAccountTrackerTest::AddPrimaryAccount(const std::string& email) {
-  std::string account_id = StartPrimaryAccountAddition(email);
+CoreAccountId GCMAccountTrackerTest::AddPrimaryAccount(
+    const std::string& email) {
+  CoreAccountId account_id = StartPrimaryAccountAddition(email);
   FinishAccountAddition(account_id);
   return account_id;
 }
 
-std::string GCMAccountTrackerTest::AddAccount(const std::string& email) {
-  std::string account_id = StartAccountAddition(email);
+CoreAccountId GCMAccountTrackerTest::AddAccount(const std::string& email) {
+  CoreAccountId account_id = StartAccountAddition(email);
   FinishAccountAddition(account_id);
   return account_id;
 }
 
-void GCMAccountTrackerTest::RemoveAccount(const std::string& account_id) {
+void GCMAccountTrackerTest::RemoveAccount(const CoreAccountId& account_id) {
   identity_test_env_.RemoveRefreshTokenForAccount(account_id);
 }
 
-void GCMAccountTrackerTest::IssueAccessToken(const std::string& account_id) {
+void GCMAccountTrackerTest::IssueAccessToken(const CoreAccountId& account_id) {
   identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
       account_id, MakeAccessToken(account_id), base::Time::Max());
 }
 
 void GCMAccountTrackerTest::IssueExpiredAccessToken(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
       account_id, MakeAccessToken(account_id), base::Time::Now());
 }
 
-void GCMAccountTrackerTest::IssueError(const std::string& account_id) {
+void GCMAccountTrackerTest::IssueError(const CoreAccountId& account_id) {
   identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
       account_id,
       GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE));
@@ -314,7 +315,7 @@
 // with a specific scope. In this scenario, the underlying account tracker is
 // still working when the CompleteCollectingTokens is called for the first time.
 TEST_F(GCMAccountTrackerTest, SingleAccount) {
-  std::string account_id1 = StartPrimaryAccountAddition(kEmail1);
+  CoreAccountId account_id1 = StartPrimaryAccountAddition(kEmail1);
 
   tracker()->Start();
   // We don't have any accounts to report, but given the inner account tracker
@@ -333,9 +334,9 @@
 }
 
 TEST_F(GCMAccountTrackerTest, MultipleAccounts) {
-  std::string account_id1 = StartPrimaryAccountAddition(kEmail1);
+  CoreAccountId account_id1 = StartPrimaryAccountAddition(kEmail1);
 
-  std::string account_id2 = StartAccountAddition(kEmail2);
+  CoreAccountId account_id2 = StartAccountAddition(kEmail2);
 
   tracker()->Start();
   EXPECT_FALSE(driver()->update_accounts_called());
@@ -358,7 +359,7 @@
   tracker()->Start();
   driver()->ResetResults();
 
-  std::string account_id1 = AddPrimaryAccount(kEmail1);
+  CoreAccountId account_id1 = AddPrimaryAccount(kEmail1);
   EXPECT_FALSE(driver()->update_accounts_called());
 
   IssueAccessToken(account_id1);
@@ -370,8 +371,8 @@
 }
 
 TEST_F(GCMAccountTrackerTest, AccountRemoved) {
-  std::string account_id1 = AddPrimaryAccount(kEmail1);
-  std::string account_id2 = AddAccount(kEmail2);
+  CoreAccountId account_id1 = AddPrimaryAccount(kEmail1);
+  CoreAccountId account_id2 = AddAccount(kEmail2);
 
   tracker()->Start();
   IssueAccessToken(account_id1);
@@ -390,8 +391,8 @@
 }
 
 TEST_F(GCMAccountTrackerTest, GetTokenFailed) {
-  std::string account_id1 = AddPrimaryAccount(kEmail1);
-  std::string account_id2 = AddAccount(kEmail2);
+  CoreAccountId account_id1 = AddPrimaryAccount(kEmail1);
+  CoreAccountId account_id2 = AddAccount(kEmail2);
 
   tracker()->Start();
   IssueAccessToken(account_id1);
@@ -409,8 +410,8 @@
 }
 
 TEST_F(GCMAccountTrackerTest, GetTokenFailedAccountRemoved) {
-  std::string account_id1 = AddPrimaryAccount(kEmail1);
-  std::string account_id2 = AddAccount(kEmail2);
+  CoreAccountId account_id1 = AddPrimaryAccount(kEmail1);
+  CoreAccountId account_id2 = AddAccount(kEmail2);
 
   tracker()->Start();
   IssueAccessToken(account_id1);
@@ -427,8 +428,8 @@
 }
 
 TEST_F(GCMAccountTrackerTest, AccountRemovedWhileRequestsPending) {
-  std::string account_id1 = AddPrimaryAccount(kEmail1);
-  std::string account_id2 = AddAccount(kEmail2);
+  CoreAccountId account_id1 = AddPrimaryAccount(kEmail1);
+  CoreAccountId account_id2 = AddAccount(kEmail2);
 
   tracker()->Start();
   IssueAccessToken(account_id1);
@@ -455,7 +456,7 @@
 // Makes sure that token fetching happens only after connection is established.
 TEST_F(GCMAccountTrackerTest, PostponeTokenFetchingUntilConnected) {
   driver()->SetConnected(false);
-  std::string account_id1 = StartPrimaryAccountAddition(kEmail1);
+  CoreAccountId account_id1 = StartPrimaryAccountAddition(kEmail1);
   tracker()->Start();
   FinishAccountAddition(account_id1);
 
@@ -466,8 +467,8 @@
 }
 
 TEST_F(GCMAccountTrackerTest, InvalidateExpiredTokens) {
-  std::string account_id1 = StartPrimaryAccountAddition(kEmail1);
-  std::string account_id2 = StartAccountAddition(kEmail2);
+  CoreAccountId account_id1 = StartPrimaryAccountAddition(kEmail1);
+  CoreAccountId account_id2 = StartAccountAddition(kEmail2);
   tracker()->Start();
   FinishAccountAddition(account_id1);
   FinishAccountAddition(account_id2);
@@ -490,7 +491,7 @@
   tracker()->Start();
   driver()->SetConnected(false);
   EXPECT_FALSE(IsFetchingRequired());
-  std::string account_id1 = StartPrimaryAccountAddition(kEmail1);
+  CoreAccountId account_id1 = StartPrimaryAccountAddition(kEmail1);
   FinishAccountAddition(account_id1);
   EXPECT_TRUE(IsFetchingRequired());
 
@@ -499,7 +500,7 @@
   IssueAccessToken(account_id1);
   EXPECT_FALSE(IsFetchingRequired());
 
-  std::string account_id2 = StartAccountAddition(kEmail2);
+  CoreAccountId account_id2 = StartAccountAddition(kEmail2);
   FinishAccountAddition(account_id2);
   EXPECT_FALSE(IsFetchingRequired());  // Indicates that fetching has started.
 
@@ -550,7 +551,7 @@
   driver()->SetLastTokenFetchTime(base::Time::Now());
   EXPECT_FALSE(IsTokenReportingRequired());
 
-  std::string account_id1 = AddPrimaryAccount(kEmail1);
+  CoreAccountId account_id1 = AddPrimaryAccount(kEmail1);
   IssueAccessToken(account_id1);
   driver()->ResetResults();
   // Reporting was triggered, which means testing for required will give false,
diff --git a/components/gcm_driver/gcm_client_impl_unittest.cc b/components/gcm_driver/gcm_client_impl_unittest.cc
index 72373e79..698f189 100644
--- a/components/gcm_driver/gcm_client_impl_unittest.cc
+++ b/components/gcm_driver/gcm_client_impl_unittest.cc
@@ -1586,7 +1586,7 @@
   base::Time expected_time = base::Time::Now();
   gcm_client()->SetLastTokenFetchTime(expected_time);
   AccountMapping expected_mapping;
-  expected_mapping.account_id = "accId";
+  expected_mapping.account_id = CoreAccountId("accId");
   expected_mapping.email = "email@gmail.com";
   expected_mapping.status = AccountMapping::MAPPED;
   expected_mapping.status_change_timestamp = expected_time;
diff --git a/components/password_manager/core/browser/leak_detection/authenticated_leak_check_unittest.cc b/components/password_manager/core/browser/leak_detection/authenticated_leak_check_unittest.cc
index c23a406..462c1c6 100644
--- a/components/password_manager/core/browser/leak_detection/authenticated_leak_check_unittest.cc
+++ b/components/password_manager/core/browser/leak_detection/authenticated_leak_check_unittest.cc
@@ -118,7 +118,7 @@
 
 PayloadAndCallback AuthenticatedLeakCheckTest::ImitateNetworkRequest() {
   AccountInfo info = identity_env().MakeAccountAvailable(kTestEmail);
-  identity_env().SetCookieAccounts({{info.email, info.account_id}});
+  identity_env().SetCookieAccounts({{info.email, info.gaia}});
   identity_env().SetRefreshTokenForAccount(info.account_id);
 
   leak_check().Start(GURL(kExampleCom), base::ASCIIToUTF16(kUsername),
@@ -158,7 +158,7 @@
 
 TEST_F(AuthenticatedLeakCheckTest, HasAccountForRequest_SignedIn) {
   AccountInfo info = identity_env().MakeAccountAvailable(kTestEmail);
-  identity_env().SetCookieAccounts({{info.email, info.account_id}});
+  identity_env().SetCookieAccounts({{info.email, info.gaia}});
   identity_env().SetRefreshTokenForAccount(info.account_id);
   EXPECT_TRUE(AuthenticatedLeakCheck::HasAccountForRequest(
       identity_env().identity_manager()));
@@ -172,7 +172,7 @@
 
 TEST_F(AuthenticatedLeakCheckTest, GetAccessTokenBeforeEncryption) {
   AccountInfo info = identity_env().MakeAccountAvailable(kTestEmail);
-  identity_env().SetCookieAccounts({{info.email, info.account_id}});
+  identity_env().SetCookieAccounts({{info.email, info.gaia}});
   identity_env().SetRefreshTokenForAccount(info.account_id);
   const std::string access_token = "access_token";
 
@@ -205,7 +205,7 @@
 
 TEST_F(AuthenticatedLeakCheckTest, GetAccessTokenAfterEncryption) {
   AccountInfo info = identity_env().MakeAccountAvailable(kTestEmail);
-  identity_env().SetCookieAccounts({{info.email, info.account_id}});
+  identity_env().SetCookieAccounts({{info.email, info.gaia}});
   identity_env().SetRefreshTokenForAccount(info.account_id);
 
   leak_check().Start(GURL(kExampleCom), base::ASCIIToUTF16(kUsername),
@@ -239,7 +239,7 @@
 
 TEST_F(AuthenticatedLeakCheckTest, GetAccessTokenFailure) {
   AccountInfo info = identity_env().MakeAccountAvailable(kTestEmail);
-  identity_env().SetCookieAccounts({{info.email, info.account_id}});
+  identity_env().SetCookieAccounts({{info.email, info.gaia}});
   identity_env().SetRefreshTokenForAccount(info.account_id);
 
   leak_check().Start(GURL(kExampleCom), base::ASCIIToUTF16(kUsername),
diff --git a/components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl_unittest.cc b/components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl_unittest.cc
index 0e5dd00d..447cdd2 100644
--- a/components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl_unittest.cc
+++ b/components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl_unittest.cc
@@ -68,7 +68,7 @@
   feature_list.InitAndEnableFeature(features::kLeakDetection);
 
   AccountInfo info = identity_env().MakeAccountAvailable(kTestAccount);
-  identity_env().SetCookieAccounts({{info.email, info.account_id}});
+  identity_env().SetCookieAccounts({{info.email, info.gaia}});
   identity_env().SetRefreshTokenForAccount(info.account_id);
   EXPECT_TRUE(request_factory().TryCreateLeakCheck(
       &delegate(), identity_env().identity_manager(), url_loader_factory()));
diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc
index 172849f..2adb1541 100644
--- a/components/plugins/renderer/webview_plugin.cc
+++ b/components/plugins/renderer/webview_plugin.cc
@@ -21,6 +21,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "skia/ext/platform_canvas.h"
 #include "third_party/blink/public/common/page/page_zoom.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h"
 #include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h"
 #include "third_party/blink/public/platform/web_coalesced_input_event.h"
 #include "third_party/blink/public/platform/web_url.h"
@@ -266,8 +267,12 @@
   // ApplyWebPreferences before making a WebLocalFrame so that the frame sees a
   // consistent view of our preferences.
   content::RenderView::ApplyWebPreferences(preferences, web_view_);
-  WebLocalFrame* web_frame =
-      WebLocalFrame::CreateMainFrame(web_view_, this, nullptr, nullptr);
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker;
+  WebLocalFrame* web_frame = WebLocalFrame::CreateMainFrame(
+      web_view_, this, nullptr,
+      document_interface_broker.InitWithNewPipeAndPassReceiver().PassPipe(),
+      nullptr);
   // The created WebFrameWidget is owned by the |web_frame|.
   WebFrameWidget::CreateForMainFrame(this, web_frame);
 
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index 4d158128..ca398efa 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -43,6 +43,7 @@
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
 #include "third_party/blink/public/common/frame/frame_owner_element_type.h"
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_data.h"
 #include "third_party/blink/public/platform/web_double_size.h"
@@ -725,8 +726,12 @@
   };
 
   HeaderAndFooterClient frame_client;
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker;
   blink::WebLocalFrame* frame = blink::WebLocalFrame::CreateMainFrame(
-      web_view, &frame_client, nullptr, nullptr);
+      web_view, &frame_client, nullptr,
+      document_interface_broker.InitWithNewPipeAndPassReceiver().PassPipe(),
+      nullptr);
 
   blink::WebWidgetClient web_widget_client;
   blink::WebFrameWidget::CreateForMainFrame(&web_widget_client, frame);
@@ -961,8 +966,12 @@
       /*compositing_enabled=*/false,
       /*opener=*/nullptr);
   content::RenderView::ApplyWebPreferences(prefs, web_view);
-  blink::WebLocalFrame* main_frame =
-      blink::WebLocalFrame::CreateMainFrame(web_view, this, nullptr, nullptr);
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker;
+  blink::WebLocalFrame* main_frame = blink::WebLocalFrame::CreateMainFrame(
+      web_view, this, nullptr,
+      document_interface_broker.InitWithNewPipeAndPassReceiver().PassPipe(),
+      nullptr);
   frame_.Reset(main_frame);
   blink::WebFrameWidget::CreateForMainFrame(this, main_frame);
   node_to_print_.Reset();
diff --git a/components/safe_browsing/db/v4_local_database_manager.cc b/components/safe_browsing/db/v4_local_database_manager.cc
index 588ab2c..b4fa60e 100644
--- a/components/safe_browsing/db/v4_local_database_manager.cc
+++ b/components/safe_browsing/db/v4_local_database_manager.cc
@@ -62,8 +62,6 @@
 #endif
   const bool kSyncAlways = true;
   const bool kSyncNever = false;
-  const bool kSyncRealTimeLookupList =
-      RealTimePolicyEngine::IsFetchAllowlistEnabled();
   return ListInfos({
       ListInfo(kSyncAlways, "IpMalware.store", GetIpMalwareId(),
                SB_THREAT_TYPE_UNUSED),
@@ -93,7 +91,7 @@
       ListInfo(kSyncOnlyOnChromeBuilds, "UrlSuspiciousSite.store",
                GetUrlSuspiciousSiteId(), SB_THREAT_TYPE_SUSPICIOUS_SITE),
       ListInfo(kSyncNever, "", GetChromeUrlApiId(), SB_THREAT_TYPE_API_ABUSE),
-      ListInfo(kSyncRealTimeLookupList, "UrlHighConfidenceAllowlist.store",
+      ListInfo(kSyncOnlyOnChromeBuilds, "UrlHighConfidenceAllowlist.store",
                GetUrlHighConfidenceAllowlistId(),
                SB_THREAT_TYPE_HIGH_CONFIDENCE_ALLOWLIST),
   });
diff --git a/components/safe_browsing/db/v4_local_database_manager_unittest.cc b/components/safe_browsing/db/v4_local_database_manager_unittest.cc
index 33775bf..f175936 100644
--- a/components/safe_browsing/db/v4_local_database_manager_unittest.cc
+++ b/components/safe_browsing/db/v4_local_database_manager_unittest.cc
@@ -646,10 +646,7 @@
 TEST_F(V4LocalDatabaseManagerTest,
        TestCheckUrlForHCAllowlistWithPrefixMatchButNoFullHashMatch) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      {safe_browsing::kRealTimeUrlLookupFetchAllowlist,
-       safe_browsing::kRealTimeUrlLookupEnabled},
-      {});
+  feature_list.InitWithFeatures({safe_browsing::kRealTimeUrlLookupEnabled}, {});
 
   std::string url_safe_no_scheme("example.com/safe/");
   FullHash safe_full_hash(crypto::SHA256HashString(url_safe_no_scheme));
@@ -689,10 +686,7 @@
 TEST_F(V4LocalDatabaseManagerTest,
        TestCheckUrlForHCAllowlistWithPrefixMatchAndFullHashMatch) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      {safe_browsing::kRealTimeUrlLookupFetchAllowlist,
-       safe_browsing::kRealTimeUrlLookupEnabled},
-      {});
+  feature_list.InitWithFeatures({safe_browsing::kRealTimeUrlLookupEnabled}, {});
 
   std::string url_safe_no_scheme("example.com/safe/");
   FullHash safe_full_hash(crypto::SHA256HashString(url_safe_no_scheme));
@@ -734,10 +728,7 @@
 TEST_F(V4LocalDatabaseManagerTest,
        TestCheckUrlForHCAllowlistWithLocalFullHashMatch) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      {safe_browsing::kRealTimeUrlLookupFetchAllowlist,
-       safe_browsing::kRealTimeUrlLookupEnabled},
-      {});
+  feature_list.InitWithFeatures({safe_browsing::kRealTimeUrlLookupEnabled}, {});
 
   std::string url_safe_no_scheme("example.com/safe/");
   FullHash safe_full_hash(crypto::SHA256HashString(url_safe_no_scheme));
@@ -770,10 +761,7 @@
 // synchronously and callback isn't called.
 TEST_F(V4LocalDatabaseManagerTest, TestCheckUrlForHCAllowlistWithNoMatch) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      {safe_browsing::kRealTimeUrlLookupFetchAllowlist,
-       safe_browsing::kRealTimeUrlLookupEnabled},
-      {});
+  feature_list.InitWithFeatures({safe_browsing::kRealTimeUrlLookupEnabled}, {});
 
   std::string url_safe_no_scheme("example.com/safe/");
   FullHash safe_full_hash(crypto::SHA256HashString(url_safe_no_scheme));
@@ -804,10 +792,7 @@
 // When allowlist is unavailable, all URLS should be considered no-match.
 TEST_F(V4LocalDatabaseManagerTest, TestCheckUrlForHCAllowlistUnavailable) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      {safe_browsing::kRealTimeUrlLookupFetchAllowlist,
-       safe_browsing::kRealTimeUrlLookupEnabled},
-      {});
+  feature_list.InitWithFeatures({safe_browsing::kRealTimeUrlLookupEnabled}, {});
 
   // Setup to receive full-hash misses. We won't make URL requests.
   ScopedFakeGetHashProtocolManagerFactory pin(FullHashInfos({}));
diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/features.cc
index 4e10b0b..bdf4ebc 100644
--- a/components/safe_browsing/features.cc
+++ b/components/safe_browsing/features.cc
@@ -55,10 +55,6 @@
 const base::Feature kRealTimeUrlLookupEnabled{
     "SafeBrowsingRealTimeUrlLookupEnabled", base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kRealTimeUrlLookupFetchAllowlist{
-    "SafeBrowsingRealTimeUrlLookupFetchAllowlist",
-    base::FEATURE_DISABLED_BY_DEFAULT};
-
 const base::Feature kSendOnFocusPing {
   "SafeBrowsingSendOnFocusPing",
 #if BUILDFLAG(FULL_SAFE_BROWSING)
@@ -122,7 +118,6 @@
     {&kPasswordProtectionForSavedPasswords, true},
     {&kPasswordProtectionForSignedInUsers, true},
     {&kRealTimeUrlLookupEnabled, true},
-    {&kRealTimeUrlLookupFetchAllowlist, true},
     {&kSendOnFocusPing, true},
     {&kSendPasswordReusePing, true},
     {&kSendSampledPingsForAllowlistDomains, false},
diff --git a/components/safe_browsing/features.h b/components/safe_browsing/features.h
index 8085b49..34c71978 100644
--- a/components/safe_browsing/features.h
+++ b/components/safe_browsing/features.h
@@ -66,15 +66,9 @@
 // Controls the daily quota for the suspicious site trigger.
 extern const base::Feature kSuspiciousSiteTriggerQuotaFeature;
 
-// Controls whether the real time URL lookup is enabled. Only works if
-// |kRealTimeUrlLookupFetchAllowlist| is also enabled.
+// Controls whether the real time URL lookup is enabled.
 extern const base::Feature kRealTimeUrlLookupEnabled;
 
-// Controls whether the high confidence allowlist for real time URL lookup be
-// fetched.
-// Note: it is not applicable on Android.
-extern const base::Feature kRealTimeUrlLookupFetchAllowlist;
-
 // Controls whether to send sample pings of allowlist domains on
 // the allowlist to Safe Browsing.
 extern const base::Feature kSendSampledPingsForAllowlistDomains;
diff --git a/components/safe_browsing/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
index 3df56af..91d3dd9 100644
--- a/components/safe_browsing/password_protection/password_protection_service_unittest.cc
+++ b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
@@ -904,7 +904,7 @@
 
   // Initiate a saved password entry request (w/ no sync password).
   AccountInfo account_info;
-  account_info.account_id = "account_id";
+  account_info.account_id = CoreAccountId("account_id");
   account_info.email = "email";
   account_info.gaia = "gaia";
   EXPECT_CALL(*password_protection_service_, GetSignedInNonSyncAccount(_))
@@ -1121,7 +1121,7 @@
   EXPECT_CALL(*password_protection_service_, IsPrimaryAccountSignedIn())
       .WillRepeatedly(Return(true));
   AccountInfo account_info;
-  account_info.account_id = "account_id";
+  account_info.account_id = CoreAccountId("account_id");
   account_info.email = "email";
   account_info.gaia = "gaia";
   EXPECT_CALL(*password_protection_service_, GetSignedInNonSyncAccount(_))
@@ -1275,7 +1275,7 @@
   EXPECT_CALL(*password_protection_service_, IsPrimaryAccountSignedIn())
       .WillRepeatedly(Return(true));
   AccountInfo account_info;
-  account_info.account_id = "account_id";
+  account_info.account_id = CoreAccountId("account_id");
   account_info.email = "email";
   account_info.gaia = "gaia";
   EXPECT_CALL(*password_protection_service_, GetSignedInNonSyncAccount(_))
diff --git a/components/safe_browsing/realtime/policy_engine.cc b/components/safe_browsing/realtime/policy_engine.cc
index 0f39d88..afbce14 100644
--- a/components/safe_browsing/realtime/policy_engine.cc
+++ b/components/safe_browsing/realtime/policy_engine.cc
@@ -26,11 +26,6 @@
 #endif
 
 // static
-bool RealTimePolicyEngine::IsFetchAllowlistEnabled() {
-  return base::FeatureList::IsEnabled(kRealTimeUrlLookupFetchAllowlist);
-}
-
-// static
 bool RealTimePolicyEngine::IsUrlLookupEnabled() {
   if (!base::FeatureList::IsEnabled(kRealTimeUrlLookupEnabled))
     return false;
@@ -67,12 +62,6 @@
 // static
 bool RealTimePolicyEngine::CanPerformFullURLLookup(
     content::BrowserContext* browser_context) {
-#if !defined(OS_ANDROID)
-  // TODO(crbug.com/963165): Remove this flag in M80.
-  if (!IsFetchAllowlistEnabled())
-    return false;
-#endif
-
   if (IsEnabledByPolicy(browser_context))
     return true;
 
diff --git a/components/safe_browsing/realtime/policy_engine.h b/components/safe_browsing/realtime/policy_engine.h
index f396e462..8de5b6d 100644
--- a/components/safe_browsing/realtime/policy_engine.h
+++ b/components/safe_browsing/realtime/policy_engine.h
@@ -29,9 +29,6 @@
   RealTimePolicyEngine() = delete;
   ~RealTimePolicyEngine() = delete;
 
-  // Is the feature to sync high confidence allowlist enabled?
-  static bool IsFetchAllowlistEnabled();
-
   // Return true if full URL lookups are enabled for |resource_type|.
   static bool CanPerformFullURLLookupForResourceType(
       content::ResourceType resource_type);
diff --git a/components/safe_browsing/realtime/policy_engine_unittest.cc b/components/safe_browsing/realtime/policy_engine_unittest.cc
index f03aa1db..f05d4de 100644
--- a/components/safe_browsing/realtime/policy_engine_unittest.cc
+++ b/components/safe_browsing/realtime/policy_engine_unittest.cc
@@ -48,36 +48,32 @@
 #if defined(OS_ANDROID)
 // Real time URL check on Android is controlled by system memory size, the
 // following tests test that logic.
-TEST_F(RealTimePolicyEngineTest,
-       TestCanPerformFullURLLookup_DisabledFetchAllowlistWithLargeMemorySize) {
+TEST_F(RealTimePolicyEngineTest, TestCanPerformFullURLLookup_LargeMemorySize) {
   base::test::ScopedFeatureList feature_list;
   int system_memory_size = base::SysInfo::AmountOfPhysicalMemoryMB();
   int memory_size_threshold = system_memory_size - 1;
-  // Should not be controlled by allowlist flag on Android.
   feature_list.InitWithFeaturesAndParameters(
       /* enabled_features */ {{kRealTimeUrlLookupEnabled,
                                {{kRealTimeUrlLookupMemoryThresholdMb,
                                  base::NumberToString(
                                      memory_size_threshold)}}}},
-      /* disabled_features */ {kRealTimeUrlLookupFetchAllowlist});
+      /* disabled_features */ {});
   pref_service_.SetUserPref(
       unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
       std::make_unique<base::Value>(true));
   EXPECT_TRUE(CanPerformFullURLLookup());
 }
 
-TEST_F(RealTimePolicyEngineTest,
-       TestCanPerformFullURLLookup_DisabledFetchAllowlistWithSmallMemorySize) {
+TEST_F(RealTimePolicyEngineTest, TestCanPerformFullURLLookup_SmallMemorySize) {
   base::test::ScopedFeatureList feature_list;
   int system_memory_size = base::SysInfo::AmountOfPhysicalMemoryMB();
   int memory_size_threshold = system_memory_size + 1;
-  // Should not be controlled by allowlist flag on Android.
   feature_list.InitWithFeaturesAndParameters(
       /* enabled_features */ {{kRealTimeUrlLookupEnabled,
                                {{kRealTimeUrlLookupMemoryThresholdMb,
                                  base::NumberToString(
                                      memory_size_threshold)}}}},
-      /* disabled_features */ {kRealTimeUrlLookupFetchAllowlist});
+      /* disabled_features */ {});
   pref_service_.SetUserPref(
       unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
       std::make_unique<base::Value>(true));
@@ -89,22 +85,13 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       /* enabled_features */ {},
-      /* disabled_features */ {kRealTimeUrlLookupFetchAllowlist,
-                               kRealTimeUrlLookupEnabled});
-  EXPECT_FALSE(CanPerformFullURLLookup());
-}
-#else   // !defined(OS_ANDROID)
-TEST_F(RealTimePolicyEngineTest,
-       TestCanPerformFullURLLookup_DisabledFetchAllowlist) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(kRealTimeUrlLookupFetchAllowlist);
+      /* disabled_features */ {kRealTimeUrlLookupEnabled});
   EXPECT_FALSE(CanPerformFullURLLookup());
 }
 #endif  // defined(OS_ANDROID)
 
 TEST_F(RealTimePolicyEngineTest, TestCanPerformFullURLLookup_EnabledByPolicy) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(kRealTimeUrlLookupFetchAllowlist);
   pref_service_.SetManagedPref(prefs::kSafeBrowsingRealTimeLookupEnabled,
                                std::make_unique<base::Value>(true));
   EXPECT_TRUE(CanPerformFullURLLookup());
@@ -131,9 +118,6 @@
 
 TEST_F(RealTimePolicyEngineTest,
        TestCanPerformFullURLLookup_EnabledMainFrameOnly) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(kRealTimeUrlLookupFetchAllowlist);
-
   for (int i = 0; i <= static_cast<int>(content::ResourceType::kMaxValue);
        i++) {
     content::ResourceType resource_type = static_cast<content::ResourceType>(i);
diff --git a/components/services/app_service/OWNERS b/components/services/app_service/OWNERS
index 04b484a..f2d8e9b 100644
--- a/components/services/app_service/OWNERS
+++ b/components/services/app_service/OWNERS
@@ -1,2 +1,5 @@
 dominickn@chromium.org
+nancylingwang@chromium.org
 nigeltao@chromium.org
+
+# COMPONENT: Platform>Apps>Foundation
diff --git a/components/signin/core/browser/account_reconcilor.cc b/components/signin/core/browser/account_reconcilor.cc
index 6e6df823..0da4ebc1 100644
--- a/components/signin/core/browser/account_reconcilor.cc
+++ b/components/signin/core/browser/account_reconcilor.cc
@@ -22,7 +22,6 @@
 #include "build/build_config.h"
 #include "components/signin/core/browser/account_reconcilor_delegate.h"
 #include "components/signin/core/browser/consistency_cookie_manager_base.h"
-#include "components/signin/core/browser/cookie_reminter.h"
 #include "components/signin/public/base/account_consistency_method.h"
 #include "components/signin/public/base/signin_client.h"
 #include "components/signin/public/base/signin_metrics.h"
@@ -340,7 +339,6 @@
   if (registered_with_identity_manager_)
     return;
 
-  cookie_reminter_ = std::make_unique<CookieReminter>(identity_manager_);
   identity_manager_->AddObserver(this);
   registered_with_identity_manager_ = true;
 }
@@ -350,7 +348,6 @@
   if (!registered_with_identity_manager_)
     return;
 
-  cookie_reminter_.reset();
   identity_manager_->RemoveObserver(this);
   registered_with_identity_manager_ = false;
 }
@@ -364,11 +361,6 @@
   return base::WrapUnique(new ScopedSyncedDataDeletion(this));
 }
 
-void AccountReconcilor::ForceCookieRemintingOnNextTokenUpdate(
-    const CoreAccountInfo& account_info) {
-  cookie_reminter_->ForceCookieRemintingOnNextTokenUpdate(account_info);
-}
-
 void AccountReconcilor::AddObserver(Observer* observer) {
   observer_list_.AddObserver(observer);
 }
@@ -538,13 +530,6 @@
   DCHECK(!set_accounts_in_progress_);
   DCHECK_EQ(AccountReconcilorState::ACCOUNT_RECONCILOR_RUNNING, state_);
 
-#if defined(OS_CHROMEOS)
-  // Cookie may need to be reminted on Chrome OS. See https://crbug.com/1012649
-  // for details.
-  if (cookie_reminter_->RemintCookieIfRequired())
-    gaia_accounts.clear();
-#endif
-
   bool primary_has_error =
       identity_manager_->HasAccountWithRefreshTokenInPersistentErrorState(
           primary_account);
@@ -774,14 +759,6 @@
       (number_gaia_accounts > 0) && (first_account != gaia_accounts[0].id);
 
   bool rebuild_cookie = first_account_mismatch || (removed_from_cookie > 0);
-
-#if defined(OS_CHROMEOS)
-  // Cookie may need to be reminted on Chrome OS. See https://crbug.com/1012649
-  // for details.
-  if (cookie_reminter_->RemintCookieIfRequired())
-    rebuild_cookie = true;
-#endif
-
   std::vector<gaia::ListedAccount> original_gaia_accounts = gaia_accounts;
   if (rebuild_cookie) {
     VLOG(1) << "AccountReconcilor::FinishReconcile: rebuild cookie";
diff --git a/components/signin/core/browser/account_reconcilor.h b/components/signin/core/browser/account_reconcilor.h
index 0dd7d86..1ed8510 100644
--- a/components/signin/core/browser/account_reconcilor.h
+++ b/components/signin/core/browser/account_reconcilor.h
@@ -34,7 +34,6 @@
 enum class SetAccountsInCookieResult;
 }
 
-class CookieReminter;
 class SigninClient;
 
 class AccountReconcilor : public KeyedService,
@@ -129,11 +128,6 @@
   // from being invalidated during the deletion.
   std::unique_ptr<ScopedSyncedDataDeletion> GetScopedSyncDataDeletion();
 
-  // Forces a cookie reminting if/when the refresh token for |account_info| is
-  // updated.
-  void ForceCookieRemintingOnNextTokenUpdate(
-      const CoreAccountInfo& account_info);
-
  private:
   friend class AccountReconcilorTest;
   friend class DiceBrowserTest;
@@ -364,7 +358,6 @@
   std::vector<CoreAccountId> add_to_cookie_;  // Progress of AddAccount calls.
   bool set_accounts_in_progress_;             // Progress of SetAccounts calls.
   bool chrome_accounts_changed_;
-  std::unique_ptr<CookieReminter> cookie_reminter_;
 
   // Used for the Lock.
   // StartReconcile() is blocked while this is > 0.
diff --git a/components/signin/core/browser/account_reconcilor_unittest.cc b/components/signin/core/browser/account_reconcilor_unittest.cc
index 64ddfd6..1948302 100644
--- a/components/signin/core/browser/account_reconcilor_unittest.cc
+++ b/components/signin/core/browser/account_reconcilor_unittest.cc
@@ -671,10 +671,11 @@
                   PerformMergeAction(account_id_for_cookie))
           .Times(1);
       // MergeSession fixes an existing cookie or appends it at the end.
-      auto it = std::find(cookies.begin(), cookies.end(),
-                          Cookie{account_id_for_cookie, false /* is_valid */});
+      auto it =
+          std::find(cookies.begin(), cookies.end(),
+                    Cookie{accounts_[cookie[0]].gaia_id, false /* is_valid */});
       if (it == cookies.end())
-        cookies.push_back({account_id_for_cookie, true});
+        cookies.push_back({accounts_[cookie[0]].gaia_id, true});
       else
         it->is_valid = true;
     }
diff --git a/components/signin/core/browser/cookie_reminter.cc b/components/signin/core/browser/cookie_reminter.cc
index 71fa4b7..ef14d6bc 100644
--- a/components/signin/core/browser/cookie_reminter.cc
+++ b/components/signin/core/browser/cookie_reminter.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "components/signin/core/browser/cookie_reminter.h"
+
+#include "base/syslog_logging.h"
 #include "components/signin/public/identity_manager/accounts_cookie_mutator.h"
 
 namespace {
@@ -41,23 +43,13 @@
   accounts_requiring_cookie_remint_.emplace_back(account_info);
 }
 
-bool CookieReminter::RemintCookieIfRequired() {
-  if (!is_forced_cookie_reminting_required_)
-    return false;
-
-  identity_manager_->GetAccountsCookieMutator()->LogOutAllAccounts(
-      gaia::GaiaSource::kChromeOS);
-  accounts_requiring_cookie_remint_.clear();
-  is_forced_cookie_reminting_required_ = false;
-  return true;
-}
-
 void CookieReminter::OnRefreshTokenUpdatedForAccount(
     const CoreAccountInfo& account_info) {
   if (DoesAccountRequireCookieReminting(accounts_requiring_cookie_remint_,
                                         account_info)) {
     // Cookies are going to be reminted for all accounts.
     accounts_requiring_cookie_remint_.clear();
-    is_forced_cookie_reminting_required_ = true;
+    identity_manager_->GetAccountsCookieMutator()->LogOutAllAccounts(
+        gaia::GaiaSource::kChromeOS);
   }
 }
diff --git a/components/signin/core/browser/cookie_reminter.h b/components/signin/core/browser/cookie_reminter.h
index 5875b6b0..7bc4ab8 100644
--- a/components/signin/core/browser/cookie_reminter.h
+++ b/components/signin/core/browser/cookie_reminter.h
@@ -6,6 +6,7 @@
 
 #include <vector>
 
+#include "components/keyed_service/core/keyed_service.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 
 // Stores accounts with invalid cookies, which cannot be detected by
@@ -16,7 +17,8 @@
 // |AccountsCookieMutator::LogOutAllAccounts| after refresh token update of
 // any of the accounts that have been added to
 // |ForceCookieRemintingOnNextTokenUpdate|.
-class CookieReminter : public signin::IdentityManager::Observer {
+class CookieReminter : public KeyedService,
+                       public signin::IdentityManager::Observer {
  public:
   explicit CookieReminter(signin::IdentityManager* identity_manager);
   ~CookieReminter() override;
@@ -26,17 +28,11 @@
   void ForceCookieRemintingOnNextTokenUpdate(
       const CoreAccountInfo& account_info);
 
-  // If there are accounts that require cookie reminting, calls
-  // |AccountsCookieMutator::LogOutAllAccounts| and returns true. Otherwise
-  // returns false.
-  bool RemintCookieIfRequired();
-
+ private:
   // Overridden from signin::IdentityManager::Observer.
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
 
- private:
-  bool is_forced_cookie_reminting_required_ = false;
   signin::IdentityManager* identity_manager_;
   std::vector<CoreAccountInfo> accounts_requiring_cookie_remint_;
 };
diff --git a/components/signin/internal/identity_manager/account_tracker_service_unittest.cc b/components/signin/internal/identity_manager/account_tracker_service_unittest.cc
index 00288b8..d6bafc4 100644
--- a/components/signin/internal/identity_manager/account_tracker_service_unittest.cc
+++ b/components/signin/internal/identity_manager/account_tracker_service_unittest.cc
@@ -628,7 +628,7 @@
 
   const std::string gaia_id_beta = AccountKeyToGaiaId(kAccountKeyBeta);
   info = account_tracker()->FindAccountInfoByGaiaId(gaia_id_beta);
-  EXPECT_EQ(std::string(), info.account_id);
+  EXPECT_TRUE(info.account_id.empty());
 }
 
 TEST_F(AccountTrackerServiceTest, FindAccountInfoByEmail) {
@@ -969,8 +969,8 @@
   EXPECT_EQ(account_info.gaia, gaia_alpha);
   EXPECT_EQ(account_info.email, email_alpha);
 
-  account_info = account_tracker()->GetAccountInfo(gaia_beta);
-  EXPECT_EQ(account_info.account_id, gaia_beta);
+  account_info = account_tracker()->GetAccountInfo(CoreAccountId(gaia_beta));
+  EXPECT_EQ(account_info.account_id, CoreAccountId(gaia_beta));
   EXPECT_EQ(account_info.gaia, gaia_beta);
   EXPECT_EQ(account_info.email, email_beta);
 
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 1cf5341..ede9d34 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
@@ -34,9 +34,10 @@
 
 namespace {
 
-const char kAccountId1[] = "acc1@gmail.com";
-const char kAccountId2[] = "acc2@gmail.com";
-const char kAccountId3[] = "acc3@gmail.com";
+const char kAccountId1[] = "account_id1";
+const char kAccountId2[] = "account_id2";
+const char kAccountId3[] = "account_id3";
+const char kAccountId4[] = "account_id4";
 
 using MockAddAccountToCookieCompletedCallback = base::MockCallback<
     GaiaCookieManagerService::AddAccountToCookieCompletedCallback>;
@@ -117,6 +118,7 @@
       : account_id1_(kAccountId1),
         account_id2_(kAccountId2),
         account_id3_(kAccountId3),
+        account_id4_(kAccountId4),
         no_error_(GoogleServiceAuthError::NONE),
         error_(GoogleServiceAuthError::SERVICE_ERROR),
         canceled_(GoogleServiceAuthError::REQUEST_CANCELED) {
@@ -226,6 +228,7 @@
   const CoreAccountId account_id1_;
   const CoreAccountId account_id2_;
   const CoreAccountId account_id3_;
+  const CoreAccountId account_id4_;
 
  private:
   base::test::TaskEnvironment task_environment_;
@@ -431,7 +434,7 @@
   SimulateMergeSessionSuccess(&helper, "token2");
   SimulateMergeSessionSuccess(&helper, "token3");
 
-  helper.AddAccountToCookie("acc4@gmail.com", gaia::GaiaSource::kChrome,
+  helper.AddAccountToCookie(account_id4_, gaia::GaiaSource::kChrome,
                             add_account_to_cookie_completed.Get());
 
   SimulateMergeSessionSuccess(&helper, "token4");
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 ce3d3cc..1115d73 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
@@ -58,7 +58,7 @@
                                   bool is_hosted_domain,
                                   bool is_valid) {
   AccountInfo account_info;
-  account_info.account_id = name;
+  account_info.account_id = CoreAccountId(name);
   account_info.gaia = name;
   account_info.email = name + "@email.com";
   account_info.full_name = "name";
@@ -303,7 +303,7 @@
   AddAuthTokenManually(kLSOService, "lsoToken");
   // Also add a token using PO2TS.UpdateCredentials and make sure upgrade does
   // not wipe it.
-  std::string other_account_id("other_account_id");
+  CoreAccountId other_account_id("other_account_id");
   std::string other_refresh_token("other_refresh_token");
   oauth2_service_delegate_->UpdateCredentials(other_account_id,
                                               other_refresh_token);
@@ -377,7 +377,7 @@
 
   EXPECT_EQ(signin::LoadCredentialsState::LOAD_CREDENTIALS_NOT_STARTED,
             oauth2_service_delegate_->load_credentials_state());
-  oauth2_service_delegate_->LoadCredentials("");
+  oauth2_service_delegate_->LoadCredentials(CoreAccountId());
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(
       signin::LoadCredentialsState::LOAD_CREDENTIALS_FINISHED_WITH_SUCCESS,
@@ -397,7 +397,7 @@
   // Perform a load from an empty DB.
   EXPECT_EQ(signin::LoadCredentialsState::LOAD_CREDENTIALS_NOT_STARTED,
             oauth2_service_delegate_->load_credentials_state());
-  oauth2_service_delegate_->LoadCredentials("account_id");
+  oauth2_service_delegate_->LoadCredentials(account_id);
   EXPECT_EQ(signin::LoadCredentialsState::LOAD_CREDENTIALS_IN_PROGRESS,
             oauth2_service_delegate_->load_credentials_state());
   base::RunLoop().RunUntilIdle();
@@ -407,7 +407,7 @@
   EXPECT_EQ(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
                 GoogleServiceAuthError::InvalidGaiaCredentialsReason::
                     CREDENTIALS_MISSING),
-            oauth2_service_delegate_->GetAuthError("account_id"));
+            oauth2_service_delegate_->GetAuthError(account_id));
   EXPECT_EQ(1, end_batch_changes_);
   EXPECT_EQ(1, auth_error_changed_count_);
 
@@ -477,7 +477,7 @@
   // Perform a load from an empty DB.
   EXPECT_EQ(signin::LoadCredentialsState::LOAD_CREDENTIALS_NOT_STARTED,
             oauth2_service_delegate_->load_credentials_state());
-  oauth2_service_delegate_->LoadCredentials("");
+  oauth2_service_delegate_->LoadCredentials(CoreAccountId());
   EXPECT_EQ(signin::LoadCredentialsState::LOAD_CREDENTIALS_IN_PROGRESS,
             oauth2_service_delegate_->load_credentials_state());
   base::RunLoop().RunUntilIdle();
@@ -500,7 +500,7 @@
   EXPECT_EQ(2, auth_error_changed_count_);
   ResetObserverCounts();
 
-  oauth2_service_delegate_->LoadCredentials("");
+  oauth2_service_delegate_->LoadCredentials(CoreAccountId());
   EXPECT_EQ(signin::LoadCredentialsState::LOAD_CREDENTIALS_IN_PROGRESS,
             oauth2_service_delegate_->load_credentials_state());
   base::RunLoop().RunUntilIdle();
@@ -537,14 +537,14 @@
 
   // Add incomplete accounts info to the account tracker.
   AccountInfo account_info_consummer;
-  account_info_consummer.account_id = "consummer";
+  account_info_consummer.account_id = CoreAccountId("consummer");
   account_info_consummer.gaia = "consummer";
   // gmail.com is known as a non-enterprise domain.
   account_info_consummer.email = "consummer@gmail.com";
   account_tracker_service_.SeedAccountInfo(account_info_consummer);
 
   AccountInfo account_info_enterprise;
-  account_info_enterprise.account_id = "enterprise";
+  account_info_enterprise.account_id = CoreAccountId("enterprise");
   account_info_enterprise.gaia = "enterprise";
   account_info_enterprise.email = "enterprise@email.com";
   account_tracker_service_.SeedAccountInfo(account_info_enterprise);
@@ -720,7 +720,7 @@
   AddAuthTokenManually("AccountId-" + primary_account.account_id.id,
                        "refresh_token");
 
-  oauth2_service_delegate_->LoadCredentials(std::string());
+  oauth2_service_delegate_->LoadCredentials(CoreAccountId());
   base::RunLoop().RunUntilIdle();
 
   EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(
@@ -742,7 +742,7 @@
   // Shutdown the database to trigger a database read error.
   token_web_data_->ShutdownDatabase();
 
-  oauth2_service_delegate_->LoadCredentials(std::string());
+  oauth2_service_delegate_->LoadCredentials(CoreAccountId());
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(0u, oauth2_service_delegate_->GetAccounts().size());
@@ -762,7 +762,8 @@
   AddAuthTokenManually("AccountId-67890", "refresh_token");
 
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDisabled);
-  oauth2_service_delegate_->LoadCredentials(/*primary_account_id=*/"");
+  oauth2_service_delegate_->LoadCredentials(
+      /*primary_account_id=*/CoreAccountId());
   base::RunLoop().RunUntilIdle();
 
   // No tokens were loaded.
@@ -1004,7 +1005,8 @@
             "refresh_token1");
   EXPECT_EQ(oauth2_service_delegate_->GetTokenForMultilogin(account_id2),
             std::string());
-  EXPECT_EQ(oauth2_service_delegate_->GetTokenForMultilogin("unknown account"),
+  EXPECT_EQ(oauth2_service_delegate_->GetTokenForMultilogin(
+                CoreAccountId("unknown account")),
             std::string());
 }
 
@@ -1126,14 +1128,15 @@
 
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, ResetBackoff) {
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDisabled);
-  oauth2_service_delegate_->UpdateCredentials(kEmail, "refreshToken");
+  const CoreAccountId account_id("account_id");
+  oauth2_service_delegate_->UpdateCredentials(account_id, "refreshToken");
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            oauth2_service_delegate_->GetAuthError(kEmail));
+            oauth2_service_delegate_->GetAuthError(account_id));
 
   GoogleServiceAuthError authfail(GoogleServiceAuthError::SERVICE_UNAVAILABLE);
-  oauth2_service_delegate_->UpdateAuthError(kEmail, authfail);
+  oauth2_service_delegate_->UpdateAuthError(account_id, authfail);
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            oauth2_service_delegate_->GetAuthError(kEmail));
+            oauth2_service_delegate_->GetAuthError(account_id));
 
   // Create a "success" fetch we don't expect to get called just yet.
   AddSuccessfulOAuhTokenResponse();
@@ -1145,7 +1148,7 @@
   scope_list.push_back("scope");
   std::unique_ptr<OAuth2AccessTokenFetcher> fetcher1 =
       oauth2_service_delegate_->CreateAccessTokenFetcher(
-          kEmail, oauth2_service_delegate_->GetURLLoaderFactory(), this);
+          account_id, oauth2_service_delegate_->GetURLLoaderFactory(), this);
   fetcher1->Start("foo", "bar", scope_list);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(0, access_token_success_count_);
@@ -1156,7 +1159,7 @@
       network::mojom::ConnectionType::CONNECTION_WIFI);
   std::unique_ptr<OAuth2AccessTokenFetcher> fetcher2 =
       oauth2_service_delegate_->CreateAccessTokenFetcher(
-          kEmail, oauth2_service_delegate_->GetURLLoaderFactory(), this);
+          account_id, oauth2_service_delegate_->GetURLLoaderFactory(), this);
   fetcher2->Start("foo", "bar", scope_list);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, access_token_success_count_);
@@ -1174,11 +1177,12 @@
 
   oauth2_service_delegate_->LoadAllCredentialsIntoMemory(tokens);
 
-  EXPECT_TRUE(
-      oauth2_service_delegate_->RefreshTokenIsAvailable("user@gmail.com"));
-  EXPECT_TRUE(
-      oauth2_service_delegate_->RefreshTokenIsAvailable("foobar@gmail.com"));
-  EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable("12345"));
+  EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(
+      CoreAccountId("user@gmail.com")));
+  EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(
+      CoreAccountId("foobar@gmail.com")));
+  EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(
+      CoreAccountId("12345")));
 }
 
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest,
@@ -1193,11 +1197,12 @@
   oauth2_service_delegate_->LoadAllCredentialsIntoMemory(tokens);
 
   EXPECT_EQ(1u, oauth2_service_delegate_->GetAccounts().size());
-  EXPECT_TRUE(
-      oauth2_service_delegate_->RefreshTokenIsAvailable("foobar@gmail.com"));
-  EXPECT_STREQ(
-      "good_token",
-      oauth2_service_delegate_->GetRefreshToken("foobar@gmail.com").c_str());
+  EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(
+      CoreAccountId("foobar@gmail.com")));
+  EXPECT_STREQ("good_token",
+               oauth2_service_delegate_
+                   ->GetRefreshToken(CoreAccountId("foobar@gmail.com"))
+                   .c_str());
 }
 
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, ShutdownService) {
@@ -1226,6 +1231,8 @@
       AccountTrackerService::MIGRATION_NOT_STARTED) {
     std::string email = "foo@gmail.com";
     std::string gaia_id = "foo's gaia id";
+    const CoreAccountId acc_id_email(email);
+    const CoreAccountId acc_id_gaia_id(gaia_id);
 
     pref_service_.SetInteger(prefs::kAccountIdMigrationState,
                              AccountTrackerService::MIGRATION_NOT_STARTED);
@@ -1241,7 +1248,7 @@
     account_tracker_service_.Initialize(&pref_service_, base::FilePath());
 
     AddAuthTokenManually("AccountId-" + email, "refresh_token");
-    oauth2_service_delegate_->LoadCredentials(gaia_id);
+    oauth2_service_delegate_->LoadCredentials(acc_id_gaia_id);
     base::RunLoop().RunUntilIdle();
 
     EXPECT_EQ(1, tokens_loaded_count_);
@@ -1252,22 +1259,26 @@
         oauth2_service_delegate_->GetAccounts();
     EXPECT_EQ(1u, accounts.size());
 
-    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(email));
-    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(gaia_id));
+    EXPECT_FALSE(
+        oauth2_service_delegate_->RefreshTokenIsAvailable(acc_id_email));
+    EXPECT_TRUE(
+        oauth2_service_delegate_->RefreshTokenIsAvailable(acc_id_gaia_id));
 
     account_tracker_service_.SetMigrationDone();
     oauth2_service_delegate_->Shutdown();
     ResetObserverCounts();
 
-    oauth2_service_delegate_->LoadCredentials(gaia_id);
+    oauth2_service_delegate_->LoadCredentials(acc_id_gaia_id);
     base::RunLoop().RunUntilIdle();
 
     EXPECT_EQ(1, tokens_loaded_count_);
     EXPECT_EQ(1, token_available_count_);
     EXPECT_EQ(1, end_batch_changes_);
 
-    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(email));
-    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(gaia_id));
+    EXPECT_FALSE(
+        oauth2_service_delegate_->RefreshTokenIsAvailable(acc_id_email));
+    EXPECT_TRUE(
+        oauth2_service_delegate_->RefreshTokenIsAvailable(acc_id_gaia_id));
     accounts = oauth2_service_delegate_->GetAccounts();
     EXPECT_EQ(1u, accounts.size());
   }
@@ -1282,6 +1293,10 @@
     std::string gaia_id1 = "foo's gaia id";
     std::string email2 = "bar@gmail.com";
     std::string gaia_id2 = "bar's gaia id";
+    const CoreAccountId acc_email1(email1);
+    const CoreAccountId acc_email2(email2);
+    const CoreAccountId acc_gaia1(gaia_id1);
+    const CoreAccountId acc_gaia2(gaia_id2);
 
     pref_service_.SetInteger(prefs::kAccountIdMigrationState,
                              AccountTrackerService::MIGRATION_NOT_STARTED);
@@ -1304,7 +1319,7 @@
     AddAuthTokenManually("AccountId-" + email1, "refresh_token");
     AddAuthTokenManually("AccountId-" + email2, "refresh_token");
     AddAuthTokenManually("AccountId-" + gaia_id1, "refresh_token");
-    oauth2_service_delegate_->LoadCredentials(gaia_id1);
+    oauth2_service_delegate_->LoadCredentials(acc_gaia1);
     base::RunLoop().RunUntilIdle();
 
     EXPECT_EQ(1, tokens_loaded_count_);
@@ -1315,26 +1330,26 @@
         oauth2_service_delegate_->GetAccounts();
     EXPECT_EQ(2u, accounts.size());
 
-    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(email1));
-    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(gaia_id1));
-    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(email2));
-    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(gaia_id2));
+    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(acc_email1));
+    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(acc_gaia1));
+    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(acc_email2));
+    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(acc_gaia2));
 
     account_tracker_service_.SetMigrationDone();
     oauth2_service_delegate_->Shutdown();
     ResetObserverCounts();
 
-    oauth2_service_delegate_->LoadCredentials(gaia_id1);
+    oauth2_service_delegate_->LoadCredentials(acc_gaia1);
     base::RunLoop().RunUntilIdle();
 
     EXPECT_EQ(1, tokens_loaded_count_);
     EXPECT_EQ(2, token_available_count_);
     EXPECT_EQ(1, end_batch_changes_);
 
-    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(email1));
-    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(gaia_id1));
-    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(email2));
-    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(gaia_id2));
+    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(acc_email1));
+    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(acc_gaia1));
+    EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(acc_email2));
+    EXPECT_TRUE(oauth2_service_delegate_->RefreshTokenIsAvailable(acc_gaia2));
     accounts = oauth2_service_delegate_->GetAccounts();
     EXPECT_EQ(2u, accounts.size());
   }
@@ -1343,13 +1358,13 @@
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest,
        LoadPrimaryAccountOnlyWhenAccountConsistencyDisabled) {
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDisabled);
-  std::string primary_account = "primaryaccount";
-  std::string secondary_account = "secondaryaccount";
+  CoreAccountId primary_account("primaryaccount");
+  CoreAccountId secondary_account("secondaryaccount");
 
   oauth2_service_delegate_->RevokeAllCredentials();
   ResetObserverCounts();
-  AddAuthTokenManually("AccountId-" + primary_account, "refresh_token");
-  AddAuthTokenManually("AccountId-" + secondary_account, "refresh_token");
+  AddAuthTokenManually("AccountId-" + primary_account.id, "refresh_token");
+  AddAuthTokenManually("AccountId-" + secondary_account.id, "refresh_token");
   oauth2_service_delegate_->LoadCredentials(primary_account);
   base::RunLoop().RunUntilIdle();
 
@@ -1366,13 +1381,13 @@
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest,
        LoadSecondaryAccountsWhenMirrorEnabled) {
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kMirror);
-  std::string primary_account = "primaryaccount";
-  std::string secondary_account = "secondaryaccount";
+  CoreAccountId primary_account("primaryaccount");
+  CoreAccountId secondary_account("secondaryaccount");
 
   oauth2_service_delegate_->RevokeAllCredentials();
   ResetObserverCounts();
-  AddAuthTokenManually("AccountId-" + primary_account, "refresh_token");
-  AddAuthTokenManually("AccountId-" + secondary_account, "refresh_token");
+  AddAuthTokenManually("AccountId-" + primary_account.id, "refresh_token");
+  AddAuthTokenManually("AccountId-" + secondary_account.id, "refresh_token");
   oauth2_service_delegate_->LoadCredentials(primary_account);
   base::RunLoop().RunUntilIdle();
 
@@ -1399,11 +1414,11 @@
     void OnAuthErrorChanged(const CoreAccountId& account_id,
                             const GoogleServiceAuthError& auth_error) override {
       error_changed_ = true;
-      EXPECT_EQ("account_id", account_id);
+      EXPECT_EQ("account_id", account_id.id);
       EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), auth_error);
-      EXPECT_TRUE(delegate_->RefreshTokenIsAvailable("account_id"));
+      EXPECT_TRUE(delegate_->RefreshTokenIsAvailable(account_id));
       EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-                delegate_->GetAuthError("account_id"));
+                delegate_->GetAuthError(account_id));
     }
 
     MutableProfileOAuth2TokenServiceDelegate* delegate_;
@@ -1417,14 +1432,15 @@
   // Start with the SigninErrorController in error state, so that it calls
   // OnErrorChanged() from AddProvider().
   oauth2_service_delegate_->UpdateCredentials(
-      "error_account_id", GaiaConstants::kInvalidRefreshToken);
+      CoreAccountId("error_account_id"), GaiaConstants::kInvalidRefreshToken);
 
   TokenServiceErrorObserver token_service_observer(
       oauth2_service_delegate_.get());
   oauth2_service_delegate_->AddObserver(&token_service_observer);
 
   ASSERT_FALSE(token_service_observer.error_changed_);
-  oauth2_service_delegate_->UpdateCredentials("account_id", "token");
+  oauth2_service_delegate_->UpdateCredentials(CoreAccountId("account_id"),
+                                              "token");
   EXPECT_TRUE(token_service_observer.error_changed_);
 
   oauth2_service_delegate_->RemoveObserver(&token_service_observer);
@@ -1433,26 +1449,29 @@
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, GetAuthError) {
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDisabled);
   // Accounts have no error by default.
-  oauth2_service_delegate_->UpdateCredentials("account_id", "refresh_token");
+  const CoreAccountId account_id("account_id");
+  const CoreAccountId account_id_2("account_id_2");
+
+  oauth2_service_delegate_->UpdateCredentials(account_id, "refresh_token");
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            oauth2_service_delegate_->GetAuthError("account_id"));
+            oauth2_service_delegate_->GetAuthError(account_id));
   // Update the error.
   GoogleServiceAuthError error =
       GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
           GoogleServiceAuthError::InvalidGaiaCredentialsReason::
               CREDENTIALS_REJECTED_BY_SERVER);
-  oauth2_service_delegate_->UpdateAuthError("account_id", error);
-  EXPECT_EQ(error, oauth2_service_delegate_->GetAuthError("account_id"));
+  oauth2_service_delegate_->UpdateAuthError(account_id, error);
+  EXPECT_EQ(error, oauth2_service_delegate_->GetAuthError(account_id));
   // Unknown account has no error.
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            oauth2_service_delegate_->GetAuthError("foo"));
+            oauth2_service_delegate_->GetAuthError(CoreAccountId("foo")));
   // Add account with invalid token.
   oauth2_service_delegate_->UpdateCredentials(
-      "account_id_2", GaiaConstants::kInvalidRefreshToken);
+      account_id_2, GaiaConstants::kInvalidRefreshToken);
   EXPECT_EQ(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
                 GoogleServiceAuthError::InvalidGaiaCredentialsReason::
                     CREDENTIALS_REJECTED_BY_CLIENT),
-            oauth2_service_delegate_->GetAuthError("account_id_2"));
+            oauth2_service_delegate_->GetAuthError(account_id_2));
 }
 
 // Checks that OnAuthErrorChanged() is called before OnRefreshTokenAvailable,
@@ -1483,12 +1502,12 @@
     }
 
     void CheckTokenState(const CoreAccountId& account_id) {
-      EXPECT_EQ("account_id", account_id);
-      EXPECT_TRUE(delegate_->RefreshTokenIsAvailable("account_id"));
+      EXPECT_EQ("account_id", account_id.id);
+      EXPECT_TRUE(delegate_->RefreshTokenIsAvailable(account_id));
       EXPECT_EQ(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
                     GoogleServiceAuthError::InvalidGaiaCredentialsReason::
                         CREDENTIALS_REJECTED_BY_CLIENT),
-                delegate_->GetAuthError("account_id"));
+                delegate_->GetAuthError(account_id));
     }
 
     MutableProfileOAuth2TokenServiceDelegate* delegate_;
@@ -1503,7 +1522,7 @@
       oauth2_service_delegate_.get());
   oauth2_service_delegate_->AddObserver(&token_service_observer);
   oauth2_service_delegate_->UpdateCredentials(
-      "account_id", GaiaConstants::kInvalidRefreshToken);
+      CoreAccountId("account_id"), GaiaConstants::kInvalidRefreshToken);
   EXPECT_TRUE(token_service_observer.token_available_);
   EXPECT_TRUE(token_service_observer.error_changed_);
   oauth2_service_delegate_->RemoveObserver(&token_service_observer);
@@ -1515,13 +1534,13 @@
   client_->SetNetworkCallsDelayed(true);
   revoke_all_tokens_on_load_ = true;
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDisabled);
-  std::string primary_account = "primaryaccount";
-  std::string secondary_account = "secondaryaccount";
+  CoreAccountId primary_account("primaryaccount");
+  CoreAccountId secondary_account("secondaryaccount");
 
   oauth2_service_delegate_->RevokeAllCredentials();
   ResetObserverCounts();
-  AddAuthTokenManually("AccountId-" + primary_account, "refresh_token");
-  AddAuthTokenManually("AccountId-" + secondary_account, "refresh_token");
+  AddAuthTokenManually("AccountId-" + primary_account.id, "refresh_token");
+  AddAuthTokenManually("AccountId-" + secondary_account.id, "refresh_token");
   oauth2_service_delegate_->LoadCredentials(primary_account);
   base::RunLoop().RunUntilIdle();
 
@@ -1568,6 +1587,7 @@
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest,
        SourceForRefreshTokenOperations) {
   using Source = signin_metrics::SourceForRefreshTokenOperation;
+  const CoreAccountId account_id("account_id");
 
   ProfileOAuth2TokenService::RegisterProfilePrefs(pref_service_.registry());
   ProfileOAuth2TokenService token_service(
@@ -1585,7 +1605,7 @@
   {
     base::HistogramTester h_tester;
     AddAuthTokenManually("account_id", "refresh_token");
-    token_service.LoadCredentials("account_id");
+    token_service.LoadCredentials(account_id);
     base::RunLoop().RunUntilIdle();
 
     EXPECT_EQ("TokenService::LoadCredentials",
@@ -1597,7 +1617,7 @@
 
   {
     base::HistogramTester h_tester;
-    token_service.UpdateCredentials("account_id", "refresh_token",
+    token_service.UpdateCredentials(account_id, "refresh_token",
                                     Source::kInlineLoginHandler_Signin);
     EXPECT_EQ("InlineLoginHandler::Signin",
               source_for_refresh_token_available_);
@@ -1606,7 +1626,7 @@
         Source::kInlineLoginHandler_Signin, 1);
 
     token_service.RevokeCredentials(
-        "account_id", Source::kAccountReconcilor_GaiaCookiesUpdated);
+        account_id, Source::kAccountReconcilor_GaiaCookiesUpdated);
     EXPECT_EQ("AccountReconcilor::GaiaCookiesUpdated",
               source_for_refresh_token_revoked_);
     h_tester.ExpectUniqueSample("Signin.RefreshTokenRevoked.Source",
@@ -1617,7 +1637,8 @@
 
   {
     base::HistogramTester h_tester;
-    token_service.UpdateCredentials("account_id_1", "refresh_token",
+    token_service.UpdateCredentials(CoreAccountId("account_id_1"),
+                                    "refresh_token",
                                     Source::kDiceResponseHandler_Signin);
     EXPECT_EQ("DiceResponseHandler::Signin",
               source_for_refresh_token_available_);
@@ -1625,7 +1646,7 @@
         "Signin.RefreshTokenUpdated.ToValidToken.Source",
         Source::kDiceResponseHandler_Signin, 1);
 
-    token_service.UpdateCredentials("account_id_2",
+    token_service.UpdateCredentials(CoreAccountId("account_id_2"),
                                     GaiaConstants::kInvalidRefreshToken,
                                     Source::kDiceResponseHandler_Signin);
     EXPECT_EQ("DiceResponseHandler::Signin",
@@ -1647,7 +1668,8 @@
 
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, ExtractCredentials) {
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDice);
-  oauth2_service_delegate_->LoadCredentials(std::string());
+  oauth2_service_delegate_->LoadCredentials(CoreAccountId());
+  const CoreAccountId account_id("account_id");
 
   // Create another token service
   sync_preferences::TestingPrefServiceSyncable prefs;
@@ -1656,19 +1678,19 @@
       std::make_unique<FakeProfileOAuth2TokenServiceDelegate>();
   FakeProfileOAuth2TokenServiceDelegate* other_delegate = delegate.get();
   ProfileOAuth2TokenService other_token_service(&prefs, std::move(delegate));
-  other_token_service.LoadCredentials(std::string());
+  other_token_service.LoadCredentials(CoreAccountId());
 
   // Add credentials to the first token service delegate.
-  oauth2_service_delegate_->UpdateCredentials("account_id", "token");
+  oauth2_service_delegate_->UpdateCredentials(account_id, "token");
 
   // Extract the credentials.
   ResetObserverCounts();
   oauth2_service_delegate_->ExtractCredentials(&other_token_service,
-                                               "account_id");
+                                               account_id);
 
   EXPECT_EQ(1, token_revoked_count_);
   EXPECT_TRUE(oauth2_service_delegate_->server_revokes_.empty());
-  EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable("account_id"));
-  EXPECT_TRUE(other_delegate->RefreshTokenIsAvailable("account_id"));
-  EXPECT_EQ("token", other_delegate->GetRefreshToken("account_id"));
+  EXPECT_FALSE(oauth2_service_delegate_->RefreshTokenIsAvailable(account_id));
+  EXPECT_TRUE(other_delegate->RefreshTokenIsAvailable(account_id));
+  EXPECT_EQ("token", other_delegate->GetRefreshToken(account_id));
 }
diff --git a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
index b6b3a4dd..08cf2fa 100644
--- a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
+++ b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
@@ -211,9 +211,9 @@
 TEST_F(PrimaryAccountManagerTest, SignOutDiceWithError) {
   account_consistency_ = signin::AccountConsistencyMethod::kDice;
   CreatePrimaryAccountManager();
-  std::string main_account_id =
+  CoreAccountId main_account_id =
       AddToAccountTracker("main_id", "user@gmail.com");
-  std::string other_account_id =
+  CoreAccountId other_account_id =
       AddToAccountTracker("other_id", "other@gmail.com");
   token_service_.UpdateCredentials(main_account_id, "token");
   token_service_.UpdateCredentials(other_account_id, "token");
@@ -257,19 +257,19 @@
 }
 
 TEST_F(PrimaryAccountManagerTest, ProhibitedAtStartup) {
-  std::string account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
-  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id);
+  CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
+  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.id);
   local_state_.SetString(prefs::kGoogleServicesUsernamePattern,
                          ".*@google.com");
   CreatePrimaryAccountManager();
   // Currently signed in user is prohibited by policy, so should be signed out.
   EXPECT_EQ("", manager_->GetAuthenticatedAccountInfo().email);
-  EXPECT_EQ("", manager_->GetAuthenticatedAccountId());
+  EXPECT_EQ(CoreAccountId(), manager_->GetAuthenticatedAccountId());
 }
 
 TEST_F(PrimaryAccountManagerTest, ProhibitedAfterStartup) {
-  std::string account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
-  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id);
+  CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
+  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.id);
   CreatePrimaryAccountManager();
   EXPECT_EQ("user@gmail.com", manager_->GetAuthenticatedAccountInfo().email);
   EXPECT_EQ(account_id, manager_->GetAuthenticatedAccountId());
@@ -277,18 +277,18 @@
   local_state_.SetString(prefs::kGoogleServicesUsernamePattern,
                          ".*@google.com");
   EXPECT_EQ("", manager_->GetAuthenticatedAccountInfo().email);
-  EXPECT_EQ("", manager_->GetAuthenticatedAccountId());
+  EXPECT_EQ(CoreAccountId(), manager_->GetAuthenticatedAccountId());
 }
 #endif
 
 TEST_F(PrimaryAccountManagerTest, SignIn) {
   CreatePrimaryAccountManager();
   EXPECT_EQ("", manager_->GetAuthenticatedAccountInfo().email);
-  EXPECT_EQ("", manager_->GetAuthenticatedAccountId());
+  EXPECT_EQ(CoreAccountId(), manager_->GetAuthenticatedAccountId());
   EXPECT_EQ(0, num_successful_signins_);
   EXPECT_EQ(0, num_unconsented_account_changed_);
 
-  std::string account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
+  CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
   manager_->SignIn("user@gmail.com");
   EXPECT_EQ(1, num_successful_signins_);
   EXPECT_EQ(1, num_unconsented_account_changed_);
@@ -302,11 +302,11 @@
        ExternalSignIn_ReauthShouldNotSendNotification) {
   CreatePrimaryAccountManager();
   EXPECT_EQ("", manager_->GetAuthenticatedAccountInfo().email);
-  EXPECT_EQ("", manager_->GetAuthenticatedAccountId());
+  EXPECT_EQ(CoreAccountId(), manager_->GetAuthenticatedAccountId());
   EXPECT_EQ(0, num_successful_signins_);
   EXPECT_EQ(0, num_unconsented_account_changed_);
 
-  std::string account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
+  CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
   manager_->SignIn("user@gmail.com");
   EXPECT_EQ(1, num_successful_signins_);
   EXPECT_EQ(1, num_unconsented_account_changed_);
@@ -323,13 +323,13 @@
 #if !defined(OS_CHROMEOS)
 TEST_F(PrimaryAccountManagerTest, SigninNotAllowed) {
   std::string user("user@google.com");
-  std::string account_id = AddToAccountTracker("gaia_id", user);
-  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id);
+  CoreAccountId account_id = AddToAccountTracker("gaia_id", user);
+  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.id);
   user_prefs_.SetBoolean(prefs::kSigninAllowed, false);
   CreatePrimaryAccountManager();
   // Currently signing in is prohibited by policy, so should be signed out.
   EXPECT_EQ("", manager_->GetAuthenticatedAccountInfo().email);
-  EXPECT_EQ("", manager_->GetAuthenticatedAccountId());
+  EXPECT_TRUE(manager_->GetAuthenticatedAccountId().empty());
 }
 #endif
 
@@ -357,7 +357,7 @@
 
     CreatePrimaryAccountManager();
 
-    EXPECT_EQ(gaia_id, manager_->GetAuthenticatedAccountId());
+    EXPECT_EQ(CoreAccountId(gaia_id), manager_->GetAuthenticatedAccountId());
     EXPECT_EQ(gaia_id, user_prefs_.GetString(prefs::kGoogleServicesAccountId));
   }
 }
@@ -385,7 +385,7 @@
     client_prefs->SetString(prefs::kGoogleServicesAccountId, gaia_id);
 
     CreatePrimaryAccountManager();
-    EXPECT_EQ(gaia_id, manager_->GetAuthenticatedAccountId());
+    EXPECT_EQ(CoreAccountId(gaia_id), manager_->GetAuthenticatedAccountId());
     EXPECT_EQ(gaia_id, user_prefs_.GetString(prefs::kGoogleServicesAccountId));
 
     base::RunLoop().RunUntilIdle();
@@ -396,23 +396,23 @@
 
 TEST_F(PrimaryAccountManagerTest, RestoreFromPrefsConsented) {
   CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
-  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id);
+  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.id);
   user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, true);
   CreatePrimaryAccountManager();
   EXPECT_EQ("user@gmail.com", manager_->GetAuthenticatedAccountInfo().email);
-  EXPECT_EQ(account_id.id, manager_->GetAuthenticatedAccountId());
+  EXPECT_EQ(account_id, manager_->GetAuthenticatedAccountId());
   EXPECT_EQ(manager_->GetUnconsentedPrimaryAccountInfo(),
             manager_->GetAuthenticatedAccountInfo());
 }
 
 TEST_F(PrimaryAccountManagerTest, RestoreFromPrefsUnconsented) {
   CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
-  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id);
+  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.id);
   user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, false);
   CreatePrimaryAccountManager();
   EXPECT_EQ("user@gmail.com",
             manager_->GetUnconsentedPrimaryAccountInfo().email);
-  EXPECT_EQ(account_id.id,
+  EXPECT_EQ(account_id,
             manager_->GetUnconsentedPrimaryAccountInfo().account_id);
   EXPECT_TRUE(manager_->GetAuthenticatedAccountInfo().IsEmpty());
 }
@@ -421,7 +421,7 @@
 // authenticated.
 TEST_F(PrimaryAccountManagerTest, RestoreFromPrefsMissingConsentPref) {
   CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
-  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id);
+  user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.id);
 
   const PrefService::Preference* consented_pref =
       user_prefs_.FindPreference(prefs::kGoogleServicesConsentedToSync);
@@ -431,7 +431,7 @@
   CreatePrimaryAccountManager();
   EXPECT_TRUE(user_prefs_.GetBoolean(prefs::kGoogleServicesConsentedToSync));
   EXPECT_EQ("user@gmail.com", manager_->GetAuthenticatedAccountInfo().email);
-  EXPECT_EQ(account_id.id, manager_->GetAuthenticatedAccountId());
+  EXPECT_EQ(account_id, manager_->GetAuthenticatedAccountId());
   EXPECT_EQ(manager_->GetUnconsentedPrimaryAccountInfo(),
             manager_->GetAuthenticatedAccountInfo());
 }
diff --git a/components/signin/internal/identity_manager/profile_oauth2_token_service_unittest.cc b/components/signin/internal/identity_manager/profile_oauth2_token_service_unittest.cc
index 50dfc691..1be0ec3 100644
--- a/components/signin/internal/identity_manager/profile_oauth2_token_service_unittest.cc
+++ b/components/signin/internal/identity_manager/profile_oauth2_token_service_unittest.cc
@@ -682,14 +682,14 @@
   const CoreAccountId account_id0("0");
   const CoreAccountId account_id1("1");
   OAuth2AccessTokenManager::RequestParameters params[] = {
-      OAuth2AccessTokenManager::RequestParameters("0", "0", set_0),
-      OAuth2AccessTokenManager::RequestParameters("0", "0", set_1),
-      OAuth2AccessTokenManager::RequestParameters("0", "1", set_0),
-      OAuth2AccessTokenManager::RequestParameters("0", "1", set_1),
-      OAuth2AccessTokenManager::RequestParameters("1", "0", set_0),
-      OAuth2AccessTokenManager::RequestParameters("1", "0", set_1),
-      OAuth2AccessTokenManager::RequestParameters("1", "1", set_0),
-      OAuth2AccessTokenManager::RequestParameters("1", "1", set_1),
+      OAuth2AccessTokenManager::RequestParameters("0", account_id0, set_0),
+      OAuth2AccessTokenManager::RequestParameters("0", account_id0, set_1),
+      OAuth2AccessTokenManager::RequestParameters("0", account_id1, set_0),
+      OAuth2AccessTokenManager::RequestParameters("0", account_id1, set_1),
+      OAuth2AccessTokenManager::RequestParameters("1", account_id0, set_0),
+      OAuth2AccessTokenManager::RequestParameters("1", account_id0, set_1),
+      OAuth2AccessTokenManager::RequestParameters("1", account_id1, set_0),
+      OAuth2AccessTokenManager::RequestParameters("1", account_id1, set_1),
   };
 
   for (size_t i = 0; i < base::size(params); i++) {
diff --git a/components/signin/internal/identity_manager/ubertoken_fetcher_impl_unittest.cc b/components/signin/internal/identity_manager/ubertoken_fetcher_impl_unittest.cc
index 4e28f6dea..94b8215 100644
--- a/components/signin/internal/identity_manager/ubertoken_fetcher_impl_unittest.cc
+++ b/components/signin/internal/identity_manager/ubertoken_fetcher_impl_unittest.cc
@@ -57,7 +57,7 @@
             base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
                 &url_loader_factory_)) {
     fetcher_ = std::make_unique<signin::UbertokenFetcherImpl>(
-        kTestAccountId, &token_service_,
+        CoreAccountId(kTestAccountId), &token_service_,
         base::BindOnce(&MockUbertokenConsumer::OnUbertokenFetchComplete,
                        base::Unretained(&consumer_)),
         gaia::GaiaSource::kChrome, test_shared_loader_factory_);
diff --git a/components/signin/public/identity_manager/access_token_fetcher_unittest.cc b/components/signin/public/identity_manager/access_token_fetcher_unittest.cc
index a9faaa18..c541f24 100644
--- a/components/signin/public/identity_manager/access_token_fetcher_unittest.cc
+++ b/components/signin/public/identity_manager/access_token_fetcher_unittest.cc
@@ -69,13 +69,14 @@
     token_service_.RemoveAccessTokenDiagnosticsObserver(this);
   }
 
-  std::string AddAccount(const std::string& gaia_id, const std::string& email) {
+  CoreAccountId AddAccount(const std::string& gaia_id,
+                           const std::string& email) {
     account_tracker()->SeedAccountInfo(gaia_id, email);
     return account_tracker()->FindAccountInfoByGaiaId(gaia_id).account_id;
   }
 
   std::unique_ptr<AccessTokenFetcher> CreateFetcher(
-      const std::string& account_id,
+      const CoreAccountId& account_id,
       AccessTokenFetcher::TokenCallback callback,
       AccessTokenFetcher::Mode mode) {
     std::set<std::string> scopes{"scope"};
@@ -85,7 +86,7 @@
   }
 
   std::unique_ptr<AccessTokenFetcher> CreateFetcherWithURLLoaderFactory(
-      const std::string& account_id,
+      const CoreAccountId& account_id,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       AccessTokenFetcher::TokenCallback callback,
       AccessTokenFetcher::Mode mode) {
@@ -132,7 +133,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // This should result in a request for an access token.
@@ -160,7 +161,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // Since the refresh token is already available, this should result in an
@@ -190,7 +191,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
 
   // Since the refresh token is not available yet, this should just start
   // waiting for it.
@@ -231,8 +232,8 @@
   MockCallback<base::OnceClosure> access_token_request_callback;
   set_on_access_token_request_callback(access_token_request_callback.Get());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
-  std::string other_account_id = AddAccount(kTestGaiaId2, kTestEmail2);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId other_account_id = AddAccount(kTestGaiaId2, kTestEmail2);
 
   // Since the refresh token is not available yet, this should just start
   // waiting for it.
@@ -254,7 +255,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // This should result in a request for an access token.
@@ -280,8 +281,9 @@
   base::RunLoop run_loop;
 
   // Account not present -> we should get called back.
-  auto fetcher = CreateFetcher("dummy_account_id", callback.Get(),
-                               AccessTokenFetcher::Mode::kImmediate);
+  auto fetcher =
+      CreateFetcher(CoreAccountId("dummy_account_id"), callback.Get(),
+                    AccessTokenFetcher::Mode::kImmediate);
 
   EXPECT_CALL(callback,
               Run(GoogleServiceAuthError(
@@ -297,7 +299,7 @@
 
   base::RunLoop run_loop;
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
 
   // Account has no refresh token -> we should get called back.
   auto fetcher = CreateFetcher(account_id, callback.Get(),
@@ -318,7 +320,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // This should result in a request for an access token.
@@ -348,7 +350,7 @@
 
   TestTokenCallback callback;
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // This should result in a request for an access token.
@@ -372,7 +374,7 @@
 
   TestTokenCallback callback;
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // Signed in and refresh token already exists, so this should result in a
@@ -398,7 +400,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // This should result in a request for an access token.
@@ -434,7 +436,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // This should result in a request for an access token.
@@ -444,7 +446,7 @@
   run_loop.Run();
 
   // Add a second account and request an access token for it.
-  std::string account_id2 = AddAccount(kTestGaiaId2, kTestEmail2);
+  CoreAccountId account_id2 = AddAccount(kTestGaiaId2, kTestEmail2);
   token_service()->UpdateCredentials(account_id2, "refresh token");
   TestTokenCallback callback2;
   base::RunLoop run_loop2;
@@ -481,7 +483,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   // This should result in a request for an access token.
@@ -490,7 +492,7 @@
   run_loop.Run();
 
   // Add a second account and request an access token for it.
-  std::string account_id2 = AddAccount(kTestGaiaId2, kTestEmail2);
+  CoreAccountId account_id2 = AddAccount(kTestGaiaId2, kTestEmail2);
   token_service()->UpdateCredentials(account_id2, "refresh token");
 
   base::RunLoop run_loop2;
@@ -535,7 +537,7 @@
   base::RunLoop run_loop;
   set_on_access_token_request_callback(run_loop.QuitClosure());
 
-  std::string account_id = AddAccount(kTestGaiaId, kTestEmail);
+  CoreAccountId account_id = AddAccount(kTestGaiaId, kTestEmail);
   token_service()->UpdateCredentials(account_id, "refresh token");
 
   network::TestURLLoaderFactory test_url_loader_factory;
@@ -577,7 +579,7 @@
   TestTokenCallback callback2;
 
   set_on_access_token_request_callback(run_loop2.QuitClosure());
-  std::string account_id2 = AddAccount(kTestGaiaId2, kTestEmail2);
+  CoreAccountId account_id2 = AddAccount(kTestGaiaId2, kTestEmail2);
   token_service()->UpdateCredentials(account_id2, "refresh token");
 
   // CreateFetcher will create an AccessTokenFetcher without specifying
diff --git a/components/signin/public/identity_manager/account_info_unittest.cc b/components/signin/public/identity_manager/account_info_unittest.cc
index b265a5d..fa6d313 100644
--- a/components/signin/public/identity_manager/account_info_unittest.cc
+++ b/components/signin/public/identity_manager/account_info_unittest.cc
@@ -14,7 +14,7 @@
   }
   {
     AccountInfo info_with_account_id;
-    info_with_account_id.account_id = "test_id";
+    info_with_account_id.account_id = CoreAccountId("test_id");
     EXPECT_FALSE(info_with_account_id.IsEmpty());
   }
   {
@@ -34,7 +34,9 @@
   AccountInfo info;
   EXPECT_FALSE(info.IsValid());
 
-  info.account_id = info.gaia = info.email = "test_id";
+  info.gaia = info.email = "test_id";
+  info.account_id = CoreAccountId("test_id");
+
   EXPECT_FALSE(info.IsValid());
 
   info.full_name = info.given_name = "test_name";
@@ -51,10 +53,11 @@
 // account / id.
 TEST_F(AccountInfoTest, UpdateWithDifferentAccountId) {
   AccountInfo info;
-  info.account_id = "test_id";
+  info.account_id = CoreAccountId("test_id");
 
   AccountInfo other;
-  other.account_id = other.gaia = other.email = "test_other_id";
+  other.gaia = other.email = "test_other_id";
+  other.account_id = CoreAccountId("test_other_id");
 
   EXPECT_FALSE(info.UpdateWith(other));
   EXPECT_TRUE(info.gaia.empty());
@@ -65,11 +68,12 @@
 // to the correct value.
 TEST_F(AccountInfoTest, UpdateWithNoModification) {
   AccountInfo info;
-  info.account_id = info.gaia = info.email = "test_id";
+  info.gaia = info.email = "test_id";
+  info.account_id = CoreAccountId("test_id");
   info.is_child_account = true;
 
   AccountInfo other;
-  other.account_id = "test_id";
+  other.account_id = CoreAccountId("test_id");
   other.gaia = other.email = "test_id";
   other.is_child_account = false;
 
@@ -82,10 +86,11 @@
 // Tests that UpdateWith() correctly updates its fields that were not set.
 TEST_F(AccountInfoTest, UpdateWithSuccessfulUpdate) {
   AccountInfo info;
-  info.account_id = info.gaia = info.email = "test_id";
+  info.gaia = info.email = "test_id";
+  info.account_id = CoreAccountId("test_id");
 
   AccountInfo other;
-  other.account_id = "test_id";
+  other.account_id = CoreAccountId("test_id");
   other.full_name = other.given_name = "test_name";
   other.is_child_account = true;
 
@@ -101,10 +106,11 @@
 // picture_url if the properties are unset.
 TEST_F(AccountInfoTest, UpdateWithDefaultValues) {
   AccountInfo info;
-  info.account_id = info.gaia = info.email = "test_id";
+  info.gaia = info.email = "test_id";
+  info.account_id = CoreAccountId("test_id");
 
   AccountInfo other;
-  other.account_id = "test_id";
+  other.account_id = CoreAccountId("test_id");
   other.hosted_domain = kNoHostedDomainFound;
   other.picture_url = kNoPictureURLFound;
 
@@ -117,12 +123,13 @@
 // picture_url if they are already set.
 TEST_F(AccountInfoTest, UpdateWithDefaultValuesNoOverride) {
   AccountInfo info;
-  info.account_id = info.gaia = info.email = "test_id";
+  info.gaia = info.email = "test_id";
+  info.account_id = CoreAccountId("test_id");
   info.hosted_domain = "test_domain";
   info.picture_url = "test_url";
 
   AccountInfo other;
-  other.account_id = "test_id";
+  other.account_id = CoreAccountId("test_id");
   other.hosted_domain = kNoHostedDomainFound;
   other.picture_url = kNoPictureURLFound;
 
diff --git a/components/signin/public/identity_manager/accounts_cookie_mutator_unittest.cc b/components/signin/public/identity_manager/accounts_cookie_mutator_unittest.cc
index 1d7a232..42dc77d 100644
--- a/components/signin/public/identity_manager/accounts_cookie_mutator_unittest.cc
+++ b/components/signin/public/identity_manager/accounts_cookie_mutator_unittest.cc
@@ -31,8 +31,6 @@
 
 namespace {
 
-const char kTestUnavailableAccountId[] = "unavailable_account_id";
-const char kTestOtherUnavailableAccountId[] = "other_unavailable_account_id";
 const char kTestAccountEmail[] = "test_user@test.com";
 const char kTestOtherAccountEmail[] = "test_other_user@test.com";
 const char kTestAccountGaiaId[] = "gaia_id_for_test_user_test.com";
@@ -63,8 +61,13 @@
 namespace signin {
 class AccountsCookieMutatorTest : public testing::Test {
  public:
+  const CoreAccountId kTestUnavailableAccountId;
+  const CoreAccountId kTestOtherUnavailableAccountId;
+
   AccountsCookieMutatorTest()
-      : test_signin_client_(&prefs_),
+      : kTestUnavailableAccountId("unavailable_account_id"),
+        kTestOtherUnavailableAccountId("other_unavailable_account_id"),
+        test_signin_client_(&prefs_),
         identity_test_env_(/*test_url_loader_factory=*/nullptr,
                            &prefs_,
                            AccountConsistencyMethod::kDisabled,
@@ -73,7 +76,7 @@
   ~AccountsCookieMutatorTest() override {}
 
   // Make an account available and returns the account ID.
-  std::string AddAcountWithRefreshToken(const std::string& email) {
+  CoreAccountId AddAcountWithRefreshToken(const std::string& email) {
     return identity_test_env_.MakeAccountAvailable(email).account_id;
   }
 
@@ -155,7 +158,7 @@
 // results in an error due to such account not being available.
 TEST_F(AccountsCookieMutatorTest, AddAccountToCookie_NonExistingAccount) {
   base::RunLoop run_loop;
-  std::string account_id_from_add_account_to_cookie_completed_callback;
+  CoreAccountId account_id_from_add_account_to_cookie_completed_callback;
   GoogleServiceAuthError error_from_add_account_to_cookie_completed_callback;
   auto completion_callback =
       base::BindLambdaForTesting([&](const CoreAccountId& account_id,
@@ -185,9 +188,9 @@
   PrepareURLLoaderResponsesForAction(
       AccountsCookiesMutatorAction::kTriggerCookieJarUpdateNoAccounts);
 
-  std::string account_id = AddAcountWithRefreshToken(kTestAccountEmail);
+  CoreAccountId account_id = AddAcountWithRefreshToken(kTestAccountEmail);
   base::RunLoop run_loop;
-  std::string account_id_from_add_account_to_cookie_completed_callback;
+  CoreAccountId account_id_from_add_account_to_cookie_completed_callback;
   GoogleServiceAuthError error_from_add_account_to_cookie_completed_callback;
   auto completion_callback =
       base::BindLambdaForTesting([&](const CoreAccountId& account_id,
@@ -219,7 +222,7 @@
       AccountsCookiesMutatorAction::kAddAccountToCookie);
 
   base::RunLoop run_loop;
-  std::string account_id_from_add_account_to_cookie_completed_callback;
+  CoreAccountId account_id_from_add_account_to_cookie_completed_callback;
   GoogleServiceAuthError error_from_add_account_to_cookie_completed_callback;
   auto completion_callback =
       base::BindLambdaForTesting([&](const CoreAccountId& account_id,
@@ -250,9 +253,9 @@
   PrepareURLLoaderResponsesForAction(
       AccountsCookiesMutatorAction::kTriggerCookieJarUpdateNoAccounts);
 
-  std::string account_id = AddAcountWithRefreshToken(kTestAccountEmail);
+  CoreAccountId account_id = AddAcountWithRefreshToken(kTestAccountEmail);
   base::RunLoop run_loop;
-  std::string account_id_from_add_account_to_cookie_completed_callback;
+  CoreAccountId account_id_from_add_account_to_cookie_completed_callback;
   GoogleServiceAuthError error_from_add_account_to_cookie_completed_callback;
   auto completion_callback =
       base::BindLambdaForTesting([&](const CoreAccountId& account_id,
@@ -305,7 +308,7 @@
   PrepareURLLoaderResponsesForAction(
       AccountsCookiesMutatorAction::kTriggerCookieJarUpdateNoAccounts);
 
-  std::string account_id = AddAcountWithRefreshToken(kTestAccountEmail);
+  CoreAccountId account_id = AddAcountWithRefreshToken(kTestAccountEmail);
   base::RunLoop run_loop;
   MultiloginParameters parameters = {
       gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
@@ -331,8 +334,8 @@
   PrepareURLLoaderResponsesForAction(
       AccountsCookiesMutatorAction::kTriggerCookieJarUpdateNoAccounts);
 
-  std::string account_id = AddAcountWithRefreshToken(kTestAccountEmail);
-  std::string other_account_id =
+  CoreAccountId account_id = AddAcountWithRefreshToken(kTestAccountEmail);
+  CoreAccountId other_account_id =
       AddAcountWithRefreshToken(kTestOtherAccountEmail);
   base::RunLoop run_loop;
   MultiloginParameters parameters = {
diff --git a/components/signin/public/identity_manager/accounts_mutator_unittest.cc b/components/signin/public/identity_manager/accounts_mutator_unittest.cc
index fc3b06e..4b2dafd 100644
--- a/components/signin/public/identity_manager/accounts_mutator_unittest.cc
+++ b/components/signin/public/identity_manager/accounts_mutator_unittest.cc
@@ -40,14 +40,14 @@
     identity_manager_->RemoveDiagnosticsObserver(this);
   }
 
-  const std::string& token_updator_account_id() {
+  const CoreAccountId& token_updator_account_id() {
     return token_updator_account_id_;
   }
   const std::string& token_updator_source() { return token_updator_source_; }
   bool is_token_updator_refresh_token_valid() {
     return is_token_updator_refresh_token_valid_;
   }
-  const std::string& token_remover_account_id() {
+  const CoreAccountId& token_remover_account_id() {
     return token_remover_account_id_;
   }
   const std::string& token_remover_source() { return token_remover_source_; }
@@ -71,9 +71,9 @@
   }
 
   signin::IdentityManager* identity_manager_;
-  std::string token_updator_account_id_;
+  CoreAccountId token_updator_account_id_;
   std::string token_updator_source_;
-  std::string token_remover_account_id_;
+  CoreAccountId token_remover_account_id_;
   std::string token_remover_source_;
   bool is_token_updator_refresh_token_valid_;
 };
@@ -134,7 +134,7 @@
   identity_manager_observer()->SetOnRefreshTokenUpdatedCallback(
       run_loop.QuitClosure());
 
-  std::string account_id = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId, kTestEmail, kRefreshToken,
       /*is_under_advanced_protection=*/false,
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
@@ -168,7 +168,7 @@
   identity_manager_observer()->SetOnRefreshTokenUpdatedCallback(
       run_loop.QuitClosure());
 
-  std::string account_id = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId, kTestEmail, kRefreshToken,
       /*is_under_advanced_protection=*/false,
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
@@ -196,7 +196,7 @@
   // The internals of IdentityService is migrating from email to gaia id
   // as the account id. Detect whether the current plaform has completed
   // the migration.
-  const bool use_gaia_as_account_id = account_id == account_info.gaia;
+  const bool use_gaia_as_account_id = account_id.id == account_info.gaia;
 
   // If the system uses gaia id as account_id, then change the email and
   // the |is_under_advanced_protection| field. Otherwise only change the
@@ -244,7 +244,7 @@
   identity_manager_observer()->SetOnRefreshTokenUpdatedCallback(
       run_loop.QuitClosure());
 
-  std::string account_id = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId, kTestEmail, kRefreshToken,
       /*is_under_advanced_protection=*/false,
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
@@ -375,7 +375,7 @@
   identity_manager_observer()->SetOnRefreshTokenUpdatedCallback(
       run_loop.QuitClosure());
 
-  std::string account_id = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId, kTestEmail, kRefreshToken,
       /*is_under_advanced_protection=*/false,
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
@@ -457,13 +457,15 @@
       }));
 
   accounts_mutator()->RemoveAccount(
-      kTestGaiaId, signin_metrics::SourceForRefreshTokenOperation::kUnknown);
+      CoreAccountId(kTestGaiaId),
+      signin_metrics::SourceForRefreshTokenOperation::kUnknown);
   run_loop.RunUntilIdle();
 
-  EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(kTestGaiaId));
+  EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(
+      CoreAccountId(kTestGaiaId)));
   EXPECT_FALSE(
       identity_manager()->HasAccountWithRefreshTokenInPersistentErrorState(
-          kTestGaiaId));
+          CoreAccountId(kTestGaiaId)));
   EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 0U);
 }
 
@@ -479,7 +481,7 @@
   identity_manager_observer()->SetOnRefreshTokenUpdatedCallback(
       run_loop.QuitClosure());
 
-  std::string account_id = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId, kTestEmail, kRefreshToken,
       /*is_under_advanced_protection=*/false,
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
@@ -523,7 +525,7 @@
   identity_manager_observer()->SetOnRefreshTokenUpdatedCallback(
       run_loop.QuitClosure());
 
-  std::string account_id = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId, kTestEmail, kRefreshToken,
       /*is_under_advanced_protection=*/false,
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
@@ -540,7 +542,7 @@
   identity_manager_observer()->SetOnRefreshTokenUpdatedCallback(
       run_loop2.QuitClosure());
 
-  std::string account_id2 = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id2 = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId2, kTestEmail2, kRefreshToken2,
       /*is_under_advanced_protection=*/false,
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
@@ -559,8 +561,8 @@
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
   run_loop3.RunUntilIdle();
 
-  EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(kTestGaiaId));
-  EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(kTestGaiaId2));
+  EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id));
+  EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(account_id2));
   EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 0U);
 }
 
@@ -614,7 +616,7 @@
     return;
 
   // Add a default account.
-  std::string account_id = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId, kTestEmail, "refresh_token", false,
       signin_metrics::SourceForRefreshTokenOperation::kUnknown);
   EXPECT_EQ(
@@ -644,13 +646,13 @@
     return;
 
   // Add a default account.
-  std::string account_id = accounts_mutator()->AddOrUpdateAccount(
+  CoreAccountId account_id = accounts_mutator()->AddOrUpdateAccount(
       kTestGaiaId, kTestEmail, "refresh_token", false,
       signin_metrics::SourceForRefreshTokenOperation::kSettings_Signout);
 
   // Remove the default account.
   accounts_mutator()->RemoveAccount(
-      kTestGaiaId,
+      account_id,
       signin_metrics::SourceForRefreshTokenOperation::kSettings_Signout);
   EXPECT_EQ("Settings::Signout",
             identity_manager_diagnostics_observer()->token_remover_source());
diff --git a/components/signin/public/identity_manager/diagnostics_provider_unittest.cc b/components/signin/public/identity_manager/diagnostics_provider_unittest.cc
index 64b1fce..b87fa74d 100644
--- a/components/signin/public/identity_manager/diagnostics_provider_unittest.cc
+++ b/components/signin/public/identity_manager/diagnostics_provider_unittest.cc
@@ -56,7 +56,7 @@
   base::TimeDelta zero;
   EXPECT_EQ(diagnostics_provider()->GetDelayBeforeMakingAccessTokenRequests(),
             zero);
-  std::string account_id =
+  CoreAccountId account_id =
       identity_test_env()->MakeAccountAvailable(kAccountId).account_id;
   identity_test_env()->UpdatePersistentErrorOfRefreshTokenForAccount(
       account_id, GoogleServiceAuthError(
@@ -70,7 +70,7 @@
   identity_test_env()
       ->identity_manager()
       ->GetAccountsCookieMutator()
-      ->AddAccountToCookie(kAccountId, gaia::GaiaSource::kChrome,
+      ->AddAccountToCookie(CoreAccountId(kAccountId), gaia::GaiaSource::kChrome,
                            base::DoNothing());
   EXPECT_EQ(diagnostics_provider()->GetDelayBeforeMakingCookieRequests(), zero);
 
diff --git a/components/signin/public/identity_manager/identity_manager_unittest.cc b/components/signin/public/identity_manager/identity_manager_unittest.cc
index c10e3911..17398ab 100644
--- a/components/signin/public/identity_manager/identity_manager_unittest.cc
+++ b/components/signin/public/identity_manager/identity_manager_unittest.cc
@@ -169,7 +169,7 @@
     on_access_token_request_completed_callback_ = std::move(callback);
   }
 
-  const std::string& token_requestor_account_id() {
+  const CoreAccountId& token_requestor_account_id() {
     return token_requestor_account_id_;
   }
   const std::string& token_requestor_consumer_id() {
@@ -178,13 +178,13 @@
   const identity::ScopeSet& token_requestor_scopes() {
     return token_requestor_scopes_;
   }
-  const std::string& token_remover_account_id() {
+  const CoreAccountId& token_remover_account_id() {
     return token_remover_account_id_;
   }
   const identity::ScopeSet& token_remover_scopes() {
     return token_remover_scopes_;
   }
-  const std::string& on_access_token_request_completed_account_id() {
+  const CoreAccountId& on_access_token_request_completed_account_id() {
     return access_token_request_completed_account_id_;
   }
   const std::string& on_access_token_request_completed_consumer_id() {
@@ -234,12 +234,12 @@
   IdentityManager* identity_manager_;
   base::OnceClosure on_access_token_requested_callback_;
   base::OnceClosure on_access_token_request_completed_callback_;
-  std::string token_requestor_account_id_;
+  CoreAccountId token_requestor_account_id_;
   std::string token_requestor_consumer_id_;
-  std::string token_remover_account_id_;
+  CoreAccountId token_remover_account_id_;
   identity::ScopeSet token_requestor_scopes_;
   identity::ScopeSet token_remover_scopes_;
-  std::string access_token_request_completed_account_id_;
+  CoreAccountId access_token_request_completed_account_id_;
   std::string access_token_request_completed_consumer_id_;
   identity::ScopeSet access_token_request_completed_scopes_;
   GoogleServiceAuthError access_token_request_completed_error_;
@@ -463,7 +463,7 @@
             identity_manager()->GetUnconsentedPrimaryAccountInfo());
 
   CoreAccountId primary_account_id = identity_manager()->GetPrimaryAccountId();
-  EXPECT_EQ(primary_account_id, kTestGaiaId);
+  EXPECT_EQ(primary_account_id, CoreAccountId(kTestGaiaId));
   EXPECT_EQ(primary_account_id, primary_account_info.account_id);
 
   EXPECT_EQ(primary_account_id,
@@ -500,7 +500,7 @@
             identity_manager()->GetUnconsentedPrimaryAccountInfo());
 
   CoreAccountId primary_account_id = identity_manager()->GetPrimaryAccountId();
-  EXPECT_EQ("", primary_account_id);
+  EXPECT_TRUE(primary_account_id.empty());
   EXPECT_EQ(primary_account_id, primary_account_info.account_id);
   EXPECT_EQ(primary_account_id,
             identity_manager()->GetUnconsentedPrimaryAccountId());
@@ -526,12 +526,12 @@
       identity_manager()->GetPrimaryAccountInfo();
   EXPECT_EQ(kTestGaiaId, primary_account_info.gaia);
   EXPECT_EQ(kTestEmail, primary_account_info.email);
-  EXPECT_EQ(kTestGaiaId, primary_account_info.account_id);
+  EXPECT_EQ(CoreAccountId(kTestGaiaId), primary_account_info.account_id);
   EXPECT_EQ(primary_account_info,
             identity_manager()->GetUnconsentedPrimaryAccountInfo());
 
   CoreAccountId primary_account_id = identity_manager()->GetPrimaryAccountId();
-  EXPECT_EQ(primary_account_id, kTestGaiaId);
+  EXPECT_EQ(primary_account_id, CoreAccountId(kTestGaiaId));
   EXPECT_EQ(primary_account_id,
             identity_manager()->GetUnconsentedPrimaryAccountId());
 }
@@ -883,7 +883,7 @@
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
   AccountInfo account_info2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2);
-  std::string account_id2 = account_info2.account_id;
+  CoreAccountId account_id2 = account_info2.account_id;
 
   EXPECT_FALSE(identity_manager()->HasAccountWithRefreshToken(
       primary_account_info.account_id));
@@ -926,7 +926,7 @@
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
   AccountInfo account_info2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2);
-  std::string account_id2 = account_info2.account_id;
+  CoreAccountId account_id2 = account_info2.account_id;
   SetRefreshTokenForAccount(identity_manager(), account_id2);
 
   GoogleServiceAuthError user_not_signed_up_error =
@@ -1640,7 +1640,7 @@
   // we fake the credentials loaded state and force another load in
   // order to be able to capture the TokensLoaded event.
   token_service()->set_all_credentials_loaded_for_testing(false);
-  token_service()->LoadCredentials("");
+  token_service()->LoadCredentials(CoreAccountId());
   run_loop.Run();
 }
 
@@ -1920,9 +1920,9 @@
 }
 
 TEST_F(IdentityManagerTest, CallbackSentOnSuccessfulAdditionOfAccountToCookie) {
-  const char kTestAccountId[] = "account_id";
+  const CoreAccountId kTestAccountId("account_id");
 
-  std::string account_from_add_account_to_cookie_completed_callback;
+  CoreAccountId account_from_add_account_to_cookie_completed_callback;
   GoogleServiceAuthError error_from_add_account_to_cookie_completed_callback;
   auto completion_callback =
       base::BindLambdaForTesting([&](const CoreAccountId& account_id,
@@ -1943,9 +1943,9 @@
 }
 
 TEST_F(IdentityManagerTest, CallbackSentOnFailureAdditionOfAccountToCookie) {
-  const char kTestAccountId[] = "account_id";
+  const CoreAccountId kTestAccountId("account_id");
 
-  std::string account_from_add_account_to_cookie_completed_callback;
+  CoreAccountId account_from_add_account_to_cookie_completed_callback;
   GoogleServiceAuthError error_from_add_account_to_cookie_completed_callback;
   auto completion_callback =
       base::BindLambdaForTesting([&](const CoreAccountId& account_id,
@@ -2100,7 +2100,7 @@
   maybe_account_info =
       identity_manager()
           ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              "dummy_value");
+              CoreAccountId("dummy_value"));
   EXPECT_FALSE(maybe_account_info.has_value());
 
   maybe_account_info =
@@ -2179,7 +2179,7 @@
   // order to test AreRefreshTokensLoaded.
   token_service()->set_all_credentials_loaded_for_testing(false);
   EXPECT_FALSE(identity_manager()->AreRefreshTokensLoaded());
-  token_service()->LoadCredentials("");
+  token_service()->LoadCredentials(CoreAccountId());
   run_loop.Run();
   EXPECT_TRUE(identity_manager()->AreRefreshTokensLoaded());
 }
@@ -2204,7 +2204,7 @@
 
   SimulateSuccessfulFetchOfAccountInfo(
       identity_manager(), account_info.account_id, account_info.email,
-      account_info.account_id, kTestHostedDomain, kTestFullName, kTestGivenName,
+      account_info.gaia, kTestHostedDomain, kTestFullName, kTestGivenName,
       kTestLocale, kTestPictureUrl);
 
   EXPECT_EQ(account_info.account_id, identity_manager_observer()
@@ -2245,9 +2245,9 @@
       identity_manager()->GetAccountIdMigrationState() ==
       IdentityManager::AccountIdMigrationState::MIGRATION_DONE;
   if (account_id_migration_done) {
-    EXPECT_EQ(account_id, kTestGaiaId);
+    EXPECT_EQ(kTestGaiaId, account_id.id);
   } else {
-    EXPECT_TRUE(gaia::AreEmailsSame(account_id, kTestEmail));
+    EXPECT_TRUE(gaia::AreEmailsSame(kTestEmail, account_id.id));
   }
 }
 
diff --git a/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc b/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
index c6ae8526..d923caa 100644
--- a/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
+++ b/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
@@ -62,7 +62,7 @@
   IdentityTestEnvironment* identity_test_env() { return &identity_test_env_; }
 
   // Signs the user in to the primary account, returning the account ID.
-  std::string SignIn() {
+  CoreAccountId SignIn() {
     return identity_test_env_.MakePrimaryAccountAvailable("me@gmail.com")
         .account_id;
   }
@@ -82,7 +82,7 @@
 TEST_F(PrimaryAccountAccessTokenFetcherTest, OneShotShouldReturnAccessToken) {
   TestTokenCallback callback;
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Signed in and refresh token already exists, so this should result in a
   // request for an access token.
@@ -102,7 +102,7 @@
        WaitAndRetryShouldReturnAccessToken) {
   TestTokenCallback callback;
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Signed in and refresh token already exists, so this should result in a
   // request for an access token.
@@ -122,7 +122,7 @@
 TEST_F(PrimaryAccountAccessTokenFetcherTest, ShouldNotReplyIfDestroyed) {
   TestTokenCallback callback;
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Signed in and refresh token already exists, so this should result in a
   // request for an access token.
@@ -192,7 +192,7 @@
       callback.Get(),
       PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable);
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Once the access token request is fulfilled, we should get called back with
   // the access token.
@@ -211,7 +211,7 @@
 TEST_F(PrimaryAccountAccessTokenFetcherTest, ShouldWaitForRefreshToken) {
   TestTokenCallback callback;
 
-  std::string account_id =
+  CoreAccountId account_id =
       identity_test_env()->SetPrimaryAccount("me@gmail.com").account_id;
 
   // Signed in, but there is no refresh token -> we should not get called back
@@ -241,9 +241,9 @@
 
   // Signed-in to account_id, but there's only a refresh token for a different
   // account.
-  std::string account_id =
+  CoreAccountId account_id =
       identity_test_env()->SetPrimaryAccount("me@gmail.com").account_id;
-  identity_test_env()->MakeAccountAvailable(account_id + "2");
+  identity_test_env()->MakeAccountAvailable(account_id.id + "2");
 
   // The fetcher should wait for the correct refresh token.
   auto fetcher = CreateFetcher(
@@ -251,12 +251,12 @@
       PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable);
 
   // A refresh token for yet another account shouldn't matter either.
-  identity_test_env()->MakeAccountAvailable(account_id + "3");
+  identity_test_env()->MakeAccountAvailable(account_id.id + "3");
 }
 
 TEST_F(PrimaryAccountAccessTokenFetcherTest,
        OneShotCanceledAccessTokenRequest) {
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   base::RunLoop run_loop;
 
@@ -278,7 +278,7 @@
        WaitAndRetryCanceledAccessTokenRequest) {
   TestTokenCallback callback;
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Signed in and refresh token already exists, so this should result in a
   // request for an access token.
@@ -303,7 +303,7 @@
        ShouldRetryCanceledAccessTokenRequestOnlyOnce) {
   TestTokenCallback callback;
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Signed in and refresh token already exists, so this should result in a
   // request for an access token.
@@ -331,7 +331,7 @@
        ShouldNotRetryCanceledAccessTokenRequestIfSignedOut) {
   TestTokenCallback callback;
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Signed in and refresh token already exists, so this should result in a
   // request for an access token.
@@ -356,7 +356,7 @@
        ShouldNotRetryCanceledAccessTokenRequestIfRefreshTokenRevoked) {
   TestTokenCallback callback;
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Signed in and refresh token already exists, so this should result in a
   // request for an access token.
@@ -377,7 +377,7 @@
        ShouldNotRetryFailedAccessTokenRequest) {
   TestTokenCallback callback;
 
-  std::string account_id = SignIn();
+  CoreAccountId account_id = SignIn();
 
   // Signed in and refresh token already exists, so this should result in a
   // request for an access token.
diff --git a/components/signin/public/identity_manager/primary_account_mutator_unittest.cc b/components/signin/public/identity_manager/primary_account_mutator_unittest.cc
index 58568eb5..a980a49 100644
--- a/components/signin/public/identity_manager/primary_account_mutator_unittest.cc
+++ b/components/signin/public/identity_manager/primary_account_mutator_unittest.cc
@@ -47,7 +47,7 @@
 // method OnRefreshTokenRemoved is invoked. The parameter will be a reference
 // to the account_id whose token was removed.
 using RefreshTokenRemovedCallback =
-    base::RepeatingCallback<void(const std::string&)>;
+    base::RepeatingCallback<void(const CoreAccountId&)>;
 
 // Helper IdentityManager::Observer that forwards some events to the
 // callback passed to the constructor.
@@ -154,11 +154,11 @@
                           run_loop.QuitClosure());
 
   // Track Observer token removal notification.
-  base::flat_set<std::string> observed_removals;
+  base::flat_set<CoreAccountId> observed_removals;
   RefreshTokenRemovedCallback refresh_token_removed_callback =
       base::BindRepeating(
-          [](base::flat_set<std::string>* observed_removals,
-             const std::string& removed_account) {
+          [](base::flat_set<CoreAccountId>* observed_removals,
+             const CoreAccountId& removed_account) {
             observed_removals->insert(removed_account);
           },
           &observed_removals);
@@ -190,20 +190,20 @@
           former_primary_account.account_id));
       EXPECT_TRUE(identity_manager->HasAccountWithRefreshToken(
           secondary_account_info.account_id));
-      EXPECT_TRUE(base::Contains(observed_removals,
-                                 former_primary_account.account_id.id));
-      EXPECT_FALSE(base::Contains(observed_removals,
-                                  secondary_account_info.account_id.id));
+      EXPECT_TRUE(
+          base::Contains(observed_removals, former_primary_account.account_id));
+      EXPECT_FALSE(
+          base::Contains(observed_removals, secondary_account_info.account_id));
       break;
     case RemoveAccountExpectation::kRemoveAll:
       EXPECT_FALSE(identity_manager->HasAccountWithRefreshToken(
           former_primary_account.account_id));
       EXPECT_FALSE(identity_manager->HasAccountWithRefreshToken(
           secondary_account_info.account_id));
-      EXPECT_TRUE(base::Contains(observed_removals,
-                                 former_primary_account.account_id.id));
-      EXPECT_TRUE(base::Contains(observed_removals,
-                                 secondary_account_info.account_id.id));
+      EXPECT_TRUE(
+          base::Contains(observed_removals, former_primary_account.account_id));
+      EXPECT_TRUE(
+          base::Contains(observed_removals, secondary_account_info.account_id));
       break;
   }
 }
@@ -260,7 +260,8 @@
     return;
 
   EXPECT_FALSE(identity_manager->HasPrimaryAccount());
-  EXPECT_FALSE(primary_account_mutator->SetPrimaryAccount(kUnknownAccountId));
+  EXPECT_FALSE(primary_account_mutator->SetPrimaryAccount(
+      CoreAccountId(kUnknownAccountId)));
 }
 
 // Checks that setting the primary account fails if the account is unknown.
@@ -281,7 +282,8 @@
       environment.MakeAccountAvailable(kPrimaryAccountEmail);
 
   EXPECT_FALSE(identity_manager->HasPrimaryAccount());
-  EXPECT_FALSE(primary_account_mutator->SetPrimaryAccount(kUnknownAccountId));
+  EXPECT_FALSE(primary_account_mutator->SetPrimaryAccount(
+      CoreAccountId(kUnknownAccountId)));
 }
 
 // Checks that trying to set the primary account fails when there is already a
diff --git a/components/sync/driver/glue/sync_engine_impl_unittest.cc b/components/sync/driver/glue/sync_engine_impl_unittest.cc
index 0ed43e4..fddece1 100644
--- a/components/sync/driver/glue/sync_engine_impl_unittest.cc
+++ b/components/sync/driver/glue/sync_engine_impl_unittest.cc
@@ -234,7 +234,7 @@
     params.registrar = std::make_unique<SyncBackendRegistrar>(
         std::string(), base::Bind(&CreateModelWorkerForGroup));
     params.http_factory_getter = std::move(http_post_provider_factory_getter);
-    params.authenticated_account_id = "user@example.com";
+    params.authenticated_account_id = CoreAccountId("account_id");
     params.sync_manager_factory = std::move(fake_manager_factory_);
     params.unrecoverable_error_handler =
         MakeWeakHandle(test_unrecoverable_error_handler_.GetWeakPtr()),
diff --git a/components/sync/driver/model_type_controller_unittest.cc b/components/sync/driver/model_type_controller_unittest.cc
index 32f69fa..a3e0429a 100644
--- a/components/sync/driver/model_type_controller_unittest.cc
+++ b/components/sync/driver/model_type_controller_unittest.cc
@@ -142,7 +142,7 @@
 
 ConfigureContext MakeConfigureContext() {
   ConfigureContext context;
-  context.authenticated_account_id = kAccountId;
+  context.authenticated_account_id = CoreAccountId(kAccountId);
   context.cache_guid = kCacheGuid;
   return context;
 }
@@ -571,7 +571,7 @@
           &delegate_for_transport_mode));
 
   ConfigureContext context;
-  context.authenticated_account_id = kAccountId;
+  context.authenticated_account_id = CoreAccountId(kAccountId);
   context.cache_guid = kCacheGuid;
 
   ModelTypeControllerDelegate::StartCallback start_callback;
diff --git a/components/sync/driver/profile_sync_service_unittest.cc b/components/sync/driver/profile_sync_service_unittest.cc
index 221adae..f3e4a43 100644
--- a/components/sync/driver/profile_sync_service_unittest.cc
+++ b/components/sync/driver/profile_sync_service_unittest.cc
@@ -121,7 +121,7 @@
 class FakeSyncEngineCollectCredentials : public FakeSyncEngine {
  public:
   explicit FakeSyncEngineCollectCredentials(
-      std::string* init_account_id,
+      CoreAccountId* init_account_id,
       const base::RepeatingClosure& invalidate_credentials_callback)
       : init_account_id_(init_account_id),
         invalidate_credentials_callback_(invalidate_credentials_callback) {}
@@ -139,7 +139,7 @@
   }
 
  private:
-  std::string* init_account_id_;
+  CoreAccountId* init_account_id_;
   base::RepeatingClosure invalidate_credentials_callback_;
 };
 
@@ -589,7 +589,7 @@
             service()->GetDisableReasons());
   EXPECT_EQ(SyncService::TransportState::DISABLED,
             service()->GetTransportState());
-  EXPECT_EQ("", identity_provider()->GetActiveAccountId());
+  EXPECT_EQ(CoreAccountId(), identity_provider()->GetActiveAccountId());
 
   identity_test_env()->MakePrimaryAccountAvailable("new_user@gmail.com");
   EXPECT_EQ(identity_manager()->GetPrimaryAccountId(),
@@ -646,7 +646,7 @@
 }
 
 TEST_F(ProfileSyncServiceTest, RevokeAccessTokenFromTokenService) {
-  std::string init_account_id;
+  CoreAccountId init_account_id;
 
   CreateService(ProfileSyncService::AUTO_START);
   SignIn();
@@ -658,7 +658,7 @@
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
 
-  const std::string primary_account_id =
+  const CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId();
 
   // Make sure the expected account_id was passed to the SyncEngine.
@@ -689,7 +689,7 @@
   base::test::ScopedFeatureList feature;
   feature.InitAndEnableFeature(switches::kStopSyncInPausedState);
 
-  std::string init_account_id;
+  CoreAccountId init_account_id;
 
   CreateService(ProfileSyncService::AUTO_START);
   SignIn();
@@ -704,7 +704,7 @@
   TestSyncServiceObserver observer;
   service()->AddObserver(&observer);
 
-  const std::string primary_account_id =
+  const CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId();
 
   // Make sure the expected account_id was passed to the SyncEngine.
@@ -748,7 +748,7 @@
   base::test::ScopedFeatureList feature;
   feature.InitAndDisableFeature(switches::kStopSyncInPausedState);
 
-  std::string init_account_id;
+  CoreAccountId init_account_id;
 
   bool invalidate_credentials_called = false;
   base::RepeatingClosure invalidate_credentials_callback =
@@ -768,7 +768,7 @@
   TestSyncServiceObserver observer;
   service()->AddObserver(&observer);
 
-  const std::string primary_account_id =
+  const CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId();
 
   // Make sure the expected account_id was passed to the SyncEngine.
@@ -811,7 +811,7 @@
 // CrOS does not support signout.
 #if !defined(OS_CHROMEOS)
 TEST_F(ProfileSyncServiceTest, SignOutRevokeAccessToken) {
-  std::string init_account_id;
+  CoreAccountId init_account_id;
 
   CreateService(ProfileSyncService::AUTO_START);
   SignIn();
@@ -823,7 +823,7 @@
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
 
-  const std::string primary_account_id =
+  const CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId();
 
   // Make sure the expected account_id was passed to the SyncEngine.
@@ -959,7 +959,7 @@
   // automatic replies to access token requests.
   identity_test_env()->SetAutomaticIssueOfAccessTokens(false);
 
-  std::string init_account_id;
+  CoreAccountId init_account_id;
 
   CreateService(ProfileSyncService::AUTO_START);
   SignIn();
@@ -971,7 +971,7 @@
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
 
-  const std::string primary_account_id =
+  const CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId();
 
   // Make sure the expected account_id was passed to the SyncEngine.
@@ -1020,7 +1020,7 @@
   // automatic replies to access token requests.
   identity_test_env()->SetAutomaticIssueOfAccessTokens(false);
 
-  std::string init_account_id;
+  CoreAccountId init_account_id;
 
   CreateService(ProfileSyncService::AUTO_START);
   SignIn();
@@ -1032,7 +1032,7 @@
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
 
-  const std::string primary_account_id =
+  const CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId();
 
   // Make sure the expected account_id was passed to the SyncEngine.
diff --git a/components/sync/driver/sync_auth_manager_unittest.cc b/components/sync/driver/sync_auth_manager_unittest.cc
index 8a03128..b971d59 100644
--- a/components/sync/driver/sync_auth_manager_unittest.cc
+++ b/components/sync/driver/sync_auth_manager_unittest.cc
@@ -82,7 +82,7 @@
 
   // Fire some auth events. We haven't called RegisterForAuthNotifications, so
   // none of this should result in any callback calls.
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   // Without RegisterForAuthNotifications, the active account should always be
   // reported as empty.
@@ -104,7 +104,7 @@
 #if !defined(OS_CHROMEOS)
 TEST_F(SyncAuthManagerTest, ForwardsPrimaryAccountEvents) {
   // Start out already signed in before the SyncAuthManager is created.
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
 
   base::MockCallback<AccountStateChangedCallback> account_state_changed;
@@ -131,7 +131,7 @@
 
   // Sign in to a different account.
   EXPECT_CALL(account_state_changed, Run());
-  std::string second_account_id =
+  CoreAccountId second_account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   EXPECT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
             second_account_id);
@@ -177,7 +177,7 @@
 #if !defined(OS_CHROMEOS)
 TEST_F(SyncAuthManagerTest, ClearsAuthErrorOnSignout) {
   // Start out already signed in before the SyncAuthManager is created.
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
 
   auto auth_manager = CreateAuthManager();
@@ -208,7 +208,7 @@
 
 TEST_F(SyncAuthManagerTest, DoesNotClearAuthErrorOnSyncDisable) {
   // Start out already signed in before the SyncAuthManager is created.
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
 
   auto auth_manager = CreateAuthManager();
@@ -237,7 +237,7 @@
 
 TEST_F(SyncAuthManagerTest, ForwardsCredentialsEvents) {
   // Start out already signed in before the SyncAuthManager is created.
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
 
   base::MockCallback<AccountStateChangedCallback> account_state_changed;
@@ -280,7 +280,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, RequestsAccessTokenOnSyncStartup) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -297,7 +297,7 @@
 
 TEST_F(SyncAuthManagerTest,
        RetriesAccessTokenFetchWithBackoffOnTransientFailure) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -317,7 +317,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, AbortsAccessTokenFetchOnPersistentFailure) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -339,7 +339,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, FetchesNewAccessTokenWithBackoffOnServerError) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -363,7 +363,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, ExposesServerError) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -387,7 +387,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, ClearsServerErrorOnSyncDisable) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -414,7 +414,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, RequestsNewAccessTokenOnExpiry) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -444,7 +444,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, RequestsNewAccessTokenOnRefreshTokenUpdate) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -474,7 +474,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, DoesNotRequestAccessTokenAutonomously) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -501,7 +501,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, ClearsCredentialsOnRefreshTokenRemoval) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -538,7 +538,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, ClearsCredentialsOnInvalidRefreshToken) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -580,7 +580,7 @@
 
 TEST_F(SyncAuthManagerTest,
        RequestsAccessTokenWhenInvalidRefreshTokenResolved) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
@@ -612,7 +612,7 @@
 }
 
 TEST_F(SyncAuthManagerTest, DoesNotRequestAccessTokenIfSyncInactive) {
-  std::string account_id =
+  CoreAccountId account_id =
       identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
 
   base::MockCallback<AccountStateChangedCallback> account_state_changed;
diff --git a/components/sync/engine_impl/sync_manager_impl_unittest.cc b/components/sync/engine_impl/sync_manager_impl_unittest.cc
index 0daef38..da2bae7 100644
--- a/components/sync/engine_impl/sync_manager_impl_unittest.cc
+++ b/components/sync/engine_impl/sync_manager_impl_unittest.cc
@@ -980,7 +980,7 @@
     args.extensions_activity = extensions_activity_.get(),
     args.change_delegate = this;
     if (!enable_local_sync_backend)
-      args.authenticated_account_id = "foo@bar.com";
+      args.authenticated_account_id = CoreAccountId("account_id");
     args.cache_guid = "fake_cache_guid";
     args.invalidator_client_id = "fake_invalidator_client_id";
     args.enable_local_sync_backend = enable_local_sync_backend;
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc
index 071abf06..2a18e8c 100644
--- a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc
+++ b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc
@@ -240,7 +240,7 @@
         &ClientTagBasedModelTypeProcessorTest::ErrorReceived,
         base::Unretained(this));
     request.cache_guid = cache_guid;
-    request.authenticated_account_id = authenticated_account_id;
+    request.authenticated_account_id = CoreAccountId(authenticated_account_id);
     request.sync_mode = sync_mode;
     request.configuration_start_time = base::Time::Now();
     type_processor()->OnSyncStarting(
diff --git a/components/sync/model_impl/syncable_service_based_bridge_unittest.cc b/components/sync/model_impl/syncable_service_based_bridge_unittest.cc
index 353d86f..562aee2 100644
--- a/components/sync/model_impl/syncable_service_based_bridge_unittest.cc
+++ b/components/sync/model_impl/syncable_service_based_bridge_unittest.cc
@@ -120,7 +120,7 @@
     syncer::DataTypeActivationRequest request;
     request.error_handler = mock_error_handler_.Get();
     request.cache_guid = "TestCacheGuid";
-    request.authenticated_account_id = "SomeAccountId";
+    request.authenticated_account_id = CoreAccountId("SomeAccountId");
     return request;
   }
 
diff --git a/components/sync/protocol/device_info_specifics.proto b/components/sync/protocol/device_info_specifics.proto
index 9faed98..e1a55cd5 100644
--- a/components/sync/protocol/device_info_specifics.proto
+++ b/components/sync/protocol/device_info_specifics.proto
@@ -97,6 +97,7 @@
     SHARED_CLIPBOARD = 2;
     SMS_FETCHER = 3;
     REMOTE_COPY = 4;
+    PEER_CONNECTION = 5;
   }
 
   // A list of enabled Sharing features.
diff --git a/components/sync_sessions/session_sync_bridge_unittest.cc b/components/sync_sessions/session_sync_bridge_unittest.cc
index af019fd5..fa5198e 100644
--- a/components/sync_sessions/session_sync_bridge_unittest.cc
+++ b/components/sync_sessions/session_sync_bridge_unittest.cc
@@ -212,7 +212,7 @@
     syncer::DataTypeActivationRequest request;
     request.error_handler = base::DoNothing();
     request.cache_guid = "TestCacheGuid";
-    request.authenticated_account_id = "SomeAccountId";
+    request.authenticated_account_id = CoreAccountId("SomeAccountId");
 
     base::RunLoop loop;
     real_processor_->OnSyncStarting(
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc
index e80c362..3406695 100644
--- a/components/viz/service/display/display_resource_provider.cc
+++ b/components/viz/service/display/display_resource_provider.cc
@@ -684,9 +684,10 @@
       image_contexts_to_return.emplace_back(std::move(resource.image_context));
 
     if (resource.is_gpu_resource_type() &&
+        resource.gl_id &&
         resource.filter != resource.transferable.filter) {
       DCHECK(resource.transferable.mailbox_holder.texture_target);
-      DCHECK(resource.gl_id);
+      DCHECK(!resource.ShouldWaitSyncToken());
       DCHECK(gl);
       gl->BindTexture(resource.transferable.mailbox_holder.texture_target,
                       resource.gl_id);
@@ -1045,9 +1046,7 @@
 DisplayResourceProvider::ChildResource::ChildResource(
     int child_id,
     const TransferableResource& transferable)
-    : child_id(child_id),
-      transferable(transferable),
-      filter(transferable.filter) {
+    : child_id(child_id), transferable(transferable), filter(GL_NONE) {
   if (is_gpu_resource_type())
     UpdateSyncToken(transferable.mailbox_holder.sync_token);
   else
diff --git a/components/viz/service/display/gl_renderer_unittest.cc b/components/viz/service/display/gl_renderer_unittest.cc
index 8d623ab..fd7d8e8 100644
--- a/components/viz/service/display/gl_renderer_unittest.cc
+++ b/components/viz/service/display/gl_renderer_unittest.cc
@@ -1127,6 +1127,11 @@
   GLenum active_texture_;
 };
 
+#define EXPECT_FILTER_CALL(filter)                                          \
+  EXPECT_CALL(*gl,                                                          \
+              TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter)); \
+  EXPECT_CALL(*gl, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter));
+
 TEST_F(GLRendererTest, ActiveTextureState) {
   auto child_gl_owned = std::make_unique<TextureStateTrackingGLES2Interface>();
   auto child_context_provider =
@@ -1194,17 +1199,34 @@
     EXPECT_CALL(*gl, WaitSyncTokenCHROMIUM(_)).Times(7);
 
     // yuv_quad is drawn with the default linear filter.
+    for (int i = 0; i < 4; ++i) {
+      EXPECT_FILTER_CALL(GL_LINEAR);
+    }
     EXPECT_CALL(*gl, DrawElements(_, _, _, _));
 
     // tile_quad is drawn with GL_NEAREST because it is not transformed or
     // scaled.
-    EXPECT_CALL(
-        *gl, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
-    EXPECT_CALL(
-        *gl, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
-    // The remaining quads also use GL_LINEAR because nearest neighbor
-    // filtering is currently only used with tile quads.
-    EXPECT_CALL(*gl, DrawElements(_, _, _, _)).Times(8);
+    EXPECT_FILTER_CALL(GL_NEAREST);
+    EXPECT_CALL(*gl, DrawElements(_, _, _, _));
+
+    // transformed tile_quad
+    EXPECT_FILTER_CALL(GL_LINEAR);
+    EXPECT_CALL(*gl, DrawElements(_, _, _, _));
+
+    // scaled tile_quad
+    EXPECT_FILTER_CALL(GL_LINEAR);
+    EXPECT_CALL(*gl, DrawElements(_, _, _, _));
+
+    // texture_quad without nearest neighbor
+    EXPECT_FILTER_CALL(GL_LINEAR);
+    EXPECT_CALL(*gl, DrawElements(_, _, _, _));
+
+    // texture_quad without nearest neighbor
+    EXPECT_FILTER_CALL(GL_LINEAR);
+    EXPECT_CALL(*gl, DrawElements(_, _, _, _));
+
+    // stream video, solid color and debug draw quads
+    EXPECT_CALL(*gl, DrawElements(_, _, _, _)).Times(3);
   }
 
   gfx::Size viewport_size(100, 100);
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 30c465f..c791084 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -384,6 +384,11 @@
   RunHtmlTest(FILE_PATH_LITERAL("clickable-ancestor.html"));
 }
 
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
+                       AccessibilityComboboxOptgroup) {
+  RunHtmlTest(FILE_PATH_LITERAL("combobox-optgroup.html"));
+}
+
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAomBusy) {
   RunAomTest(FILE_PATH_LITERAL("aom-busy.html"));
 }
diff --git a/content/browser/background_sync/background_sync_base_browsertest.cc b/content/browser/background_sync/background_sync_base_browsertest.cc
index 55d68da7..45a17ce 100644
--- a/content/browser/background_sync/background_sync_base_browsertest.cc
+++ b/content/browser/background_sync/background_sync_base_browsertest.cc
@@ -121,7 +121,7 @@
     const std::string& tag,
     const GURL& url,
     base::OnceCallback<void(bool)> callback) {
-  sw_context->FindReadyRegistrationForDocument(
+  sw_context->FindReadyRegistrationForClientUrl(
       url, base::BindOnce(&BackgroundSyncBaseBrowserTest::
                               RegistrationPendingDidGetSWRegistration,
                           base::Unretained(this), sync_context, tag,
diff --git a/content/browser/bad_message.h b/content/browser/bad_message.h
index d29ce2e..131b6f65 100644
--- a/content/browser/bad_message.h
+++ b/content/browser/bad_message.h
@@ -236,7 +236,7 @@
   RFH_CHILD_FRAME_NEEDS_OWNER_ELEMENT_TYPE = 208,
   OBSOLETE_RFH_INVALID_WEB_REPORTING_CRASH_ID = 209,
   RFH_DETACH_MAIN_FRAME = 210,
-  RFH_BROWSER_INTERFACE_BROKER_MISSING = 211,
+  RFH_DOCUMENT_INTERFACE_BROKER_MISSING = 211,
   RFPH_POST_MESSAGE_INVALID_SOURCE_ORIGIN = 212,
   INVALID_INITIATOR_ORIGIN = 213,
   RFHI_BEGIN_NAVIGATION_MISSING_INITIATOR_ORIGIN = 214,
diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc
index 579d5d4..fd588f51 100644
--- a/content/browser/frame_host/frame_tree.cc
+++ b/content/browser/frame_host/frame_tree.cc
@@ -178,6 +178,10 @@
     int process_id,
     int new_routing_id,
     service_manager::mojom::InterfaceProviderRequest interface_provider_request,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_content_receiver,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_blink_receiver,
     mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
         browser_interface_broker_receiver,
     blink::WebTreeScopeType scope,
@@ -222,6 +226,12 @@
   added_node->current_frame_host()->BindInterfaceProviderRequest(
       std::move(interface_provider_request));
 
+  DCHECK(document_interface_broker_content_receiver.is_valid());
+  DCHECK(document_interface_broker_blink_receiver.is_valid());
+  added_node->current_frame_host()->BindDocumentInterfaceBrokerReceiver(
+      std::move(document_interface_broker_content_receiver),
+      std::move(document_interface_broker_blink_receiver));
+
   DCHECK(browser_interface_broker_receiver.is_valid());
   added_node->current_frame_host()->BindBrowserInterfaceBrokerReceiver(
       std::move(browser_interface_broker_receiver));
diff --git a/content/browser/frame_host/frame_tree.h b/content/browser/frame_host/frame_tree.h
index 2f47581..092e9cf2 100644
--- a/content/browser/frame_host/frame_tree.h
+++ b/content/browser/frame_host/frame_tree.h
@@ -156,6 +156,10 @@
       int new_routing_id,
       service_manager::mojom::InterfaceProviderRequest
           interface_provider_request,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_content_receiver,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_blink_receiver,
       mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
           browser_interface_broker_receiver,
       blink::WebTreeScopeType scope,
diff --git a/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc b/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc
index 666628c..a3a425d 100644
--- a/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc
+++ b/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc
@@ -100,6 +100,8 @@
       tree()->AddFrame(
           node, process_id(), child_id,
           TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+          TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+          TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
           TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
           blink::WebTreeScopeType::kDocument, std::string(),
           base::StringPrintf("uniqueName%d", child_id), false,
diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc
index 071cc7d..1ffe334 100644
--- a/content/browser/frame_host/frame_tree_unittest.cc
+++ b/content/browser/frame_host/frame_tree_unittest.cc
@@ -57,6 +57,11 @@
   return TestRenderFrameHost::CreateStubInterfaceProviderRequest();
 }
 
+mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+CreateStubDocumentInterfaceBrokerReceiver() {
+  return TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver();
+}
+
 mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
 CreateStubBrowserInterfaceBrokerReceiver() {
   return TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver();
@@ -171,36 +176,48 @@
   // Simulate attaching a series of frames to build the frame tree.
   frame_tree->AddFrame(
       root, process_id, 14, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       root, process_id, 15, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       root, process_id, 16, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       root->child_at(0), process_id, 244, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName3", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       root->child_at(1), process_id, 255, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, no_children_node, "uniqueName4",
       false, base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       root->child_at(0), process_id, 245, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName5", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -215,30 +232,40 @@
   FrameTreeNode* child_16 = root->child_at(2);
   frame_tree->AddFrame(
       child_16, process_id, 264, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName6", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       child_16, process_id, 265, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName7", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       child_16, process_id, 266, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName8", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       child_16, process_id, 267, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, deep_subtree, "uniqueName9", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(
       child_16, process_id, 268, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName10", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -247,12 +274,16 @@
   FrameTreeNode* child_267 = child_16->child_at(3);
   frame_tree->AddFrame(
       child_267, process_id, 365, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName11", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), false, kOwnerType);
   frame_tree->AddFrame(child_267->child_at(0), process_id, 455,
                        CreateStubInterfaceProviderRequest(),
+                       CreateStubDocumentInterfaceBrokerReceiver(),
+                       CreateStubDocumentInterfaceBrokerReceiver(),
                        CreateStubBrowserInterfaceBrokerReceiver(),
                        blink::WebTreeScopeType::kDocument, std::string(),
                        "uniqueName12", false, base::UnguessableToken::Create(),
@@ -260,6 +291,8 @@
                        kOwnerType);
   frame_tree->AddFrame(child_267->child_at(0)->child_at(0), process_id, 555,
                        CreateStubInterfaceProviderRequest(),
+                       CreateStubDocumentInterfaceBrokerReceiver(),
+                       CreateStubDocumentInterfaceBrokerReceiver(),
                        CreateStubBrowserInterfaceBrokerReceiver(),
                        blink::WebTreeScopeType::kDocument, std::string(),
                        "uniqueName13", false, base::UnguessableToken::Create(),
@@ -267,6 +300,8 @@
                        kOwnerType);
   frame_tree->AddFrame(child_267->child_at(0)->child_at(0)->child_at(0),
                        process_id, 655, CreateStubInterfaceProviderRequest(),
+                       CreateStubDocumentInterfaceBrokerReceiver(),
+                       CreateStubDocumentInterfaceBrokerReceiver(),
                        CreateStubBrowserInterfaceBrokerReceiver(),
                        blink::WebTreeScopeType::kDocument, std::string(),
                        "uniqueName14", false, base::UnguessableToken::Create(),
@@ -345,18 +380,24 @@
   constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
   main_test_rfh()->OnCreateChildFrame(
       22, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "child0", "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), kOwnerType);
   main_test_rfh()->OnCreateChildFrame(
       23, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "child1", "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), kOwnerType);
   main_test_rfh()->OnCreateChildFrame(
       24, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -368,6 +409,8 @@
   // Add one grandchild frame.
   child1->current_frame_host()->OnCreateChildFrame(
       33, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "grandchild", "uniqueName3", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -410,18 +453,24 @@
   FrameTreeNode* root = frame_tree->root();
   main_test_rfh()->OnCreateChildFrame(
       22, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "child0", "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), kOwnerType);
   main_test_rfh()->OnCreateChildFrame(
       23, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "child1", "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), kOwnerType);
   main_test_rfh()->OnCreateChildFrame(
       24, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "child2", "uniqueName2", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -433,6 +482,8 @@
   // Add one grandchild frame.
   child1->current_frame_host()->OnCreateChildFrame(
       33, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "grandchild", "uniqueName3", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -468,6 +519,8 @@
   // Simulate attaching a series of frames to build the frame tree.
   main_test_rfh()->OnCreateChildFrame(
       14, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -478,6 +531,8 @@
       activity.GetLog());
   main_test_rfh()->OnCreateChildFrame(
       18, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -502,6 +557,8 @@
   constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
   main_test_rfh()->OnCreateChildFrame(
       22, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -512,6 +569,8 @@
       activity.GetLog());
   main_test_rfh()->OnCreateChildFrame(
       23, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -544,6 +603,8 @@
   // Simulate attaching a frame from mismatched process id.
   ASSERT_FALSE(frame_tree->AddFrame(
       root, process_id + 1, 1, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -562,12 +623,16 @@
   constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe;
   main_test_rfh()->OnCreateChildFrame(
       22, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
       FrameOwnerProperties(), kOwnerType);
   main_test_rfh()->OnCreateChildFrame(
       23, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -577,6 +642,8 @@
   RenderFrameHostImpl* child1_rfh = root->child_at(0)->current_frame_host();
   child1_rfh->OnCreateChildFrame(
       33, CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc
index 88441c5..5b34d44 100644
--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -1971,6 +1971,8 @@
   main_test_rfh()->OnCreateChildFrame(
       process()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), unique_name0, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2009,6 +2011,8 @@
   main_test_rfh()->OnCreateChildFrame(
       process()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), unique_name1, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2047,6 +2051,8 @@
   subframe->OnCreateChildFrame(
       process()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), unique_name2, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2103,6 +2109,8 @@
   main_test_rfh()->OnCreateChildFrame(
       process()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), unique_name, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -3337,6 +3345,8 @@
   main_test_rfh()->OnCreateChildFrame(
       process()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), unique_name, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -3504,6 +3514,8 @@
   main_test_rfh()->OnCreateChildFrame(
       process()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), unique_name, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -4764,6 +4776,8 @@
   main_test_rfh()->OnCreateChildFrame(
       process()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), unique_name, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 06f1878..321b7a23 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -202,6 +202,7 @@
 #include "third_party/blink/public/mojom/appcache/appcache.mojom.h"
 #include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom.h"
 #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
+#include "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom.h"
 #include "third_party/blink/public/mojom/frame/fullscreen.mojom.h"
 #include "third_party/blink/public/mojom/loader/pause_subresource_loading_handle.mojom.h"
 #include "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom.h"
@@ -1815,6 +1816,8 @@
   SetRenderFrameCreated(false);
   InvalidateMojoConnection();
   document_scoped_interface_provider_binding_.Close();
+  document_interface_broker_content_receiver_.reset();
+  document_interface_broker_blink_receiver_.reset();
   broker_receiver_.reset();
   SetLastCommittedUrl(GURL());
   bundled_exchanges_handle_.reset();
@@ -1989,6 +1992,14 @@
   service_manager::mojom::InterfaceProviderPtr interface_provider;
   BindInterfaceProviderRequest(mojo::MakeRequest(&interface_provider));
 
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content;
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink;
+  BindDocumentInterfaceBrokerReceiver(
+      document_interface_broker_content.InitWithNewPipeAndPassReceiver(),
+      document_interface_broker_blink.InitWithNewPipeAndPassReceiver());
+
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker;
   BindBrowserInterfaceBrokerReceiver(
@@ -1997,6 +2008,8 @@
   mojom::CreateFrameParamsPtr params = mojom::CreateFrameParams::New();
   params->interface_bundle = mojom::DocumentScopedInterfaceBundle::New(
       interface_provider.PassInterface(),
+      std::move(document_interface_broker_content),
+      std::move(document_interface_broker_blink),
       std::move(browser_interface_broker));
 
   params->routing_id = routing_id_;
@@ -2198,6 +2211,10 @@
     int new_routing_id,
     service_manager::mojom::InterfaceProviderRequest
         new_interface_provider_provider_request,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_content_receiver,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_blink_receiver,
     mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
         browser_interface_broker_receiver,
     blink::WebTreeScopeType scope,
@@ -2211,6 +2228,8 @@
   // TODO(lukasza): Call ReceivedBadMessage when |frame_unique_name| is empty.
   DCHECK(!frame_unique_name.empty());
   DCHECK(new_interface_provider_provider_request.is_pending());
+  DCHECK(document_interface_broker_content_receiver.is_valid());
+  DCHECK(document_interface_broker_blink_receiver.is_valid());
   DCHECK(browser_interface_broker_receiver.is_valid());
   if (owner_type == blink::FrameOwnerElementType::kNone) {
     // Any child frame must have a HTMLFrameOwnerElement in its parent document
@@ -2228,11 +2247,15 @@
     return;
 
   // |new_routing_id|, |new_interface_provider_provider_request|,
+  // |document_interface_broker_content_receiver|,
+  // |document_interface_broker_blink_receiver|,
   // |browser_interface_broker_receiver| and |devtools_frame_token| were
   // generated on the browser's IO thread and not taken from the renderer
   // process.
   frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id,
                         std::move(new_interface_provider_provider_request),
+                        std::move(document_interface_broker_content_receiver),
+                        std::move(document_interface_broker_blink_receiver),
                         std::move(browser_interface_broker_receiver), scope,
                         frame_name, frame_unique_name, is_created_by_script,
                         devtools_frame_token, frame_policy,
@@ -4213,6 +4236,23 @@
       std::make_unique<ActiveURLMessageFilter>(this));
 }
 
+void RenderFrameHostImpl::BindDocumentInterfaceBrokerReceiver(
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        content_receiver,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        blink_receiver) {
+  DCHECK(!document_interface_broker_content_receiver_.is_bound());
+  DCHECK(content_receiver.is_valid());
+  document_interface_broker_content_receiver_.Bind(std::move(content_receiver));
+  document_interface_broker_content_receiver_.SetFilter(
+      std::make_unique<ActiveURLMessageFilter>(this));
+  DCHECK(!document_interface_broker_blink_receiver_.is_bound());
+  DCHECK(blink_receiver.is_valid());
+  document_interface_broker_blink_receiver_.Bind(std::move(blink_receiver));
+  document_interface_broker_blink_receiver_.SetFilter(
+      std::make_unique<ActiveURLMessageFilter>(this));
+}
+
 void RenderFrameHostImpl::BindBrowserInterfaceBrokerReceiver(
     mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker> receiver) {
   DCHECK(receiver.is_valid());
@@ -4390,6 +4430,15 @@
   main_frame->BindInterfaceProviderRequest(
       mojo::MakeRequest(&main_frame_interface_provider_info));
 
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content;
+
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink;
+  main_frame->BindDocumentInterfaceBrokerReceiver(
+      document_interface_broker_content.InitWithNewPipeAndPassReceiver(),
+      document_interface_broker_blink.InitWithNewPipeAndPassReceiver());
+
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker;
   main_frame->BindBrowserInterfaceBrokerReceiver(
@@ -4410,6 +4459,8 @@
       main_frame->GetLocalRenderWidgetHost()->GetRoutingID(), visual_properties,
       mojom::DocumentScopedInterfaceBundle::New(
           std::move(main_frame_interface_provider_info),
+          std::move(document_interface_broker_content),
+          std::move(document_interface_broker_blink),
           std::move(browser_interface_broker)),
       cloned_namespace->id(), main_frame->GetDevToolsFrameToken());
 
@@ -6598,6 +6649,22 @@
   }
 }
 
+// This is a test-only interface, not exposed in production.
+void RenderFrameHostImpl::GetFrameHostTestInterface(
+    mojo::PendingReceiver<blink::mojom::FrameHostTestInterface> receiver) {
+  class FrameHostTestInterfaceImpl
+      : public blink::mojom::FrameHostTestInterface {
+   public:
+    void Ping(const GURL& url, const std::string& event) override {}
+    void GetName(GetNameCallback callback) override {
+      std::move(callback).Run("RenderFrameHostImpl");
+    }
+  };
+
+  mojo::MakeSelfOwnedReceiver(std::make_unique<FrameHostTestInterfaceImpl>(),
+                              std::move(receiver));
+}
+
 void RenderFrameHostImpl::CreateAppCacheBackend(
     mojo::PendingReceiver<blink::mojom::AppCacheBackend> receiver) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -7420,7 +7487,13 @@
             std::move(interface_provider_request_of_previous_document));
     BindInterfaceProviderRequest(
         std::move(interface_params->interface_provider_request));
+
+    document_interface_broker_content_receiver_.reset();
+    document_interface_broker_blink_receiver_.reset();
     broker_receiver_.reset();
+    BindDocumentInterfaceBrokerReceiver(
+        std::move(interface_params->document_interface_broker_content_receiver),
+        std::move(interface_params->document_interface_broker_blink_receiver));
     BindBrowserInterfaceBrokerReceiver(
         std::move(interface_params->browser_interface_broker_receiver));
   } else {
@@ -7433,6 +7506,8 @@
     // possibly from a different security origin, will no longer be dispatched.
     if (frame_tree_node_->has_committed_real_load()) {
       document_scoped_interface_provider_binding_.Close();
+      document_interface_broker_content_receiver_.reset();
+      document_interface_broker_blink_receiver_.reset();
       broker_receiver_.reset();
       bad_message::ReceivedBadMessage(
           process, bad_message::RFH_INTERFACE_PROVIDER_MISSING);
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index a9b02bd7..ad8b66f 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -85,6 +85,7 @@
 #include "third_party/blink/public/mojom/commit_result/commit_result.mojom.h"
 #include "third_party/blink/public/mojom/contacts/contacts_manager.mojom.h"
 #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h"
 #include "third_party/blink/public/mojom/frame/find_in_page.mojom.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom.h"
 #include "third_party/blink/public/mojom/frame/navigation_initiator.mojom.h"
@@ -203,6 +204,7 @@
       public RenderProcessHostObserver,
       public SiteInstanceImpl::Observer,
       public service_manager::mojom::InterfaceProvider,
+      public blink::mojom::DocumentInterfaceBroker,
       public blink::mojom::LocalFrameHost,
       public CSPContext,
       public ui::AXActionHandler {
@@ -415,6 +417,12 @@
   // interface that the RenderFrameHost corresponding to the child frame should
   // bind to expose services to the renderer process. The caller takes care of
   // sending down the client end of the pipe to the child RenderFrame to use.
+  // |document_interface_broker_content_handle| and
+  // |document_interface_broker_blink_handle| are the pipe handles bound by
+  // to request ends of DocumentInterfaceProviderInterface in content and blink
+  // parts of the child frame. RenderFrameHost should bind these handles to
+  // expose services to the renderer process. The caller takes care of sending
+  // down the client end of the pipe to the child RenderFrame to use.
   // |browser_interface_broker_receiver| is the receiver end of
   // BrowserInterfaceBroker interface in the child frame. RenderFrameHost should
   // bind this receiver to expose services to the renderer process. The caller
@@ -424,6 +432,10 @@
       int new_routing_id,
       service_manager::mojom::InterfaceProviderRequest
           interface_provider_request,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_content_receiver,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_blink_receiver,
       mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
           browser_interface_broker_receiver,
       blink::WebTreeScopeType scope,
@@ -874,6 +886,16 @@
       service_manager::mojom::InterfaceProviderRequest
           interface_provider_request);
 
+  // Binds content and blink receiver ends of the DocumentInterfaceProvider
+  // interface through which services provided by this RenderFrameHost are
+  // exposed to the corresponding RenderFrame. The caller is responsible for
+  // plumbing the client ends to the the renderer process.
+  void BindDocumentInterfaceBrokerReceiver(
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          content_receiver,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          blink_receiver);
+
   // Binds the receiver end of the BrowserInterfaceBroker interface through
   // which services provided by this RenderFrameHost are exposed to the
   // corresponding RenderFrame. The caller is responsible for plumbing the
@@ -1649,6 +1671,11 @@
   void GetInterface(const std::string& interface_name,
                     mojo::ScopedMessagePipeHandle interface_pipe) override;
 
+  // blink::mojom::DocumentInterfaceBroker:
+  void GetFrameHostTestInterface(
+      mojo::PendingReceiver<blink::mojom::FrameHostTestInterface> receiver)
+      override;
+
   // Allows tests to disable the swapout event timer to simulate bugs that
   // happen before it fires (to avoid flakiness).
   void DisableSwapOutTimerForTesting();
@@ -2330,6 +2357,15 @@
   mojo::Binding<service_manager::mojom::InterfaceProvider>
       document_scoped_interface_provider_binding_;
 
+  // Receivers for the DocumentInterfaceBroker through which this
+  // RenderFrameHostImpl exposes document-scoped Mojo services to the currently
+  // active document in the corresponding RenderFrame. Because of the type
+  // difference between content and blink, two separate pipes are used.
+  mojo::Receiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content_receiver_{this};
+  mojo::Receiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink_receiver_{this};
+
   // BrowserInterfaceBroker implementation through which this
   // RenderFrameHostImpl exposes document-scoped Mojo services to the currently
   // active document in the corresponding RenderFrame.
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc
index 4eff37f7..951d859 100644
--- a/content/browser/frame_host/render_frame_host_manager_unittest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -1091,6 +1091,10 @@
 // Ensure that we can go back and forward even if a SwapOut ACK isn't received.
 // See http://crbug.com/93427.
 TEST_F(RenderFrameHostManagerTest, NavigateAfterMissingSwapOutACK) {
+  // When a page enters the BackForwardCache, the RenderFrameHost is not
+  // deleted.  Similarly, no SwapOutACK message is sent.
+  contents()->GetController().GetBackForwardCache().DisableForTesting(
+      BackForwardCache::TEST_ASSUMES_NO_CACHING);
   const GURL kUrl1("http://www.google.com/");
   const GURL kUrl2 = isolated_cross_site_url();
 
@@ -1575,6 +1579,10 @@
 // received.  (SwapOut and the corresponding ACK always occur after commit.)
 // Also tests that an early SwapOutACK is properly ignored.
 TEST_F(RenderFrameHostManagerTest, DeleteFrameAfterSwapOutACK) {
+  // When a page enters the BackForwardCache, the RenderFrameHost is not
+  // deleted.  Similarly, no SwapOutACK message is sent.
+  contents()->GetController().GetBackForwardCache().DisableForTesting(
+      BackForwardCache::TEST_ASSUMES_NO_CACHING);
   const GURL kUrl1("http://www.google.com/");
   const GURL kUrl2("http://www.chromium.org/");
 
@@ -1618,6 +1626,10 @@
 // Tests that the RenderFrameHost is properly swapped out when the SwapOut ACK
 // is received.  (SwapOut and the corresponding ACK always occur after commit.)
 TEST_F(RenderFrameHostManagerTest, SwapOutFrameAfterSwapOutACK) {
+  // When a page enters the BackForwardCache, the RenderFrameHost is not
+  // deleted.  Similarly, no SwapOutACK message is sent.
+  contents()->GetController().GetBackForwardCache().DisableForTesting(
+      BackForwardCache::TEST_ASSUMES_NO_CACHING);
   const GURL kUrl1("http://www.google.com/");
   const GURL kUrl2("http://www.chromium.org/");
 
@@ -1660,6 +1672,10 @@
 // This simulates a cross-site navigation to a synchronously committing URL
 // (e.g., a data URL) and ensures it works properly.
 TEST_F(RenderFrameHostManagerTest, CommitNewNavigationBeforeSendingSwapOut) {
+  // When a page enters the BackForwardCache, the RenderFrameHost is not
+  // deleted.  Similarly, no SwapOutACK message is sent.
+  contents()->GetController().GetBackForwardCache().DisableForTesting(
+      BackForwardCache::TEST_ASSUMES_NO_CACHING);
   const GURL kUrl1("http://www.google.com/");
   const GURL kUrl2("http://www.chromium.org/");
 
@@ -1781,6 +1797,8 @@
   contents()->GetMainFrame()->OnCreateChildFrame(
       contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "frame_name", "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -1788,6 +1806,8 @@
   contents()->GetMainFrame()->OnCreateChildFrame(
       contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "frame_name", "uniqueName2", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -1930,6 +1950,8 @@
   contents1->GetMainFrame()->OnCreateChildFrame(
       contents1->GetMainFrame()->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "frame_name", "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -1981,6 +2003,8 @@
   main_rfh->OnCreateChildFrame(
       main_rfh->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2149,6 +2173,8 @@
   tree1->AddFrame(
       root1, process_id, 12,
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2156,6 +2182,8 @@
   tree1->AddFrame(
       root1, process_id, 13,
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2170,6 +2198,8 @@
   tree2->AddFrame(
       root2, process_id, 22,
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2177,6 +2207,8 @@
   tree2->AddFrame(
       root2, process_id, 23,
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName3", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2196,6 +2228,8 @@
   tree4->AddFrame(
       root4, process_id, 42,
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), "uniqueName4", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2249,6 +2283,8 @@
   main_test_rfh()->OnCreateChildFrame(
       main_test_rfh()->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "frame1", "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2256,6 +2292,8 @@
   main_test_rfh()->OnCreateChildFrame(
       main_test_rfh()->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "frame2", "uniqueName2", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2263,6 +2301,8 @@
   main_test_rfh()->OnCreateChildFrame(
       main_test_rfh()->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "frame3", "uniqueName3", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2361,6 +2401,8 @@
   main_test_rfh()->OnCreateChildFrame(
       main_test_rfh()->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "frame1", "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -2857,6 +2899,8 @@
   main_test_rfh()->OnCreateChildFrame(
       main_test_rfh()->GetProcess()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, "frame1", "uniqueName1", false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
diff --git a/content/browser/frame_host/render_frame_message_filter.cc b/content/browser/frame_host/render_frame_message_filter.cc
index 3ce08e3..e4972dba 100644
--- a/content/browser/frame_host/render_frame_message_filter.cc
+++ b/content/browser/frame_host/render_frame_message_filter.cc
@@ -81,6 +81,8 @@
     blink::FrameOwnerElementType owner_type,
     int new_routing_id,
     mojo::ScopedMessagePipeHandle interface_provider_request_handle,
+    mojo::ScopedMessagePipeHandle document_interface_broker_content_handle,
+    mojo::ScopedMessagePipeHandle document_interface_broker_blink_handle,
     mojo::ScopedMessagePipeHandle browser_interface_broker_handle) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   RenderFrameHostImpl* render_frame_host =
@@ -92,6 +94,10 @@
         new_routing_id,
         service_manager::mojom::InterfaceProviderRequest(
             std::move(interface_provider_request_handle)),
+        mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>(
+            std::move(document_interface_broker_content_handle)),
+        mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>(
+            std::move(document_interface_broker_blink_handle)),
         mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>(
             std::move(browser_interface_broker_handle)),
         scope, frame_name, frame_unique_name, is_created_by_script,
@@ -272,6 +278,20 @@
   params_reply->new_interface_provider =
       interface_provider.PassInterface().PassHandle().release();
 
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content;
+  auto document_interface_broker_receiver_content =
+      document_interface_broker_content.InitWithNewPipeAndPassReceiver();
+  params_reply->document_interface_broker_content_handle =
+      document_interface_broker_content.PassPipe().release();
+
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink;
+  auto document_interface_broker_receiver_blink =
+      document_interface_broker_blink.InitWithNewPipeAndPassReceiver();
+  params_reply->document_interface_broker_blink_handle =
+      document_interface_broker_blink.PassPipe().release();
+
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker;
   auto browser_interface_broker_receiver =
@@ -290,6 +310,8 @@
           params.frame_policy, params.frame_owner_properties,
           params.frame_owner_element_type, params_reply->child_routing_id,
           interface_provider_request.PassMessagePipe(),
+          document_interface_broker_receiver_content.PassPipe(),
+          document_interface_broker_receiver_blink.PassPipe(),
           browser_interface_broker_receiver.PassPipe()));
 }
 
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc
index d822691d..8d87f50 100644
--- a/content/browser/navigation_browsertest.cc
+++ b/content/browser/navigation_browsertest.cc
@@ -100,6 +100,16 @@
     return intercepted_requests_;
   }
 
+  std::vector<mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>>&
+  intercepted_broker_content_receivers() {
+    return intercepted_broker_content_receivers_;
+  }
+
+  std::vector<mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>>&
+  intercepted_broker_blink_receivers() {
+    return intercepted_broker_blink_receivers_;
+  }
+
  protected:
   bool WillProcessDidCommitNavigation(
       RenderFrameHost* render_frame_host,
@@ -113,6 +123,16 @@
         *interface_params
             ? std::move((*interface_params)->interface_provider_request)
             : nullptr);
+    intercepted_broker_content_receivers_.push_back(
+        *interface_params
+            ? std::move((*interface_params)
+                            ->document_interface_broker_content_receiver)
+            : mojo::NullReceiver());
+    intercepted_broker_blink_receivers_.push_back(
+        *interface_params
+            ? std::move(
+                  (*interface_params)->document_interface_broker_blink_receiver)
+            : mojo::NullReceiver());
     if (loop_)
       loop_->Quit();
     // Do not send the message to the RenderFrameHostImpl.
@@ -126,6 +146,10 @@
       intercepted_messages_;
   std::vector<::service_manager::mojom::InterfaceProviderRequest>
       intercepted_requests_;
+  std::vector<mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>>
+      intercepted_broker_content_receivers_;
+  std::vector<mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>>
+      intercepted_broker_blink_receivers_;
   std::unique_ptr<base::RunLoop> loop_;
 };
 
diff --git a/content/browser/portal/portal.cc b/content/browser/portal/portal.cc
index edd87424..bbc4261 100644
--- a/content/browser/portal/portal.cc
+++ b/content/browser/portal/portal.cc
@@ -148,6 +148,10 @@
       owner_render_frame_host_->GetProcess()->GetID(),
       owner_render_frame_host_->GetProcess()->GetNextRoutingID(),
       std::move(interface_provider_request),
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver(),
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver(),
       mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>()
           .InitWithNewPipeAndPassReceiver(),
       blink::WebTreeScopeType::kDocument, "", "", true,
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 66ec7a1..9ad27a3 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1501,7 +1501,7 @@
 
   // This instance of PushMessagingManager is only used from clients
   // bound to service workers (i.e. PushProvider), since frame-bound
-  // clients will rely on BrowserInterfaceBroker instead. Therefore,
+  // clients will rely on DocumentInterfaceBroker instead. Therefore,
   // pass an invalid frame ID here.
   //
   // Constructing the manager must occur after RegisterHost(), since
@@ -4166,8 +4166,11 @@
   // service worker, try to use an unused process host. One might have been
   // created for a navigation and this will let the navigation and the service
   // worker share the same process.
-  if (!render_process_host && is_unmatched_service_worker)
+  if (base::FeatureList::IsEnabled(
+          features::kServiceWorkerPrefersUnusedProcess) &&
+      !render_process_host && is_unmatched_service_worker) {
     render_process_host = GetUnusedProcessHostForServiceWorker(site_instance);
+  }
 
   // See if the spare RenderProcessHost can be used.
   auto& spare_process_manager = SpareRenderProcessHostManager::GetInstance();
diff --git a/content/browser/renderer_host/render_process_host_unittest.cc b/content/browser/renderer_host/render_process_host_unittest.cc
index 05b0d08..6e4d0c4 100644
--- a/content/browser/renderer_host/render_process_host_unittest.cc
+++ b/content/browser/renderer_host/render_process_host_unittest.cc
@@ -134,6 +134,8 @@
   main_test_rfh()->OnCreateChildFrame(
       process()->GetNextRoutingID(),
       TestRenderFrameHost::CreateStubInterfaceProviderRequest(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
+      TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver(),
       TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, std::string(), unique_name, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index b34aa688..e7528c8 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -349,6 +349,11 @@
         mojom::DocumentScopedInterfaceBundle::New();
     main_rfh->BindInterfaceProviderRequest(mojo::MakeRequest(
         &params->main_frame_interface_bundle->interface_provider));
+    main_rfh->BindDocumentInterfaceBrokerReceiver(
+        params->main_frame_interface_bundle->document_interface_broker_content
+            .InitWithNewPipeAndPassReceiver(),
+        params->main_frame_interface_bundle->document_interface_broker_blink
+            .InitWithNewPipeAndPassReceiver());
     main_rfh->BindBrowserInterfaceBrokerReceiver(
         params->main_frame_interface_bundle->browser_interface_broker
             .InitWithNewPipeAndPassReceiver());
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index d303c1b5..8bc61d4 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -749,7 +749,7 @@
 // rule, see: RenderFrameHostImplBrowserTest.
 // InterfaceProviderRequestIsOptionalForFirstCommit.
 // TODO(crbug.com/718652): when all clients are converted to use
-// BrowserInterfaceBroker, InterfaceProviderRequest-related code will be
+// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be
 // removed.
 IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest,
                        MissingInterfaceProviderOnNonSameDocumentCommit) {
@@ -883,6 +883,10 @@
           std::move(params),
           mojom::DidCommitProvisionalLoadInterfaceParams::New(
               mojo::MakeRequest(&isolated_interface_provider),
+              mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+                  .InitWithNewPipeAndPassReceiver(),
+              mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+                  .InitWithNewPipeAndPassReceiver(),
               mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>()
                   .InitWithNewPipeAndPassReceiver()));
 
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 0bc11cdd..b408156 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -3069,7 +3069,7 @@
   void FindRegistrationOnCoreThread(const GURL& document_url,
                                     blink::ServiceWorkerStatusCode* status,
                                     base::OnceClosure continuation) {
-    wrapper()->FindReadyRegistrationForDocument(
+    wrapper()->FindReadyRegistrationForClientUrl(
         document_url,
         base::BindOnce(
             &ServiceWorkerBlackBoxBrowserTest::DidFindRegistrationOnCoreThread,
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index 6ed680a8..2f80ff2 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -690,7 +690,7 @@
 void ServiceWorkerContextCore::CheckHasServiceWorker(
     const GURL& url,
     ServiceWorkerContext::CheckHasServiceWorkerCallback callback) {
-  storage()->FindRegistrationForDocument(
+  storage()->FindRegistrationForClientUrl(
       url, base::BindOnce(&ServiceWorkerContextCore::
                               DidFindRegistrationForCheckHasServiceWorker,
                           AsWeakPtr(), std::move(callback)));
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index 34119cd7..55c7267 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -897,19 +897,19 @@
   return provider_host_ids;
 }
 
-void ServiceWorkerContextWrapper::FindReadyRegistrationForDocument(
-    const GURL& document_url,
+void ServiceWorkerContextWrapper::FindReadyRegistrationForClientUrl(
+    const GURL& client_url,
     FindRegistrationCallback callback) {
   RunOrPostTaskOnCoreThread(
       FROM_HERE,
       base::BindOnce(&ServiceWorkerContextWrapper::
-                         FindReadyRegistrationForDocumentOnCoreThread,
-                     this, document_url, std::move(callback),
+                         FindReadyRegistrationForClientUrlOnCoreThread,
+                     this, client_url, std::move(callback),
                      base::ThreadTaskRunnerHandle::Get()));
 }
 
-void ServiceWorkerContextWrapper::FindReadyRegistrationForDocumentOnCoreThread(
-    const GURL& document_url,
+void ServiceWorkerContextWrapper::FindReadyRegistrationForClientUrlOnCoreThread(
+    const GURL& client_url,
     FindRegistrationCallback callback,
     scoped_refptr<base::TaskRunner> callback_runner) {
   DCHECK_CURRENTLY_ON(GetCoreThreadId());
@@ -920,8 +920,8 @@
                        blink::ServiceWorkerStatusCode::kErrorAbort, nullptr));
     return;
   }
-  context_core_->storage()->FindRegistrationForDocument(
-      net::SimplifyUrlForRequest(document_url),
+  context_core_->storage()->FindRegistrationForClientUrl(
+      net::SimplifyUrlForRequest(client_url),
       base::BindOnce(
           &ServiceWorkerContextWrapper::DidFindRegistrationForFindReady, this,
           std::move(callback), std::move(callback_runner)));
@@ -1695,7 +1695,7 @@
     std::move(callback).Run(StartServiceWorkerForNavigationHintResult::FAILED);
     return;
   }
-  context_core_->storage()->FindRegistrationForDocument(
+  context_core_->storage()->FindRegistrationForClientUrl(
       net::SimplifyUrlForRequest(document_url),
       base::BindOnce(
           &ServiceWorkerContextWrapper::DidFindRegistrationForNavigationHint,
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index 63df2f23a..fe166a1 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -190,7 +190,7 @@
   std::unique_ptr<std::vector<GlobalFrameRoutingId>> GetProviderHostIds(
       const GURL& origin) const;
 
-  // Returns the registration whose scope longest matches |document_url|. It is
+  // Returns the registration whose scope longest matches |client_url|. It is
   // guaranteed that the returned registration has the activated worker.
   //
   //  - If the registration is not found, returns ERROR_NOT_FOUND.
@@ -201,8 +201,8 @@
   //    activated.
   //
   // Can be called on any thread, and the callback is called on that thread.
-  void FindReadyRegistrationForDocument(const GURL& document_url,
-                                        FindRegistrationCallback callback);
+  void FindReadyRegistrationForClientUrl(const GURL& client_url,
+                                         FindRegistrationCallback callback);
 
   // Returns the registration for |scope|. It is guaranteed that the returned
   // registration has the activated worker.
@@ -486,8 +486,8 @@
       const GURL& origin,
       BoolCallback callback,
       scoped_refptr<base::TaskRunner> callback_runner) const;
-  void FindReadyRegistrationForDocumentOnCoreThread(
-      const GURL& document_url,
+  void FindReadyRegistrationForClientUrlOnCoreThread(
+      const GURL& client_url,
       FindRegistrationCallback callback,
       scoped_refptr<base::TaskRunner> callback_runner);
   void GetAllRegistrationsOnCoreThread(GetRegistrationsInfosCallback callback);
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc
index de92181..c01c9076 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -164,7 +164,7 @@
   resource_context_ = resource_context;
 
   // Look up a registration.
-  context_->storage()->FindRegistrationForDocument(
+  context_->storage()->FindRegistrationForClientUrl(
       stripped_url_,
       base::BindOnce(
           &ServiceWorkerControlleeRequestHandler::ContinueWithRegistration,
@@ -492,7 +492,7 @@
       !original_registration->installing_version()) {
     // Update failed. Look up the registration again since the original
     // registration was possibly unregistered in the meantime.
-    context_->storage()->FindRegistrationForDocument(
+    context_->storage()->FindRegistrationForClientUrl(
         stripped_url_,
         base::BindOnce(
             &ServiceWorkerControlleeRequestHandler::ContinueWithRegistration,
@@ -548,7 +548,7 @@
     // When the status is REDUNDANT, the update failed (eg: script error), we
     // continue with the incumbent version.
     // In case unregister job may have run, look up the registration again.
-    context_->storage()->FindRegistrationForDocument(
+    context_->storage()->FindRegistrationForClientUrl(
         stripped_url_,
         base::BindOnce(
             &ServiceWorkerControlleeRequestHandler::ContinueWithRegistration,
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc
index 7205a36..c736e9e 100644
--- a/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -257,12 +257,12 @@
   base::RunLoop run_loop;
   base::RepeatingClosure barrier_closure =
       base::BarrierClosure(2, run_loop.QuitClosure());
-  storage()->FindRegistrationForDocument(
+  storage()->FindRegistrationForClientUrl(
       GURL("https://www.example.com/"),
       SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk, &registration1,
                             barrier_closure));
   scoped_refptr<ServiceWorkerRegistration> registration2;
-  storage()->FindRegistrationForDocument(
+  storage()->FindRegistrationForClientUrl(
       GURL("https://www.example.com/"),
       SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk, &registration2,
                             barrier_closure));
@@ -285,13 +285,13 @@
   base::RunLoop run_loop;
   base::RepeatingClosure barrier_closure =
       base::BarrierClosure(2, run_loop.QuitClosure());
-  storage()->FindRegistrationForDocument(
+  storage()->FindRegistrationForClientUrl(
       GURL("https://www.example.com/one"),
       SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk, &registration1,
                             barrier_closure));
 
   scoped_refptr<ServiceWorkerRegistration> registration2;
-  storage()->FindRegistrationForDocument(
+  storage()->FindRegistrationForClientUrl(
       GURL("https://www.example.com/two"),
       SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk, &registration2,
                             barrier_closure));
@@ -316,11 +316,11 @@
   base::RunLoop run_loop;
   base::RepeatingClosure barrier_closure =
       base::BarrierClosure(2, run_loop.QuitClosure());
-  storage()->FindRegistrationForDocument(
+  storage()->FindRegistrationForClientUrl(
       scope1, SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk,
                                     &registration1, barrier_closure));
   scoped_refptr<ServiceWorkerRegistration> registration2;
-  storage()->FindRegistrationForDocument(
+  storage()->FindRegistrationForClientUrl(
       scope2, SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk,
                                     &registration2, barrier_closure));
 
diff --git a/content/browser/service_worker/service_worker_process_browsertest.cc b/content/browser/service_worker/service_worker_process_browsertest.cc
index d92a32c..07224df 100644
--- a/content/browser/service_worker/service_worker_process_browsertest.cc
+++ b/content/browser/service_worker/service_worker_process_browsertest.cc
@@ -6,12 +6,14 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/content_client.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test.h"
@@ -28,7 +30,10 @@
     : public ContentBrowserTest,
       public ::testing::WithParamInterface<bool> {
  public:
-  ServiceWorkerProcessBrowserTest() = default;
+  ServiceWorkerProcessBrowserTest() {
+    feature_list_.InitAndEnableFeature(
+        features::kServiceWorkerPrefersUnusedProcess);
+  }
   ~ServiceWorkerProcessBrowserTest() override = default;
 
   ServiceWorkerProcessBrowserTest(const ServiceWorkerProcessBrowserTest&) =
@@ -111,6 +116,7 @@
   }
 
  private:
+  base::test::ScopedFeatureList feature_list_;
   scoped_refptr<ServiceWorkerContextWrapper> wrapper_;
 };
 
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc
index 5be534d..d835ab1 100644
--- a/content/browser/service_worker/service_worker_provider_host.cc
+++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -1146,7 +1146,7 @@
   TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker",
                            "ServiceWorkerProviderHost::GetRegistration",
                            trace_id, "Client URL", client_url.spec());
-  context_->storage()->FindRegistrationForDocument(
+  context_->storage()->FindRegistrationForClientUrl(
       client_url, base::AdaptCallbackForRepeating(base::BindOnce(
                       &ServiceWorkerProviderHost::GetRegistrationComplete,
                       AsWeakPtr(), std::move(callback), trace_id)));
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc
index 31a16be..1992a741 100644
--- a/content/browser/service_worker/service_worker_storage.cc
+++ b/content/browser/service_worker/service_worker_storage.cc
@@ -139,10 +139,10 @@
                                old_storage->special_storage_policy_.get()));
 }
 
-void ServiceWorkerStorage::FindRegistrationForDocument(
-    const GURL& document_url,
+void ServiceWorkerStorage::FindRegistrationForClientUrl(
+    const GURL& client_url,
     FindRegistrationCallback callback) {
-  DCHECK(!document_url.has_ref());
+  DCHECK(!client_url.has_ref());
   switch (state_) {
     case STORAGE_STATE_DISABLED:
       CompleteFindNow(scoped_refptr<ServiceWorkerRegistration>(),
@@ -152,30 +152,30 @@
     case STORAGE_STATE_INITIALIZING:  // Fall-through.
     case STORAGE_STATE_UNINITIALIZED:
       LazyInitialize(base::BindOnce(
-          &ServiceWorkerStorage::FindRegistrationForDocument,
-          weak_factory_.GetWeakPtr(), document_url, std::move(callback)));
+          &ServiceWorkerStorage::FindRegistrationForClientUrl,
+          weak_factory_.GetWeakPtr(), client_url, std::move(callback)));
       TRACE_EVENT_INSTANT1(
           "ServiceWorker",
-          "ServiceWorkerStorage::FindRegistrationForDocument:LazyInitialize",
-          TRACE_EVENT_SCOPE_THREAD, "URL", document_url.spec());
+          "ServiceWorkerStorage::FindRegistrationForClientUrl:LazyInitialize",
+          TRACE_EVENT_SCOPE_THREAD, "URL", client_url.spec());
       return;
     case STORAGE_STATE_INITIALIZED:
       break;
   }
 
   // See if there are any stored registrations for the origin.
-  if (!base::Contains(registered_origins_, document_url.GetOrigin())) {
+  if (!base::Contains(registered_origins_, client_url.GetOrigin())) {
     // Look for something currently being installed.
     scoped_refptr<ServiceWorkerRegistration> installing_registration =
-        FindInstallingRegistrationForDocument(document_url);
+        FindInstallingRegistrationForClientUrl(client_url);
     blink::ServiceWorkerStatusCode status =
         installing_registration
             ? blink::ServiceWorkerStatusCode::kOk
             : blink::ServiceWorkerStatusCode::kErrorNotFound;
     TRACE_EVENT_INSTANT2(
         "ServiceWorker",
-        "ServiceWorkerStorage::FindRegistrationForDocument:CheckInstalling",
-        TRACE_EVENT_SCOPE_THREAD, "URL", document_url.spec(), "Status",
+        "ServiceWorkerStorage::FindRegistrationForClientUrl:CheckInstalling",
+        TRACE_EVENT_SCOPE_THREAD, "URL", client_url.spec(), "Status",
         blink::ServiceWorkerStatusToString(status));
     CompleteFindNow(std::move(installing_registration), status,
                     std::move(callback));
@@ -186,15 +186,15 @@
   // callback id.
   int64_t callback_id = base::TimeTicks::Now().ToInternalValue();
   TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker",
-                           "ServiceWorkerStorage::FindRegistrationForDocument",
-                           callback_id, "URL", document_url.spec());
+                           "ServiceWorkerStorage::FindRegistrationForClientUrl",
+                           callback_id, "URL", client_url.spec());
   database_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(
-          &FindForDocumentInDB, database_.get(),
-          base::ThreadTaskRunnerHandle::Get(), document_url,
-          base::BindOnce(&ServiceWorkerStorage::DidFindRegistrationForDocument,
-                         weak_factory_.GetWeakPtr(), document_url,
+          &FindForClientUrlInDB, database_.get(),
+          base::ThreadTaskRunnerHandle::Get(), client_url,
+          base::BindOnce(&ServiceWorkerStorage::DidFindRegistrationForClientUrl,
+                         weak_factory_.GetWeakPtr(), client_url,
                          std::move(callback), callback_id)));
 }
 
@@ -1242,8 +1242,8 @@
   pending_tasks_.clear();
 }
 
-void ServiceWorkerStorage::DidFindRegistrationForDocument(
-    const GURL& document_url,
+void ServiceWorkerStorage::DidFindRegistrationForClientUrl(
+    const GURL& client_url,
     FindRegistrationCallback callback,
     int64_t callback_id,
     const ServiceWorkerDatabase::RegistrationData& data,
@@ -1252,17 +1252,15 @@
   if (status == ServiceWorkerDatabase::STATUS_OK) {
     ReturnFoundRegistration(std::move(callback), data, resources);
     TRACE_EVENT_ASYNC_END1(
-        "ServiceWorker",
-        "ServiceWorkerStorage::FindRegistrationForDocument",
-        callback_id,
-        "Status", ServiceWorkerDatabase::StatusToString(status));
+        "ServiceWorker", "ServiceWorkerStorage::FindRegistrationForClientUrl",
+        callback_id, "Status", ServiceWorkerDatabase::StatusToString(status));
     return;
   }
 
   if (status == ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) {
     // Look for something currently being installed.
     scoped_refptr<ServiceWorkerRegistration> installing_registration =
-        FindInstallingRegistrationForDocument(document_url);
+        FindInstallingRegistrationForClientUrl(client_url);
     blink::ServiceWorkerStatusCode installing_status =
         installing_registration
             ? blink::ServiceWorkerStatusCode::kOk
@@ -1270,7 +1268,7 @@
     std::move(callback).Run(installing_status,
                             std::move(installing_registration));
     TRACE_EVENT_ASYNC_END2(
-        "ServiceWorker", "ServiceWorkerStorage::FindRegistrationForDocument",
+        "ServiceWorker", "ServiceWorkerStorage::FindRegistrationForClientUrl",
         callback_id, "Status", ServiceWorkerDatabase::StatusToString(status),
         "Info",
         (installing_status == blink::ServiceWorkerStatusCode::kOk)
@@ -1283,10 +1281,8 @@
   std::move(callback).Run(DatabaseStatusToStatusCode(status),
                           scoped_refptr<ServiceWorkerRegistration>());
   TRACE_EVENT_ASYNC_END1(
-      "ServiceWorker",
-      "ServiceWorkerStorage::FindRegistrationForDocument",
-      callback_id,
-      "Status", ServiceWorkerDatabase::StatusToString(status));
+      "ServiceWorker", "ServiceWorkerStorage::FindRegistrationForClientUrl",
+      callback_id, "Status", ServiceWorkerDatabase::StatusToString(status));
 }
 
 void ServiceWorkerStorage::DidFindRegistrationForScope(
@@ -1677,11 +1673,11 @@
 }
 
 ServiceWorkerRegistration*
-ServiceWorkerStorage::FindInstallingRegistrationForDocument(
-    const GURL& document_url) {
-  DCHECK(!document_url.has_ref());
+ServiceWorkerStorage::FindInstallingRegistrationForClientUrl(
+    const GURL& client_url) {
+  DCHECK(!client_url.has_ref());
 
-  LongestScopeMatcher matcher(document_url);
+  LongestScopeMatcher matcher(client_url);
   ServiceWorkerRegistration* match = nullptr;
 
   // TODO(nhiroki): This searches over installing registrations linearly and it
@@ -1994,12 +1990,12 @@
 }
 
 // static
-void ServiceWorkerStorage::FindForDocumentInDB(
+void ServiceWorkerStorage::FindForClientUrlInDB(
     ServiceWorkerDatabase* database,
     scoped_refptr<base::SequencedTaskRunner> original_task_runner,
-    const GURL& document_url,
+    const GURL& client_url,
     FindInDBCallback callback) {
-  GURL origin = document_url.GetOrigin();
+  GURL origin = client_url.GetOrigin();
   RegistrationList registration_data_list;
   ServiceWorkerDatabase::Status status = database->GetRegistrationsForOrigin(
       origin, &registration_data_list, nullptr);
@@ -2016,7 +2012,7 @@
   status = ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND;
 
   // Find one with a scope match.
-  LongestScopeMatcher matcher(document_url);
+  LongestScopeMatcher matcher(client_url);
   int64_t match = blink::mojom::kInvalidServiceWorkerRegistrationId;
   for (const auto& registration_data : registration_data_list)
     if (matcher.MatchLongest(registration_data.scope))
diff --git a/content/browser/service_worker/service_worker_storage.h b/content/browser/service_worker/service_worker_storage.h
index d00e619f..7e965b1 100644
--- a/content/browser/service_worker/service_worker_storage.h
+++ b/content/browser/service_worker/service_worker_storage.h
@@ -103,18 +103,18 @@
       ServiceWorkerContextCore* context,
       ServiceWorkerStorage* old_storage);
 
-  // Finds registration for |document_url| or |scope| or |registration_id|.
+  // Finds registration for |client_url| or |scope| or |registration_id|.
   // The Find methods will find stored and initially installing registrations.
   // Returns blink::ServiceWorkerStatusCode::kOk with non-null
   // registration if registration is found, or returns
   // blink::ServiceWorkerStatusCode::kErrorNotFound if no
   // matching registration is found.  The FindRegistrationForScope method is
   // guaranteed to return asynchronously. However, the methods to find
-  // for |document_url| or |registration_id| may complete immediately
+  // for |client_url| or |registration_id| may complete immediately
   // (the callback may be called prior to the method returning) or
   // asynchronously.
-  void FindRegistrationForDocument(const GURL& document_url,
-                                   FindRegistrationCallback callback);
+  void FindRegistrationForClientUrl(const GURL& client_url,
+                                    FindRegistrationCallback callback);
   void FindRegistrationForScope(const GURL& scope,
                                 FindRegistrationCallback callback);
   void FindRegistrationForId(int64_t registration_id,
@@ -383,8 +383,8 @@
   void LazyInitialize(base::OnceClosure callback);
   void DidReadInitialData(std::unique_ptr<InitialData> data,
                           ServiceWorkerDatabase::Status status);
-  void DidFindRegistrationForDocument(
-      const GURL& document_url,
+  void DidFindRegistrationForClientUrl(
+      const GURL& client_url,
       FindRegistrationCallback callback,
       int64_t callback_id,
       const ServiceWorkerDatabase::RegistrationData& data,
@@ -450,8 +450,8 @@
   scoped_refptr<ServiceWorkerRegistration> GetOrCreateRegistration(
       const ServiceWorkerDatabase::RegistrationData& data,
       const ResourceList& resources);
-  ServiceWorkerRegistration* FindInstallingRegistrationForDocument(
-      const GURL& document_url);
+  ServiceWorkerRegistration* FindInstallingRegistrationForClientUrl(
+      const GURL& client_url);
   ServiceWorkerRegistration* FindInstallingRegistrationForScope(
       const GURL& scope);
   ServiceWorkerRegistration* FindInstallingRegistrationForId(
@@ -499,10 +499,10 @@
       const ServiceWorkerDatabase::RegistrationData& registration,
       const ResourceList& resources,
       WriteRegistrationCallback callback);
-  static void FindForDocumentInDB(
+  static void FindForClientUrlInDB(
       ServiceWorkerDatabase* database,
       scoped_refptr<base::SequencedTaskRunner> original_task_runner,
-      const GURL& document_url,
+      const GURL& client_url,
       FindInDBCallback callback);
   static void FindForScopeInDB(
       ServiceWorkerDatabase* database,
diff --git a/content/browser/service_worker/service_worker_storage_unittest.cc b/content/browser/service_worker/service_worker_storage_unittest.cc
index 306420b0..5c3bb2e 100644
--- a/content/browser/service_worker/service_worker_storage_unittest.cc
+++ b/content/browser/service_worker/service_worker_storage_unittest.cc
@@ -470,12 +470,12 @@
     return result.value();
   }
 
-  blink::ServiceWorkerStatusCode FindRegistrationForDocument(
+  blink::ServiceWorkerStatusCode FindRegistrationForClientUrl(
       const GURL& document_url,
       scoped_refptr<ServiceWorkerRegistration>* registration) {
     base::Optional<blink::ServiceWorkerStatusCode> result;
     base::RunLoop loop;
-    storage()->FindRegistrationForDocument(
+    storage()->FindRegistrationForClientUrl(
         document_url, base::BindOnce(&FindCallback, loop.QuitClosure(), &result,
                                      registration));
     loop.Run();
@@ -594,7 +594,7 @@
 
   scoped_refptr<ServiceWorkerRegistration> found_registration;
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorAbort,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorAbort,
             FindRegistrationForScope(kScope, &found_registration));
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorAbort,
@@ -688,7 +688,7 @@
 
   // We shouldn't find anything without having stored anything.
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   EXPECT_FALSE(found_registration.get());
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
@@ -726,7 +726,7 @@
 
   // Now we should find it and get the live ptr back immediately.
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   EXPECT_EQ(live_registration, found_registration);
   EXPECT_EQ(kResource1Size + kResource2Size,
             live_registration->resources_total_size_bytes());
@@ -762,9 +762,9 @@
   // Drop the live registration, but keep the version live.
   live_registration = nullptr;
 
-  // Now FindRegistrationForDocument should be async.
+  // Now FindRegistrationForClientUrl should be async.
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   ASSERT_TRUE(found_registration.get());
   EXPECT_EQ(kRegistrationId, found_registration->id());
   EXPECT_TRUE(found_registration->HasOneRef());
@@ -836,7 +836,7 @@
   // The Find methods should return a registration with an active version
   // and the expected update time.
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   ASSERT_TRUE(found_registration.get());
   EXPECT_EQ(kRegistrationId, found_registration->id());
   EXPECT_TRUE(found_registration->HasOneRef());
@@ -879,7 +879,7 @@
   EXPECT_FALSE(found_registration.get());
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   EXPECT_FALSE(found_registration.get());
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
@@ -919,7 +919,7 @@
   found_registration = nullptr;
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   EXPECT_EQ(live_registration, found_registration);
   found_registration = nullptr;
 
@@ -960,7 +960,7 @@
   EXPECT_FALSE(found_registration.get());
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   EXPECT_FALSE(found_registration.get());
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
@@ -1649,7 +1649,7 @@
 
   // Find a registration among installing ones.
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   EXPECT_EQ(live_registration2, found_registration);
   found_registration = nullptr;
 
@@ -1674,7 +1674,7 @@
 
   // Find a registration among installed ones.
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kDocumentUrl, &found_registration));
+            FindRegistrationForClientUrl(kDocumentUrl, &found_registration));
   EXPECT_EQ(live_registration2, found_registration);
 }
 
@@ -1721,13 +1721,13 @@
   scoped_refptr<ServiceWorkerRegistration> found_registration;
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(scope1, &found_registration));
+            FindRegistrationForClientUrl(scope1, &found_registration));
   ASSERT_TRUE(found_registration->active_version());
   // origin_trial_tokens must be unset.
   EXPECT_FALSE(found_registration->active_version()->origin_trial_tokens());
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(scope2, &found_registration));
+            FindRegistrationForClientUrl(scope2, &found_registration));
   ASSERT_TRUE(found_registration->active_version());
   // Empty origin_trial_tokens must exist.
   ASSERT_TRUE(found_registration->active_version()->origin_trial_tokens());
@@ -1851,7 +1851,7 @@
 
   scoped_refptr<ServiceWorkerRegistration> found_registration;
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kScope, &found_registration));
+            FindRegistrationForClientUrl(kScope, &found_registration));
   ASSERT_TRUE(found_registration->active_version());
   const blink::TrialTokenValidator::FeatureToTokensMap& found_tokens =
       *found_registration->active_version()->origin_trial_tokens();
@@ -1881,7 +1881,7 @@
 
   scoped_refptr<ServiceWorkerRegistration> found_registration;
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(scope1, &found_registration));
+            FindRegistrationForClientUrl(scope1, &found_registration));
   const blink::mojom::NavigationPreloadState& registration_state =
       found_registration->navigation_preload_state();
   EXPECT_FALSE(registration_state.enabled);
@@ -1927,7 +1927,7 @@
   // Read the registration. The main script's response time should be gettable.
   scoped_refptr<ServiceWorkerRegistration> found_registration;
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kScope, &found_registration));
+            FindRegistrationForClientUrl(kScope, &found_registration));
   ASSERT_TRUE(found_registration);
   auto* waiting_version = found_registration->waiting_version();
   ASSERT_TRUE(waiting_version);
@@ -2013,7 +2013,7 @@
 
   scoped_refptr<ServiceWorkerRegistration> found_registration;
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kScope, &found_registration));
+            FindRegistrationForClientUrl(kScope, &found_registration));
   const blink::mojom::NavigationPreloadState& registration_state =
       found_registration->navigation_preload_state();
   EXPECT_FALSE(registration_state.enabled);
@@ -2051,7 +2051,7 @@
 
   scoped_refptr<ServiceWorkerRegistration> found_registration;
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            FindRegistrationForDocument(kScope, &found_registration));
+            FindRegistrationForClientUrl(kScope, &found_registration));
   const blink::mojom::NavigationPreloadState& registration_state =
       found_registration->navigation_preload_state();
   EXPECT_TRUE(registration_state.enabled);
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 17147204..26f26d2 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -6200,6 +6200,10 @@
     params->routing_id = frame_routing_id;
     params->interface_bundle = mojom::DocumentScopedInterfaceBundle::New();
     mojo::MakeRequest(&params->interface_bundle->interface_provider);
+    ignore_result(params->interface_bundle->document_interface_broker_content
+                      .InitWithNewPipeAndPassReceiver());
+    ignore_result(params->interface_bundle->document_interface_broker_blink
+                      .InitWithNewPipeAndPassReceiver());
     ignore_result(params->interface_bundle->browser_interface_broker
                       .InitWithNewPipeAndPassReceiver());
     params->previous_routing_id = previous_routing_id;
@@ -6266,6 +6270,10 @@
     params->routing_id = frame_routing_id;
     params->interface_bundle = mojom::DocumentScopedInterfaceBundle::New();
     mojo::MakeRequest(&params->interface_bundle->interface_provider);
+    ignore_result(params->interface_bundle->document_interface_broker_content
+                      .InitWithNewPipeAndPassReceiver());
+    ignore_result(params->interface_bundle->document_interface_broker_blink
+                      .InitWithNewPipeAndPassReceiver());
     ignore_result(params->interface_bundle->browser_interface_broker
                       .InitWithNewPipeAndPassReceiver());
     params->previous_routing_id = IPC::mojom::kRoutingIdNone;
@@ -14427,6 +14435,10 @@
           std::move(params),
           mojom::DidCommitProvisionalLoadInterfaceParams::New(
               mojo::MakeRequest(&interface_provider),
+              mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+                  .InitWithNewPipeAndPassReceiver(),
+              mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+                  .InitWithNewPipeAndPassReceiver(),
               mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>()
                   .InitWithNewPipeAndPassReceiver()));
 
diff --git a/content/common/document_scoped_interface_bundle.mojom b/content/common/document_scoped_interface_bundle.mojom
index 9c52764..63f816b9 100644
--- a/content/common/document_scoped_interface_bundle.mojom
+++ b/content/common/document_scoped_interface_bundle.mojom
@@ -5,6 +5,7 @@
 module content.mojom;
 
 import "services/service_manager/public/mojom/interface_provider.mojom";
+import "third_party/blink/public/mojom/frame/document_interface_broker.mojom";
 import "third_party/blink/public/mojom/browser_interface_broker.mojom";
 
 struct DocumentScopedInterfaceBundle {
@@ -12,10 +13,17 @@
   // services exposed by its RenderFrameHost.
   service_manager.mojom.InterfaceProvider interface_provider;
 
+  // The DocumentInterfaceBroker through which the RenderFrame can access
+  // interfaces exposed by its RenderFrameHost
+  pending_remote<blink.mojom.DocumentInterfaceBroker>
+      document_interface_broker_content;
+  pending_remote<blink.mojom.DocumentInterfaceBroker>
+      document_interface_broker_blink;
+
   // The BrowserInterfaceBroker through which the RenderFrame can access
-  // interfaces exposed by its RenderFrameHost.
-  // It will eventually replace interface_provider above and become the
-  // only way to get document-scoped interfaces from the browser
-  // (see crbug.com/985120).
+  // interfaces exposed by its RenderFrameHost
+  // It will eventually replace interface_provider and
+  // document_interface_broker* above and become the only way to get
+  // document-scoped interfaces from the browser (see crbug.com/985120)
   pending_remote<blink.mojom.BrowserInterfaceBroker> browser_interface_broker;
 };
diff --git a/content/common/frame.mojom b/content/common/frame.mojom
index 9df7cb7..a4699d3 100644
--- a/content/common/frame.mojom
+++ b/content/common/frame.mojom
@@ -377,7 +377,7 @@
   // Sent by the renderer when a navigation commits in the frame.
 
   // If |interface_params| is non-empty, the FrameHost implementation
-  // must unbind the old InterfaceProvider and BrowserInterfaceBroker
+  // must unbind the old InterfaceProvider and DocumentInterfaceBroker
   // connections, and drop any interface requests pending on them.
   // Then it should bind the appropriate requests and start servicing
   // GetInterface messages coming in on these new connections
@@ -387,8 +387,9 @@
   // is set for cross-document navigations. This prevents origin confusion by
   // ensuring that interface requests racing with navigation commit will be
   // either ignored, or serviced correctly in the security context of the
-  // document they originated from (based on which InterfaceProvider or
-  // BrowserInterfaceBroker connection the GetInterface messages arrive on).
+  // document they originated from (based on which InterfaceProvider connection
+  // the GetInterface messages arrive on or DocumentInterfaceBroker
+  // connection the Get<interface> messages arrive on).
   DidCommitProvisionalLoad(
       DidCommitProvisionalLoadParams params,
       DidCommitProvisionalLoadInterfaceParams? interface_params);
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 9b506e8..9c06143 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -568,6 +568,10 @@
 IPC_STRUCT_BEGIN(FrameHostMsg_CreateChildFrame_Params_Reply)
   IPC_STRUCT_MEMBER(int32_t, child_routing_id)
   IPC_STRUCT_MEMBER(mojo::MessagePipeHandle, new_interface_provider)
+  IPC_STRUCT_MEMBER(mojo::MessagePipeHandle,
+                    document_interface_broker_content_handle)
+  IPC_STRUCT_MEMBER(mojo::MessagePipeHandle,
+                    document_interface_broker_blink_handle)
   IPC_STRUCT_MEMBER(mojo::MessagePipeHandle, browser_interface_broker_handle)
   IPC_STRUCT_MEMBER(base::UnguessableToken, devtools_frame_token)
 IPC_STRUCT_END()
diff --git a/content/common/frame_messages.mojom b/content/common/frame_messages.mojom
index 9607369..0ad8ece 100644
--- a/content/common/frame_messages.mojom
+++ b/content/common/frame_messages.mojom
@@ -6,12 +6,17 @@
 
 import "services/service_manager/public/mojom/interface_provider.mojom";
 import "third_party/blink/public/mojom/browser_interface_broker.mojom";
+import "third_party/blink/public/mojom/frame/document_interface_broker.mojom";
 
 [Native]
 struct DidCommitProvisionalLoadParams;
 
 struct DidCommitProvisionalLoadInterfaceParams {
   service_manager.mojom.InterfaceProvider& interface_provider_request;
+  pending_receiver<blink.mojom.DocumentInterfaceBroker>
+      document_interface_broker_content_receiver;
+  pending_receiver<blink.mojom.DocumentInterfaceBroker>
+      document_interface_broker_blink_receiver;
   pending_receiver<blink.mojom.BrowserInterfaceBroker>
       browser_interface_broker_receiver;
 };
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index df914d3..98ff77d5 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -484,6 +484,13 @@
 const base::Feature kServiceWorkerPaymentApps{"ServiceWorkerPaymentApps",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
 
+// If enabled, prefer to start service workers in an unused renderer process if
+// available. This helps let navigations and service workers use the same
+// process when a process was already created for a navigation but not yet
+// claimed by it (as is common for navigations from the Android New Tab Page).
+const base::Feature kServiceWorkerPrefersUnusedProcess{
+    "ServiceWorkerPrefersUnusedProcess", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // http://tc39.github.io/ecmascript_sharedmem/shmem.html
 const base::Feature kSharedArrayBuffer {
   "SharedArrayBuffer",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index de3d3545..756c1a76 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -107,6 +107,7 @@
 CONTENT_EXPORT extern const base::Feature kServiceWorkerLongRunningMessage;
 CONTENT_EXPORT extern const base::Feature kServiceWorkerOnUI;
 CONTENT_EXPORT extern const base::Feature kServiceWorkerPaymentApps;
+CONTENT_EXPORT extern const base::Feature kServiceWorkerPrefersUnusedProcess;
 CONTENT_EXPORT extern const base::Feature kSharedArrayBuffer;
 CONTENT_EXPORT extern const base::Feature
     kSignedExchangePrefetchCacheForNavigations;
diff --git a/content/public/renderer/render_frame.h b/content/public/renderer/render_frame.h
index d60699b..4c36a22 100644
--- a/content/public/renderer/render_frame.h
+++ b/content/public/renderer/render_frame.h
@@ -22,6 +22,7 @@
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "third_party/blink/public/common/navigation/triggering_event_info.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/web/web_navigation_policy.h"
 #include "ui/accessibility/ax_mode.h"
@@ -172,6 +173,11 @@
   // interfaces exposed to it by the application running in this frame.
   virtual service_manager::InterfaceProvider* GetRemoteInterfaces() = 0;
 
+  // Returns the DocumentInterfaceBroker that this process can use to bind
+  // interfaces exposed to it by the application running in this frame.
+  virtual blink::mojom::DocumentInterfaceBroker*
+  GetDocumentInterfaceBroker() = 0;
+
   // Returns the BrowserInterfaceBrokerProxy that this process can use to bind
   // interfaces exposed to it by the application running in this frame.
   virtual blink::BrowserInterfaceBrokerProxy* GetBrowserInterfaceBroker() = 0;
diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc
index 46ddf4d9..491681e 100644
--- a/content/public/test/mock_render_thread.cc
+++ b/content/public/test/mock_render_thread.cc
@@ -277,6 +277,18 @@
   return interface_provider_request;
 }
 
+mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+MockRenderThread::TakeInitialDocumentInterfaceBrokerReceiverForFrame(
+    int32_t routing_id) {
+  auto it =
+      frame_routing_id_to_initial_document_broker_receivers_.find(routing_id);
+  if (it == frame_routing_id_to_initial_document_broker_receivers_.end())
+    return mojo::NullReceiver();
+  auto document_broker_receiver = std::move(it->second);
+  frame_routing_id_to_initial_document_broker_receivers_.erase(it);
+  return document_broker_receiver;
+}
+
 mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
 MockRenderThread::TakeInitialBrowserInterfaceBrokerReceiverForFrame(
     int32_t routing_id) {
@@ -311,6 +323,21 @@
   params_reply->new_interface_provider =
       interface_provider.PassInterface().PassHandle().release();
 
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker;
+  frame_routing_id_to_initial_document_broker_receivers_.emplace(
+      params_reply->child_routing_id,
+      document_interface_broker.InitWithNewPipeAndPassReceiver());
+  params_reply->document_interface_broker_content_handle =
+      document_interface_broker.PassPipe().release();
+
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink;
+  ignore_result(
+      document_interface_broker_blink.InitWithNewPipeAndPassReceiver());
+  params_reply->document_interface_broker_blink_handle =
+      document_interface_broker_blink.PassPipe().release();
+
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker;
   frame_routing_id_to_initial_browser_broker_receivers_.emplace(
@@ -364,11 +391,25 @@
       reply->main_frame_route_id,
       mojo::MakeRequest(
           &reply->main_frame_interface_bundle->interface_provider));
+
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker;
+  frame_routing_id_to_initial_document_broker_receivers_.emplace(
+      reply->main_frame_route_id,
+      document_interface_broker.InitWithNewPipeAndPassReceiver());
+
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker;
   frame_routing_id_to_initial_browser_broker_receivers_.emplace(
       reply->main_frame_route_id,
       browser_interface_broker.InitWithNewPipeAndPassReceiver());
+  reply->main_frame_interface_bundle->document_interface_broker_content =
+      std::move(document_interface_broker);
+
+  ignore_result(document_interface_broker.InitWithNewPipeAndPassReceiver());
+  reply->main_frame_interface_bundle->document_interface_broker_blink =
+      std::move(document_interface_broker);
+
   reply->main_frame_interface_bundle->browser_interface_broker =
       std::move(browser_interface_broker);
 
diff --git a/content/public/test/mock_render_thread.h b/content/public/test/mock_render_thread.h
index 38ef2fa..d9af68f 100644
--- a/content/public/test/mock_render_thread.h
+++ b/content/public/test/mock_render_thread.h
@@ -20,6 +20,7 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/service_manager/public/mojom/interface_provider.mojom.h"
 #include "third_party/blink/public/mojom/browser_interface_broker.mojom.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h"
 
 struct FrameHostMsg_CreateChildFrame_Params;
 struct FrameHostMsg_CreateChildFrame_Params_Reply;
@@ -119,6 +120,13 @@
   service_manager::mojom::InterfaceProviderRequest
   TakeInitialInterfaceProviderRequestForFrame(int32_t routing_id);
 
+  // Returns the receiver end of the DocumentInterfaceBroker interface whose
+  // client end was passed in to construct RenderFrame with |routing_id|; if
+  // any. The client end will be used by the RenderFrame to service interface
+  // requests originating from the initial empty document.
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+  TakeInitialDocumentInterfaceBrokerReceiverForFrame(int32_t routing_id);
+
   // Returns the receiver end of the BrowserInterfaceBroker interface whose
   // client end was passed in to construct RenderFrame with |routing_id|; if
   // any. The client end will be used by the RenderFrame to service interface
@@ -157,6 +165,10 @@
   std::map<int32_t, service_manager::mojom::InterfaceProviderRequest>
       frame_routing_id_to_initial_interface_provider_requests_;
 
+  std::map<int32_t,
+           mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>>
+      frame_routing_id_to_initial_document_broker_receivers_;
+
   std::map<int32_t, mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>>
       frame_routing_id_to_initial_browser_broker_receivers_;
 
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index 374f186..7635ba48 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -428,6 +428,14 @@
       mojo::MakeRequest(
           &view_params->main_frame_interface_bundle->interface_provider));
 
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker;
+  ignore_result(document_interface_broker.InitWithNewPipeAndPassReceiver());
+  view_params->main_frame_interface_bundle->document_interface_broker_content =
+      std::move(document_interface_broker);
+  ignore_result(document_interface_broker.InitWithNewPipeAndPassReceiver());
+  view_params->main_frame_interface_bundle->document_interface_broker_blink =
+      std::move(document_interface_broker);
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker;
   // Ignoring the returned PendingReceiver because it is not bound to anything
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 1e85f64..2327b098 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1359,11 +1359,14 @@
     RenderViewImpl* render_view,
     int32_t routing_id,
     service_manager::mojom::InterfaceProviderPtr interface_provider,
+    mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_content,
     mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
         browser_interface_broker,
     const base::UnguessableToken& devtools_frame_token) {
   DCHECK(routing_id != MSG_ROUTING_NONE);
   CreateParams params(render_view, routing_id, std::move(interface_provider),
+                      std::move(document_interface_broker_content),
                       std::move(browser_interface_broker),
                       devtools_frame_token);
 
@@ -1403,16 +1406,26 @@
   service_manager::mojom::InterfaceProviderPtr main_frame_interface_provider(
       std::move(params->main_frame_interface_bundle->interface_provider));
 
+  mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content(
+          std::move(params->main_frame_interface_bundle
+                        ->document_interface_broker_content));
   RenderFrameImpl* render_frame = RenderFrameImpl::Create(
       render_view, params->main_frame_routing_id,
       std::move(main_frame_interface_provider),
+      std::move(document_interface_broker_content),
       std::move(params->main_frame_interface_bundle->browser_interface_broker),
       params->devtools_main_frame_token);
   render_frame->InitializeBlameContext(nullptr);
 
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink(
+          std::move(params->main_frame_interface_bundle
+                        ->document_interface_broker_blink));
   WebLocalFrame* web_frame = WebLocalFrame::CreateMainFrame(
       render_view->webview(), render_frame,
-      render_frame->blink_interface_registry_.get(), opener,
+      render_frame->blink_interface_registry_.get(),
+      document_interface_broker_blink.PassPipe(), opener,
       // This conversion is a little sad, as this often comes from a
       // WebString...
       WebString::FromUTF8(params->replicated_frame_state.name),
@@ -1461,6 +1474,10 @@
 void RenderFrameImpl::CreateFrame(
     int routing_id,
     service_manager::mojom::InterfaceProviderPtr interface_provider,
+    mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_content,
+    mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_blink,
     mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
         browser_interface_broker,
     int previous_routing_id,
@@ -1504,6 +1521,8 @@
     // Create the RenderFrame and WebLocalFrame, linking the two.
     render_frame = RenderFrameImpl::Create(
         parent_proxy->render_view(), routing_id, std::move(interface_provider),
+        mojo::Remote<blink::mojom::DocumentInterfaceBroker>(
+            std::move(document_interface_broker_content)),
         std::move(browser_interface_broker), devtools_frame_token);
     render_frame->InitializeBlameContext(FromRoutingID(parent_routing_id));
     render_frame->unique_name_helper_.set_propagated_name(
@@ -1512,7 +1531,7 @@
         replicated_state.scope, WebString::FromUTF8(replicated_state.name),
         replicated_state.frame_policy, render_frame,
         render_frame->blink_interface_registry_.get(),
-        previous_sibling_web_frame,
+        document_interface_broker_blink.PassPipe(), previous_sibling_web_frame,
         ConvertFrameOwnerPropertiesToWebFrameOwnerProperties(
             frame_owner_properties),
         replicated_state.frame_owner_element_type,
@@ -1541,13 +1560,16 @@
     render_view = proxy->render_view();
     render_frame = RenderFrameImpl::Create(
         render_view, routing_id, std::move(interface_provider),
+        mojo::Remote<blink::mojom::DocumentInterfaceBroker>(
+            std::move(document_interface_broker_content)),
         std::move(browser_interface_broker), devtools_frame_token);
     render_frame->InitializeBlameContext(nullptr);
     render_frame->previous_routing_id_ = previous_routing_id;
     proxy->set_provisional_frame_routing_id(routing_id);
     web_frame = blink::WebLocalFrame::CreateProvisional(
         render_frame, render_frame->blink_interface_registry_.get(),
-        proxy->web_frame(), replicated_state.frame_policy);
+        document_interface_broker_blink.PassPipe(), proxy->web_frame(),
+        replicated_state.frame_policy);
     // The new |web_frame| is a main frame iff the proxy's frame was.
     DCHECK_EQ(proxy_is_main_frame, !web_frame->Parent());
   }
@@ -1782,12 +1804,16 @@
     RenderViewImpl* render_view,
     int32_t routing_id,
     service_manager::mojom::InterfaceProviderPtr interface_provider,
+    mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_content,
     mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
         browser_interface_broker,
     const base::UnguessableToken& devtools_frame_token)
     : render_view(render_view),
       routing_id(routing_id),
       interface_provider(std::move(interface_provider)),
+      document_interface_broker_content(
+          std::move(document_interface_broker_content)),
       browser_interface_broker(std::move(browser_interface_broker)),
       devtools_frame_token(devtools_frame_token) {}
 RenderFrameImpl::CreateParams::~CreateParams() = default;
@@ -1835,6 +1861,12 @@
   blink_interface_registry_.reset(new BlinkInterfaceRegistryImpl(
       registry_.GetWeakPtr(), associated_interfaces_.GetWeakPtr()));
 
+  // The DocumentInterfaceBroker to access Mojo services exposed by the RFHI
+  // must be provided at construction time. See: https://crbug.com/718652/.
+  CHECK(params.document_interface_broker_content.is_bound());
+  document_interface_broker_ =
+      std::move(params.document_interface_broker_content);
+
   CHECK(params.browser_interface_broker.is_valid());
   browser_interface_broker_proxy_.Bind(
       std::move(params.browser_interface_broker));
@@ -3030,6 +3062,18 @@
   return &remote_interfaces_;
 }
 
+blink::mojom::DocumentInterfaceBroker*
+RenderFrameImpl::GetDocumentInterfaceBroker() {
+  DCHECK(document_interface_broker_.is_bound());
+  return document_interface_broker_.get();
+}
+
+void RenderFrameImpl::SetDocumentInterfaceBrokerForTesting(
+    mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker> test_broker) {
+  document_interface_broker_.reset();
+  document_interface_broker_.Bind(std::move(test_broker));
+}
+
 blink::AssociatedInterfaceRegistry*
 RenderFrameImpl::GetAssociatedInterfaceRegistry() {
   return &associated_interfaces_;
@@ -4136,8 +4180,28 @@
           0u),
       GetTaskRunner(blink::TaskType::kInternalIPC));
 
+  DCHECK(params_reply.document_interface_broker_content_handle.is_valid());
+  DCHECK(params_reply.document_interface_broker_blink_handle.is_valid());
   DCHECK(params_reply.browser_interface_broker_handle.is_valid());
 
+  mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content;
+  document_interface_broker_content.Bind(
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>(
+          mojo::ScopedMessagePipeHandle(
+              params_reply.document_interface_broker_content_handle),
+          blink::mojom::DocumentInterfaceBroker::Version_),
+      GetTaskRunner(blink::TaskType::kInternalIPC));
+
+  mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink;
+  document_interface_broker_blink.Bind(
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>(
+          mojo::ScopedMessagePipeHandle(
+              params_reply.document_interface_broker_blink_handle),
+          blink::mojom::DocumentInterfaceBroker::Version_),
+      GetTaskRunner(blink::TaskType::kInternalIPC));
+
   // This method is always called by local frames, never remote frames.
 
   // Tracing analysis uses this to find main frames when this value is
@@ -4149,6 +4213,7 @@
   RenderFrameImpl* child_render_frame = RenderFrameImpl::Create(
       render_view_, params_reply.child_routing_id,
       std::move(child_interface_provider),
+      std::move(document_interface_broker_content),
       mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>(
           mojo::ScopedMessagePipeHandle(
               params_reply.browser_interface_broker_handle),
@@ -4161,7 +4226,8 @@
   child_render_frame->InitializeBlameContext(this);
   blink::WebLocalFrame* web_frame = parent->CreateLocalChild(
       scope, child_render_frame,
-      child_render_frame->blink_interface_registry_.get());
+      child_render_frame->blink_interface_registry_.get(),
+      document_interface_broker_blink.Unbind().PassPipe());
 
   child_render_frame->in_frame_tree_ = true;
   child_render_frame->Initialize();
@@ -4467,6 +4533,7 @@
 void RenderFrameImpl::DidCommitProvisionalLoad(
     const blink::WebHistoryItem& item,
     blink::WebHistoryCommitType commit_type,
+    mojo::ScopedMessagePipeHandle document_interface_broker_blink_handle,
     bool should_reset_browser_interface_broker) {
   TRACE_EVENT2("navigation,rail", "RenderFrameImpl::didCommitProvisionalLoad",
                "id", routing_id_,
@@ -4503,6 +4570,8 @@
 
   service_manager::mojom::InterfaceProviderRequest
       remote_interface_provider_request;
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_receiver;
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker_receiver;
 
@@ -4524,6 +4593,22 @@
     remote_interfaces_.Close();
     remote_interfaces_.Bind(std::move(interfaces_provider));
 
+    // If we're navigating to a new document, bind |document_interface_broker_|
+    // to a new message pipe. The receiver end of the new
+    // DocumentInterfaceBroker interface will be sent over as part of
+    // DidCommitProvisionalLoad. After the RFHI receives the commit
+    // confirmation, it will immediately close the old message pipe to avoid
+    // Get<interface> calls racing with navigation commit, and bind the receiver
+    // end of the message pipe created here. Must initialize
+    // |document_interface_broker_| with a new working pipe *before* observers
+    // receive DidCommitProvisionalLoad, so they can already receive remote
+    // interfaces. The interface receivers will be serviced once the
+    // DocumentInterfaceBroker interface receiver is bound by the
+    // RenderFrameHostImpl.
+    document_interface_broker_.reset();
+    document_interface_broker_receiver =
+        document_interface_broker_.BindNewPipeAndPassReceiver();
+
     // If we're navigating to a new document, bind
     // |browser_interface_broker_proxy_| to a new browser interface broker. The
     // request end of the new BrowserInterfaceBroker interface will be sent over
@@ -4578,6 +4663,9 @@
       should_reset_browser_interface_broker
           ? mojom::DidCommitProvisionalLoadInterfaceParams::New(
                 std::move(remote_interface_provider_request),
+                std::move(document_interface_broker_receiver),
+                mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>(
+                    std::move(document_interface_broker_blink_handle)),
                 std::move(browser_interface_broker_receiver))
           : nullptr);
 
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 1fe73946..77744ae5 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -219,6 +219,10 @@
   static void CreateFrame(
       int routing_id,
       service_manager::mojom::InterfaceProviderPtr interface_provider,
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_content,
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_blink,
       mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
           browser_interface_broker,
       int previous_routing_id,
@@ -244,6 +248,8 @@
         RenderViewImpl* render_view,
         int32_t routing_id,
         service_manager::mojom::InterfaceProviderPtr interface_provider,
+        mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+            document_interface_broker_content,
         mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
             browser_interface_broker,
         const base::UnguessableToken& devtools_frame_token);
@@ -255,6 +261,8 @@
     RenderViewImpl* render_view;
     int32_t routing_id;
     service_manager::mojom::InterfaceProviderPtr interface_provider;
+    mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_content;
     mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
         browser_interface_broker;
     base::UnguessableToken devtools_frame_token;
@@ -456,6 +464,7 @@
       const std::string& interface_name,
       mojo::ScopedMessagePipeHandle interface_pipe) override;
   service_manager::InterfaceProvider* GetRemoteInterfaces() override;
+  blink::mojom::DocumentInterfaceBroker* GetDocumentInterfaceBroker() override;
   blink::AssociatedInterfaceRegistry* GetAssociatedInterfaceRegistry() override;
   blink::AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() override;
 #if BUILDFLAG(ENABLE_PLUGINS)
@@ -720,6 +729,7 @@
   void DidCommitProvisionalLoad(
       const blink::WebHistoryItem& item,
       blink::WebHistoryCommitType commit_type,
+      mojo::ScopedMessagePipeHandle document_interface_broker_blink_handle,
       bool should_reset_browser_interface_broker) override;
   void DidCreateNewDocument() override;
   void DidClearWindowObject() override;
@@ -963,6 +973,10 @@
 
   void TransferUserActivationFrom(blink::WebLocalFrame* source_frame) override;
 
+  // Used in tests to override DocumentInterfaceBroker's methods
+  void SetDocumentInterfaceBrokerForTesting(
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker> test_broker);
+
   // Used in tests to install a fake WebURLLoaderFactory via
   // RenderViewTest::CreateFakeWebURLLoaderFactory().
   void SetWebURLLoaderFactoryOverrideForTest(
@@ -1046,13 +1060,15 @@
   // Creates a new RenderFrame. |render_view| is the RenderView object that this
   // frame belongs to, |interface_provider| is the RenderFrameHost's
   // InterfaceProvider through which services are exposed to the RenderFrame,
-  // and |browser_interface_broker| is the RenderFrameHost's
-  // BrowserInterfaceBroker through which services are exposed to the
+  // and |document_interface_broker_content| is the RenderFrameHost's
+  // DocumentInterfaceBroker through which services are exposed to the
   // RenderFrame.
   static RenderFrameImpl* Create(
       RenderViewImpl* render_view,
       int32_t routing_id,
       service_manager::mojom::InterfaceProviderPtr interface_provider,
+      mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_content,
       mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
           browser_interface_broker,
       const base::UnguessableToken& devtools_frame_token);
@@ -1536,6 +1552,8 @@
   service_manager::InterfaceProvider remote_interfaces_;
   std::unique_ptr<BlinkInterfaceRegistryImpl> blink_interface_registry_;
 
+  mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_;
   blink::BrowserInterfaceBrokerProxy browser_interface_broker_proxy_;
 
   service_manager::BindSourceInfo local_info_;
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc
index 1f18f9f3..1822a3c4 100644
--- a/content/renderer/render_frame_impl_browsertest.cc
+++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -38,6 +38,7 @@
 #include "content/renderer/render_view_impl.h"
 #include "content/test/fake_compositor_dependencies.h"
 #include "content/test/frame_host_test_interface.mojom.h"
+#include "content/test/test_document_interface_broker.h"
 #include "content/test/test_render_frame.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -72,6 +73,9 @@
 const char kParentFrameHTML[] = "Parent frame <iframe name='frame'></iframe>";
 
 const char kAutoplayTestOrigin[] = "https://www.google.com";
+
+constexpr char kGetNameTestResponse[] = "TestName";
+
 }  // namespace
 
 // RenderFrameImplTest creates a RenderFrameImpl that is a child of the
@@ -109,6 +113,16 @@
     service_manager::mojom::InterfaceProviderPtr stub_interface_provider;
     mojo::MakeRequest(&stub_interface_provider);
 
+    mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+        stub_document_interface_broker_content;
+    ignore_result(stub_document_interface_broker_content
+                      .InitWithNewPipeAndPassReceiver());
+
+    mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+        stub_document_interface_broker_blink;
+    ignore_result(
+        stub_document_interface_broker_blink.InitWithNewPipeAndPassReceiver());
+
     mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
         stub_browser_interface_broker;
     ignore_result(
@@ -116,6 +130,8 @@
 
     RenderFrameImpl::CreateFrame(
         kSubframeRouteId, std::move(stub_interface_provider),
+        std::move(stub_document_interface_broker_content),
+        std::move(stub_document_interface_broker_blink),
         std::move(stub_browser_interface_broker), MSG_ROUTING_NONE,
         MSG_ROUTING_NONE, kFrameProxyRouteId, MSG_ROUTING_NONE,
         base::UnguessableToken::Create(), frame_replication_state,
@@ -251,6 +267,11 @@
 TEST_F(RenderFrameImplTest, LocalChildFrameWasShown) {
   service_manager::mojom::InterfaceProviderPtr stub_interface_provider;
   mojo::MakeRequest(&stub_interface_provider);
+
+  mojo::Remote<blink::mojom::DocumentInterfaceBroker>
+      stub_document_interface_broker;
+  ignore_result(stub_document_interface_broker.BindNewPipeAndPassReceiver());
+
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       stub_browser_interface_broker;
   ignore_result(stub_browser_interface_broker.InitWithNewPipeAndPassReceiver());
@@ -260,13 +281,15 @@
   RenderFrameImpl* grandchild =
       RenderFrameImpl::Create(frame()->render_view(), kEmbeddedSubframeRouteId,
                               std::move(stub_interface_provider),
+                              std::move(stub_document_interface_broker),
                               std::move(stub_browser_interface_broker),
                               base::UnguessableToken::Create());
   blink::WebLocalFrame* parent_web_frame = frame()->GetWebFrame();
 
   parent_web_frame->CreateLocalChild(
       blink::WebTreeScopeType::kDocument, grandchild,
-      grandchild->blink_interface_registry_.get());
+      grandchild->blink_interface_registry_.get(),
+      stub_document_interface_broker.BindNewPipeAndPassReceiver().PassPipe());
   grandchild->in_frame_tree_ = true;
   grandchild->Initialize();
 
@@ -498,6 +521,74 @@
   }
 };
 
+// TODO(crbug.com/718652): this is a blink version of the FrameHostTestInterface
+// implementation. The non-blink one will be removed when all clients are
+// converted to use DocumentInterfaceBroker.
+class BlinkFrameHostTestInterfaceImpl
+    : public blink::mojom::FrameHostTestInterface {
+ public:
+  BlinkFrameHostTestInterfaceImpl() {}
+  ~BlinkFrameHostTestInterfaceImpl() override {}
+
+  void BindAndFlush(
+      mojo::PendingReceiver<blink::mojom::FrameHostTestInterface> receiver) {
+    receiver_.Bind(std::move(receiver));
+    receiver_.WaitForIncomingCall();
+  }
+
+  const base::Optional<SourceAnnotation>& ping_source() const {
+    return ping_source_;
+  }
+
+ protected:
+  // blink::mojom::FrameHostTestInterface
+  void Ping(const GURL& url, const std::string& event) override {
+    ping_source_ = SourceAnnotation{url, event};
+  }
+  void GetName(GetNameCallback callback) override {
+    std::move(callback).Run(kGetNameTestResponse);
+  }
+
+ private:
+  mojo::Receiver<blink::mojom::FrameHostTestInterface> receiver_{this};
+  base::Optional<SourceAnnotation> ping_source_;
+
+  DISALLOW_COPY_AND_ASSIGN(BlinkFrameHostTestInterfaceImpl);
+};
+
+class FrameHostTestDocumentInterfaceBroker
+    : public TestDocumentInterfaceBroker {
+ public:
+  FrameHostTestDocumentInterfaceBroker(
+      blink::mojom::DocumentInterfaceBroker* document_interface_broker,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker> receiver)
+      : TestDocumentInterfaceBroker(document_interface_broker,
+                                    std::move(receiver)) {}
+
+  void GetFrameHostTestInterface(
+      mojo::PendingReceiver<blink::mojom::FrameHostTestInterface> receiver)
+      override {
+    BlinkFrameHostTestInterfaceImpl impl;
+    impl.BindAndFlush(std::move(receiver));
+  }
+};
+
+TEST_F(RenderFrameImplTest, TestDocumentInterfaceBrokerOverride) {
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker> doc;
+  FrameHostTestDocumentInterfaceBroker frame_interface_broker(
+      frame()->GetDocumentInterfaceBroker(),
+      doc.InitWithNewPipeAndPassReceiver());
+  frame()->SetDocumentInterfaceBrokerForTesting(std::move(doc));
+
+  mojo::Remote<blink::mojom::FrameHostTestInterface> frame_test;
+  frame()->GetDocumentInterfaceBroker()->GetFrameHostTestInterface(
+      frame_test.BindNewPipeAndPassReceiver());
+  frame_test->GetName(base::BindOnce([](const std::string& result) {
+    EXPECT_EQ(result, kGetNameTestResponse);
+  }));
+  frame_interface_broker.Flush();
+}
+
 // RenderFrameRemoteInterfacesTest ------------------------------------
 
 namespace {
@@ -559,6 +650,34 @@
   DISALLOW_COPY_AND_ASSIGN(TestSimpleInterfaceProviderImpl);
 };
 
+class TestSimpleDocumentInterfaceBrokerImpl
+    : public blink::mojom::DocumentInterfaceBroker {
+ public:
+  using BinderCallback = base::RepeatingCallback<void(
+      mojo::PendingReceiver<blink::mojom::FrameHostTestInterface>)>;
+  explicit TestSimpleDocumentInterfaceBrokerImpl(BinderCallback binder_callback)
+      : binder_callback_(binder_callback) {}
+  void BindAndFlush(
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker> receiver) {
+    ASSERT_FALSE(receiver_.is_bound());
+    receiver_.Bind(std::move(receiver));
+    receiver_.FlushForTesting();
+  }
+
+ private:
+  // blink::mojom::DocumentInterfaceBroker
+  void GetFrameHostTestInterface(
+      mojo::PendingReceiver<blink::mojom::FrameHostTestInterface> receiver)
+      override {
+    binder_callback_.Run(std::move(receiver));
+  }
+
+  mojo::Receiver<blink::mojom::DocumentInterfaceBroker> receiver_{this};
+  BinderCallback binder_callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestSimpleDocumentInterfaceBrokerImpl);
+};
+
 class TestSimpleBrowserInterfaceBrokerImpl
     : public blink::mojom::BrowserInterfaceBroker {
  public:
@@ -640,6 +759,16 @@
         !document.IsNull() ? GURL(document.Url()) : GURL(kNoDocumentMarkerURL),
         event);
 
+    mojo::Remote<blink::mojom::FrameHostTestInterface> blink_remote;
+    blink::mojom::DocumentInterfaceBroker* document_interface_broker =
+        render_frame()->GetDocumentInterfaceBroker();
+    DCHECK(document_interface_broker);
+    document_interface_broker->GetFrameHostTestInterface(
+        blink_remote.BindNewPipeAndPassReceiver());
+    blink_remote->Ping(
+        !document.IsNull() ? GURL(document.Url()) : GURL(kNoDocumentMarkerURL),
+        event);
+
     remote.reset();
     render_frame()->GetBrowserInterfaceBroker()->GetInterface(
         remote.BindNewPipeAndPassReceiver());
@@ -762,6 +891,9 @@
     interface_request_for_first_document_ =
         frame_->TakeLastInterfaceProviderRequest();
 
+    document_interface_broker_receiver_for_first_document_ =
+        frame_->TakeLastDocumentInterfaceBrokerReceiver();
+
     browser_interface_broker_receiver_for_first_document_ =
         frame_->TakeLastBrowserInterfaceBrokerReceiver();
   }
@@ -771,6 +903,12 @@
     return std::move(interface_request_for_initial_empty_document_);
   }
 
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+  document_interface_broker_receiver_for_initial_empty_document() {
+    return std::move(
+        document_interface_broker_receiver_for_initial_empty_document_);
+  }
+
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
   browser_interface_broker_receiver_for_initial_empty_document() {
     return std::move(
@@ -782,6 +920,11 @@
     return std::move(interface_request_for_first_document_);
   }
 
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+  document_interface_broker_receiver_for_first_document() {
+    return std::move(document_interface_broker_receiver_for_first_document_);
+  }
+
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
   browser_interface_broker_receiver_for_first_document() {
     return std::move(browser_interface_broker_receiver_for_first_document_);
@@ -807,6 +950,8 @@
 
     interface_request_for_initial_empty_document_ =
         frame->TakeLastInterfaceProviderRequest();
+    document_interface_broker_receiver_for_initial_empty_document_ =
+        frame->TakeLastDocumentInterfaceBrokerReceiver();
     browser_interface_broker_receiver_for_initial_empty_document_ =
         frame_->TakeLastBrowserInterfaceBrokerReceiver();
     EXPECT_TRUE(frame->current_history_item().IsNull());
@@ -825,6 +970,11 @@
   service_manager::mojom::InterfaceProviderRequest
       interface_request_for_first_document_;
 
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_receiver_for_initial_empty_document_;
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_receiver_for_first_document_;
+
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker_receiver_for_initial_empty_document_;
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
@@ -839,6 +989,8 @@
 // FrameHostTestInterface requests.
 void ExpectPendingInterfaceRequestsFromSources(
     service_manager::mojom::InterfaceProviderRequest interface_provider_request,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_receiver,
     mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
         browser_interface_broker_receiver,
     std::vector<SourceAnnotation> expected_sources) {
@@ -858,6 +1010,21 @@
   provider.BindAndFlush(std::move(interface_provider_request));
   EXPECT_THAT(sources, ::testing::ElementsAreArray(expected_sources));
 
+  std::vector<SourceAnnotation> document_interface_broker_sources;
+  ASSERT_TRUE(document_interface_broker_receiver.is_valid());
+  TestSimpleDocumentInterfaceBrokerImpl broker(base::BindLambdaForTesting(
+      [&document_interface_broker_sources](
+          mojo::PendingReceiver<blink::mojom::FrameHostTestInterface>
+              receiver) {
+        BlinkFrameHostTestInterfaceImpl impl;
+        impl.BindAndFlush(std::move(receiver));
+        ASSERT_TRUE(impl.ping_source().has_value());
+        document_interface_broker_sources.push_back(impl.ping_source().value());
+      }));
+  broker.BindAndFlush(std::move(document_interface_broker_receiver));
+  EXPECT_THAT(document_interface_broker_sources,
+              ::testing::ElementsAreArray(expected_sources));
+
   std::vector<SourceAnnotation> browser_interface_broker_sources;
   ASSERT_TRUE(browser_interface_broker_receiver.is_valid());
   TestSimpleBrowserInterfaceBrokerImpl browser_broker(
@@ -921,7 +1088,7 @@
 // Expect that |remote_interfaces_| is bound before the first committed load in
 // a child frame, and then re-bound on the first commit.
 // TODO(crbug.com/718652): when all clients are converted to use
-// BrowserInterfaceBroker, InterfaceProviderRequest-related code will be
+// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be
 // removed.
 TEST_F(RenderFrameRemoteInterfacesTest, ChildFrameAtFirstCommittedLoad) {
   ScopedNewFrameInterfaceProviderExerciser child_frame_exerciser(
@@ -940,6 +1107,8 @@
   ExpectPendingInterfaceRequestsFromSources(
       child_frame_exerciser.interface_request_for_initial_empty_document(),
       child_frame_exerciser
+          .document_interface_broker_receiver_for_initial_empty_document(),
+      child_frame_exerciser
           .browser_interface_broker_receiver_for_initial_empty_document(),
       {{GURL(kNoDocumentMarkerURL), kFrameEventDidCreateNewFrame},
        {initial_empty_url, kFrameEventDidCreateNewDocument},
@@ -952,6 +1121,8 @@
   ExpectPendingInterfaceRequestsFromSources(
       child_frame_exerciser.interface_request_for_first_document(),
       child_frame_exerciser
+          .document_interface_broker_receiver_for_first_document(),
+      child_frame_exerciser
           .browser_interface_broker_receiver_for_first_document(),
       {{child_frame_url, kFrameEventDidCommitProvisionalLoad},
        {child_frame_url, kFrameEventDidCreateDocumentElement}});
@@ -960,7 +1131,7 @@
 // Expect that |remote_interfaces_| is bound before the first committed load in
 // the main frame of an opened window, and then re-bound on the first commit.
 // TODO(crbug.com/718652): when all clients are converted to use
-// BrowserInterfaceBroker, InterfaceProviderRequest-related code will be
+// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be
 // removed.
 TEST_F(RenderFrameRemoteInterfacesTest,
        MainFrameOfOpenedWindowAtFirstCommittedLoad) {
@@ -992,6 +1163,8 @@
   ExpectPendingInterfaceRequestsFromSources(
       main_frame_exerciser.interface_request_for_initial_empty_document(),
       main_frame_exerciser
+          .document_interface_broker_receiver_for_initial_empty_document(),
+      main_frame_exerciser
           .browser_interface_broker_receiver_for_initial_empty_document(),
       {{initial_empty_url, kFrameEventDidCreateNewFrame},
        {new_window_url, kFrameEventReadyToCommitNavigation},
@@ -999,6 +1172,8 @@
   ExpectPendingInterfaceRequestsFromSources(
       main_frame_exerciser.interface_request_for_first_document(),
       main_frame_exerciser
+          .document_interface_broker_receiver_for_first_document(),
+      main_frame_exerciser
           .browser_interface_broker_receiver_for_first_document(),
       {{new_window_url, kFrameEventDidCommitProvisionalLoad},
        {new_window_url, kFrameEventDidCreateDocumentElement}});
@@ -1027,7 +1202,7 @@
 // their own DocumentLoader in blink and model them as a real navigation, we
 // should add a test case here.
 // TODO(crbug.com/718652): when all clients are converted to use
-// BrowserInterfaceBroker, InterfaceProviderRequest-related code will be
+// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be
 // removed.
 TEST_F(RenderFrameRemoteInterfacesTest,
        ChildFrameReusingWindowOfInitialDocument) {
@@ -1054,6 +1229,8 @@
     ExpectPendingInterfaceRequestsFromSources(
         child_frame_exerciser.interface_request_for_initial_empty_document(),
         child_frame_exerciser
+            .document_interface_broker_receiver_for_initial_empty_document(),
+        child_frame_exerciser
             .browser_interface_broker_receiver_for_initial_empty_document(),
         {{GURL(kNoDocumentMarkerURL), kFrameEventDidCreateNewFrame},
          {initial_empty_url, kFrameEventDidCreateNewDocument},
@@ -1065,6 +1242,10 @@
 
     auto request = child_frame_exerciser.interface_request_for_first_document();
     ASSERT_FALSE(request.is_pending());
+    auto document_interface_broker_receiver =
+        child_frame_exerciser
+            .document_interface_broker_receiver_for_first_document();
+    ASSERT_FALSE(document_interface_broker_receiver.is_valid());
     auto browser_interface_broker_receiver =
         child_frame_exerciser
             .browser_interface_broker_receiver_for_first_document();
@@ -1075,7 +1256,7 @@
 // Expect that |remote_interfaces_| is bound to a new pipe on cross-document
 // navigations.
 // TODO(crbug.com/718652): when all clients are converted to use
-// BrowserInterfaceBroker, InterfaceProviderRequest-related code will be
+// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be
 // removed.
 TEST_F(RenderFrameRemoteInterfacesTest, ReplacedOnNonSameDocumentNavigation) {
   LoadHTMLWithUrlOverride("", kTestFirstURL);
@@ -1083,6 +1264,9 @@
   auto interface_provider_request_for_first_document =
       GetMainRenderFrame()->TakeLastInterfaceProviderRequest();
 
+  auto document_interface_broker_receiver_for_first_document =
+      GetMainRenderFrame()->TakeLastDocumentInterfaceBrokerReceiver();
+
   auto browser_interface_broker_receiver_for_first_document =
       GetMainRenderFrame()->TakeLastBrowserInterfaceBrokerReceiver();
 
@@ -1094,24 +1278,31 @@
   auto interface_provider_request_for_second_document =
       GetMainRenderFrame()->TakeLastInterfaceProviderRequest();
 
+  auto document_interface_broker_request_for_second_document =
+      GetMainRenderFrame()->TakeLastDocumentInterfaceBrokerReceiver();
+
   auto browser_interface_broker_receiver_for_second_document =
       GetMainRenderFrame()->TakeLastBrowserInterfaceBrokerReceiver();
 
   ASSERT_TRUE(interface_provider_request_for_first_document.is_pending());
+  ASSERT_TRUE(document_interface_broker_receiver_for_first_document.is_valid());
   ASSERT_TRUE(browser_interface_broker_receiver_for_first_document.is_valid());
 
   ExpectPendingInterfaceRequestsFromSources(
       std::move(interface_provider_request_for_first_document),
+      std::move(document_interface_broker_receiver_for_first_document),
       std::move(browser_interface_broker_receiver_for_first_document),
       {{GURL(kTestFirstURL), kFrameEventAfterCommit},
        {GURL(kTestSecondURL), kFrameEventReadyToCommitNavigation},
        {GURL(kTestSecondURL), kFrameEventDidCreateNewDocument}});
 
   ASSERT_TRUE(interface_provider_request_for_second_document.is_pending());
+  ASSERT_TRUE(document_interface_broker_request_for_second_document.is_valid());
   ASSERT_TRUE(browser_interface_broker_receiver_for_second_document.is_valid());
 
   ExpectPendingInterfaceRequestsFromSources(
       std::move(interface_provider_request_for_second_document),
+      std::move(document_interface_broker_request_for_second_document),
       std::move(browser_interface_broker_receiver_for_second_document),
       {{GURL(kTestSecondURL), kFrameEventDidCommitProvisionalLoad},
        {GURL(kTestSecondURL), kFrameEventDidCreateDocumentElement}});
@@ -1121,7 +1312,7 @@
 // navigations, i.e. the existing InterfaceProvider connection is continued to
 // be used.
 // TODO(crbug.com/718652): when all clients are converted to use
-// BrowserInterfaceBroker, InterfaceProviderRequest-related code will be
+// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be
 // removed.
 TEST_F(RenderFrameRemoteInterfacesTest, ReusedOnSameDocumentNavigation) {
   LoadHTMLWithUrlOverride("", kTestFirstURL);
@@ -1129,6 +1320,9 @@
   auto interface_provider_request =
       GetMainRenderFrame()->TakeLastInterfaceProviderRequest();
 
+  auto document_interface_broker =
+      GetMainRenderFrame()->TakeLastDocumentInterfaceBrokerReceiver();
+
   auto browser_interface_broker_receiver =
       GetMainRenderFrame()->TakeLastBrowserInterfaceBrokerReceiver();
 
@@ -1138,11 +1332,17 @@
   EXPECT_FALSE(
       GetMainRenderFrame()->TakeLastInterfaceProviderRequest().is_pending());
 
+  EXPECT_FALSE(GetMainRenderFrame()
+                   ->TakeLastDocumentInterfaceBrokerReceiver()
+                   .is_valid());
+
   ASSERT_TRUE(interface_provider_request.is_pending());
+  ASSERT_TRUE(document_interface_broker.is_valid());
   ASSERT_TRUE(browser_interface_broker_receiver.is_valid());
 
   ExpectPendingInterfaceRequestsFromSources(
       std::move(interface_provider_request),
+      std::move(document_interface_broker),
       std::move(browser_interface_broker_receiver),
       {{GURL(kTestFirstURL), kFrameEventDidCommitSameDocumentLoad}});
 }
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index a2a157c..6bffd8b 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -2045,11 +2045,19 @@
   CompositorDependencies* compositor_deps = this;
   service_manager::mojom::InterfaceProviderPtr interface_provider(
       std::move(params->interface_bundle->interface_provider));
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content(std::move(
+          params->interface_bundle->document_interface_broker_content));
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink(
+          std::move(params->interface_bundle->document_interface_broker_blink));
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker(
           std::move(params->interface_bundle->browser_interface_broker));
   RenderFrameImpl::CreateFrame(
       params->routing_id, std::move(interface_provider),
+      std::move(document_interface_broker_content),
+      std::move(document_interface_broker_blink),
       std::move(browser_interface_broker), params->previous_routing_id,
       params->opener_routing_id, params->parent_routing_id,
       params->previous_sibling_routing_id, params->devtools_frame_token,
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 2e4920b0..b8c9f30 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -1104,6 +1104,14 @@
   int routing_id = kProxyRoutingId + 1;
   service_manager::mojom::InterfaceProviderPtr stub_interface_provider;
   mojo::MakeRequest(&stub_interface_provider);
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      stub_document_interface_broker_content;
+  ignore_result(
+      stub_document_interface_broker_content.InitWithNewPipeAndPassReceiver());
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      stub_document_interface_broker_blink;
+  ignore_result(
+      stub_document_interface_broker_blink.InitWithNewPipeAndPassReceiver());
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       stub_browser_interface_broker;
   ignore_result(stub_browser_interface_broker.InitWithNewPipeAndPassReceiver());
@@ -1115,6 +1123,8 @@
   widget_params.visual_properties = test_visual_properties;
   RenderFrameImpl::CreateFrame(
       routing_id, std::move(stub_interface_provider),
+      std::move(stub_document_interface_broker_content),
+      std::move(stub_document_interface_broker_blink),
       std::move(stub_browser_interface_broker), kProxyRoutingId,
       MSG_ROUTING_NONE, MSG_ROUTING_NONE, MSG_ROUTING_NONE,
       base::UnguessableToken::Create(), replication_state, nullptr,
@@ -1172,12 +1182,22 @@
   int routing_id = kProxyRoutingId + 1;
   service_manager::mojom::InterfaceProviderPtr stub_interface_provider;
   mojo::MakeRequest(&stub_interface_provider);
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      stub_document_interface_broker_content;
+  ignore_result(
+      stub_document_interface_broker_content.InitWithNewPipeAndPassReceiver());
+  mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
+      stub_document_interface_broker_blink;
+  ignore_result(
+      stub_document_interface_broker_blink.InitWithNewPipeAndPassReceiver());
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
       stub_browser_interface_broker;
   ignore_result(stub_browser_interface_broker.InitWithNewPipeAndPassReceiver());
 
   RenderFrameImpl::CreateFrame(
       routing_id, std::move(stub_interface_provider),
+      std::move(stub_document_interface_broker_content),
+      std::move(stub_document_interface_broker_blink),
       std::move(stub_browser_interface_broker), kProxyRoutingId,
       MSG_ROUTING_NONE, frame()->GetRoutingID(), MSG_ROUTING_NONE,
       base::UnguessableToken::Create(), replication_state, nullptr,
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index ff25b83..1fc7e19 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1394,6 +1394,10 @@
   view_params
       ->main_frame_interface_bundle = mojom::DocumentScopedInterfaceBundle::New(
       std::move(reply->main_frame_interface_bundle->interface_provider),
+      std::move(reply->main_frame_interface_bundle
+                    ->document_interface_broker_content),
+      std::move(
+          reply->main_frame_interface_bundle->document_interface_broker_blink),
       std::move(reply->main_frame_interface_bundle->browser_interface_broker));
   view_params->main_frame_widget_routing_id = reply->main_frame_widget_route_id;
   view_params->session_storage_namespace_id =
diff --git a/content/renderer/worker/embedded_shared_worker_stub.cc b/content/renderer/worker/embedded_shared_worker_stub.cc
index 0482242..a416be53 100644
--- a/content/renderer/worker/embedded_shared_worker_stub.cc
+++ b/content/renderer/worker/embedded_shared_worker_stub.cc
@@ -9,31 +9,18 @@
 
 #include "base/bind.h"
 #include "base/feature_list.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "content/public/common/content_switches.h"
 #include "content/public/common/network_service_util.h"
-#include "content/public/common/origin_util.h"
 #include "content/renderer/loader/child_url_loader_factory_bundle.h"
 #include "content/renderer/loader/navigation_response_override_parameters.h"
 #include "content/renderer/loader/web_worker_fetch_context_impl.h"
-#include "content/renderer/renderer_blink_platform_impl.h"
-#include "ipc/ipc_message_macros.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/loader/url_loader_factory_bundle.h"
 #include "third_party/blink/public/common/messaging/message_port_channel.h"
-#include "third_party/blink/public/mojom/appcache/appcache.mojom.h"
-#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/platform/interface_provider.h"
-#include "third_party/blink/public/platform/task_type.h"
-#include "third_party/blink/public/platform/url_conversion.h"
-#include "third_party/blink/public/platform/web_security_origin.h"
+#include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/web/web_shared_worker.h"
-#include "third_party/blink/public/web/web_shared_worker_client.h"
 #include "url/origin.h"
 
 namespace content {
diff --git a/content/renderer/worker/embedded_shared_worker_stub.h b/content/renderer/worker/embedded_shared_worker_stub.h
index ec58b38..7bba24e 100644
--- a/content/renderer/worker/embedded_shared_worker_stub.h
+++ b/content/renderer/worker/embedded_shared_worker_stub.h
@@ -11,7 +11,6 @@
 #include "base/macros.h"
 #include "base/unguessable_token.h"
 #include "content/renderer/service_worker/service_worker_provider_context.h"
-#include "ipc/ipc_listener.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -31,7 +30,6 @@
 #include "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom.h"
 #include "third_party/blink/public/platform/web_content_security_policy.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
-#include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/web/web_shared_worker_client.h"
 #include "url/gurl.h"
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 9d2ec04e..2270e1b 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -300,6 +300,8 @@
     "test_content_browser_client.h",
     "test_content_client.cc",
     "test_content_client.h",
+    "test_document_interface_broker.cc",
+    "test_document_interface_broker.h",
     "test_mojo_proxy_resolver_factory.cc",
     "test_mojo_proxy_resolver_factory.h",
     "test_navigation_url_loader.cc",
diff --git a/content/test/data/accessibility/html/combobox-optgroup-expected-android.txt b/content/test/data/accessibility/html/combobox-optgroup-expected-android.txt
new file mode 100644
index 0000000..01b7162b
--- /dev/null
+++ b/content/test/data/accessibility/html/combobox-optgroup-expected-android.txt
@@ -0,0 +1,3 @@
+android.webkit.WebView focusable focused scrollable
+++android.view.View
+++++android.widget.Spinner role_description='pop up button' clickable focusable name='Mercedes Label'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/combobox-optgroup-expected-auralinux.txt b/content/test/data/accessibility/html/combobox-optgroup-expected-auralinux.txt
new file mode 100644
index 0000000..5f73565
--- /dev/null
+++ b/content/test/data/accessibility/html/combobox-optgroup-expected-auralinux.txt
@@ -0,0 +1,8 @@
+[document web] enabled
+++[section] enabled
+++++[combo box] enabled setsize:4
+++++++[menu] enabled setsize:4
+++++++++[menu item] name='Volvo Label' enabled selectable posinset:1 setsize:4
+++++++++[menu item] name='Saab Label' enabled selectable posinset:2 setsize:4
+++++++++[menu item] name='Mercedes Label' enabled selectable selected posinset:3 setsize:4
+++++++++[menu item] name='Audi Label' enabled selectable posinset:4 setsize:4
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/combobox-optgroup-expected-blink.txt b/content/test/data/accessibility/html/combobox-optgroup-expected-blink.txt
new file mode 100644
index 0000000..3842075
--- /dev/null
+++ b/content/test/data/accessibility/html/combobox-optgroup-expected-blink.txt
@@ -0,0 +1,8 @@
+rootWebArea
+++genericContainer
+++++popUpButton collapsed value='Mercedes Label' setSize=4
+++++++menuListPopup invisible setSize=4
+++++++++menuListOption invisible name='Volvo Label' setSize=4 posInSet=1 selected=false
+++++++++menuListOption invisible name='Saab Label' setSize=4 posInSet=2 selected=false
+++++++++menuListOption name='Mercedes Label' setSize=4 posInSet=3 selected=true
+++++++++menuListOption invisible name='Audi Label' setSize=4 posInSet=4 selected=false
diff --git a/content/test/data/accessibility/html/combobox-optgroup-expected-mac.txt b/content/test/data/accessibility/html/combobox-optgroup-expected-mac.txt
new file mode 100644
index 0000000..33d7a15f
--- /dev/null
+++ b/content/test/data/accessibility/html/combobox-optgroup-expected-mac.txt
@@ -0,0 +1,8 @@
+AXWebArea AXRoleDescription='HTML content'
+++AXGroup AXRoleDescription='group'
+++++AXPopUpButton AXRoleDescription='pop up button' AXValue='Mercedes Label'
+++++++AXMenu AXRoleDescription='menu'
+++++++++AXMenuItem AXRoleDescription='menu item' AXValue='Volvo Label'
+++++++++AXMenuItem AXRoleDescription='menu item' AXValue='Saab Label'
+++++++++AXMenuItem AXRoleDescription='menu item' AXValue='Mercedes Label'
+++++++++AXMenuItem AXRoleDescription='menu item' AXValue='Audi Label'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/combobox-optgroup-expected-uia-win.txt b/content/test/data/accessibility/html/combobox-optgroup-expected-uia-win.txt
new file mode 100644
index 0000000..3ea045c48
--- /dev/null
+++ b/content/test/data/accessibility/html/combobox-optgroup-expected-uia-win.txt
@@ -0,0 +1,8 @@
+document
+++group
+++++combobox ExpandCollapse.ExpandCollapseState='Collapsed' Value.IsReadOnly=false Value.Value='Mercedes Label'
+++++++list Selection.CanSelectMultiple=false Selection.IsSelectionRequired=false Value.IsReadOnly=false
+++++++++listitem Name='Volvo Label' SelectionItem.IsSelected=false
+++++++++listitem Name='Saab Label' SelectionItem.IsSelected=false
+++++++++listitem Name='Mercedes Label' SelectionItem.IsSelected=true
+++++++++listitem Name='Audi Label' SelectionItem.IsSelected=false
diff --git a/content/test/data/accessibility/html/combobox-optgroup-expected-win.txt b/content/test/data/accessibility/html/combobox-optgroup-expected-win.txt
new file mode 100644
index 0000000..4a49e9a1
--- /dev/null
+++ b/content/test/data/accessibility/html/combobox-optgroup-expected-win.txt
@@ -0,0 +1,8 @@
+ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
+++IA2_ROLE_SECTION
+++++ROLE_SYSTEM_COMBOBOX value='Mercedes Label' COLLAPSED FOCUSABLE HASPOPUP
+++++++ROLE_SYSTEM_LIST INVISIBLE
+++++++++ROLE_SYSTEM_LISTITEM name='Volvo Label' INVISIBLE FOCUSABLE SELECTABLE
+++++++++ROLE_SYSTEM_LISTITEM name='Saab Label' INVISIBLE FOCUSABLE SELECTABLE
+++++++++ROLE_SYSTEM_LISTITEM name='Mercedes Label' SELECTED FOCUSABLE SELECTABLE
+++++++++ROLE_SYSTEM_LISTITEM name='Audi Label' INVISIBLE FOCUSABLE SELECTABLE
diff --git a/content/test/data/accessibility/html/combobox-optgroup.html b/content/test/data/accessibility/html/combobox-optgroup.html
new file mode 100644
index 0000000..c5f9b46
--- /dev/null
+++ b/content/test/data/accessibility/html/combobox-optgroup.html
@@ -0,0 +1,32 @@
+<!--
+@MAC-ALLOW:AXRole*
+@WIN-ALLOW:xml-roles*
+@WIN-ALLOW:IA2_STATE_VERTICAL
+@WIN-ALLOW:SELECTABLE
+@UIA-WIN-ALLOW:Value.IsReadOnly*
+@BLINK-ALLOW:setSize*
+@BLINK-ALLOW:posInSet*
+@AURALINUX-ALLOW:xml-roles*
+@AURALINUX-ALLOW:posinset*
+@AURALINUX-ALLOW:setsize*
+@AURALINUX-ALLOW:enabled
+-->
+<!DOCTYPE html>
+<html>
+
+<body>
+
+  <select>
+    <optgroup label="Swedish Cars" aria-label="Swedish Cars Label">
+      <option value="volvo" aria-label="Volvo Label">Volvo</option>
+      <option value="saab" aria-label="Saab Label">Saab</option>
+    </optgroup>
+    <optgroup label="German Cars">
+      <option selected value="mercedes" aria-label="Mercedes Label">Mercedes</option>
+      <option value="audi" aria-label="Audi Label">Audi</option>
+    </optgroup>
+  </select>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/content/test/gpu/gpu_tests/gpu_helper.py b/content/test/gpu/gpu_tests/gpu_helper.py
index 531f853..85a26db2 100644
--- a/content/test/gpu/gpu_tests/gpu_helper.py
+++ b/content/test/gpu/gpu_tests/gpu_helper.py
@@ -10,7 +10,8 @@
 EXPECTATIONS_DRIVER_TAGS = frozenset([
     'angle_lt_25.20.100.6444',
     'angle_lt_25.20.100.6577',
-    'mesa_lt_19.1.2'
+    'mesa_lt_19.1.2',
+    'mesa_eq_18.0.5',
 ])
 
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 03c36c1c..88c0c63 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -63,9 +63,6 @@
 # Too slow (take about one hour to run)
 crbug.com/619403 deqp/functional/gles3/builtinprecision/* [ Skip ]
 
-# Flakes heavily on many OpenGL configurations
-crbug.com/832238 [ no-angle ] conformance2/transform_feedback/too-small-buffers.html [ Failure ]
-
 # Failing on NVIDIA OpenGL, but fixed in latest driver
 # TODO(http://crbug.com/887241): Upgrade the drivers on the bots.
 crbug.com/772651 [ linux nvidia ] conformance/glsl/bugs/vector-scalar-arithmetic-inside-loop.html [ Failure ]
@@ -271,6 +268,9 @@
 # Mac failures     #
 ####################
 
+# Flakes heavily on many OpenGL configurations
+crbug.com/832238 [ mac no-angle ] conformance2/transform_feedback/too-small-buffers.html [ Failure ]
+
 # Regressions in 10.12.4.
 crbug.com/705865 [ sierra intel ] conformance2/textures/misc/tex-base-level-bug.html [ Failure ]
 crbug.com/705865 [ sierra intel no-passthrough ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ]
@@ -581,7 +581,8 @@
 ####################
 
 # Intel failed issues
-crbug.com/950552 [ linux intel ] conformance2/textures/misc/tex-3d-size-limit.html [ Failure ]
+crbug.com/950552 [ linux intel no-passthrough ] conformance2/textures/misc/tex-3d-size-limit.html [ Failure ]
+crbug.com/1014429 [ linux intel opengl passthrough ] deqp/functional/gles3/shadercommonfunction.html [ Failure ]
 
 # Intel driver issues
 crbug.com/950552 [ linux intel mesa_lt_19.1.2 ] conformance2/textures/misc/tex-base-level-bug.html [ Failure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index 097af6e..660ec39 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -8,7 +8,7 @@
 # tags: [ d3d11 d3d9 no-angle opengl opengles vulkan ]
 # tags: [ no-passthrough passthrough ]
 # tags: [ webgl-version-1 ]
-# tags: [ angle_lt_25.20.100.6444 ]
+# tags: [ angle_lt_25.20.100.6444 mesa_eq_18.0.5 ]
 # results: [ Failure RetryOnFailure Skip ]
 
 
@@ -18,7 +18,6 @@
 # It's expected that not all extensions will be available on all platforms.
 # Having a test listed here is not necessarily a problem.
 [ win vulkan passthrough ] WebglExtension_EXT_float_blend [ Failure ]
-crbug.com/angleproject/2672 [ vulkan passthrough ] WebglExtension_WEBGL_multi_draw_instanced [ Failure ]
 
 # Skip these, rather than expect them to fail, to speed up test
 # execution. The browser is restarted even after expected test
@@ -78,7 +77,7 @@
 
 # Need to implement new error semantics
 # https://github.com/KhronosGroup/WebGL/pull/2607
-crbug.com/849572 conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ]
+crbug.com/849572 [ passthrough ] conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ]
 
 # Nvidia bugs fixed in latest driver
 # TODO(http://crbug.com/887241): Upgrade the drivers on the bots.
@@ -352,9 +351,19 @@
 # Linux failures   #
 ####################
 
+# Intel failed issues
+crbug.com/1021428 [ linux intel vulkan ] conformance/textures/misc/copy-tex-image-and-sub-image-2d.html [ Failure ]
+crbug.com/1021428 [ linux intel vulkan ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ]
+crbug.com/1021428 [ linux intel vulkan ] conformance/textures/misc/texture-mips.html [ Failure ]
+crbug.com/1021428 [ linux intel vulkan ] conformance/rendering/clipping-wide-points.html [ Failure ]
+crbug.com/1021428 [ linux intel vulkan ] conformance/extensions/webgl-draw-buffers.html [ Failure ]
+crbug.com/1021428 [ linux intel vulkan ] WebglExtension_EXT_shader_texture_lod [ Failure ]
+crbug.com/1021428 [ linux intel vulkan ] WebglExtension_EXT_float_blend [ Failure ]
+crbug.com/1021428 [ linux intel vulkan ] WebglExtension_WEBGL_depth_texture [ Failure ]
+
 # The following two tests only fail on Linux/Intel with Mesa 18.0.5,
 # not on Mesa 17.1.4 with the same Intel HD 630 GPU.
-crbug.com/928530 [ linux intel no-passthrough ] conformance/programs/program-test.html [ Failure ]
+crbug.com/928530 [ linux intel mesa_eq_18.0.5 no-passthrough ] conformance/programs/program-test.html [ Failure ]
 
 # NVIDIA
 crbug.com/524144 [ linux nvidia no-passthrough ] conformance/extensions/oes-element-index-uint.html [ RetryOnFailure ]
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc
index 86becd6..f4f32d5 100644
--- a/content/test/navigation_simulator_impl.cc
+++ b/content/test/navigation_simulator_impl.cc
@@ -344,6 +344,13 @@
 
   service_manager::mojom::InterfaceProviderPtr stub_interface_provider;
   interface_provider_request_ = mojo::MakeRequest(&stub_interface_provider);
+
+  document_interface_broker_content_receiver_ =
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver();
+  document_interface_broker_blink_receiver_ =
+      mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver();
   browser_interface_broker_receiver_ =
       mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>()
           .InitWithNewPipeAndPassReceiver();
@@ -590,6 +597,8 @@
 
   if (same_document_) {
     interface_provider_request_ = nullptr;
+    document_interface_broker_content_receiver_.reset();
+    document_interface_broker_blink_receiver_.reset();
     browser_interface_broker_receiver_.reset();
   }
 
@@ -608,6 +617,8 @@
       false /* same_document */, false /* failed_navigation */);
   render_frame_host_->SimulateCommitProcessed(
       request_, std::move(params), std::move(interface_provider_request_),
+      std::move(document_interface_broker_content_receiver_),
+      std::move(document_interface_broker_blink_receiver_),
       std::move(browser_interface_broker_receiver_), same_document_);
 
   // Simulate the UnloadACK in the old RenderFrameHost if it was swapped out at
@@ -753,6 +764,8 @@
       false /* same_document */, true /* failed_navigation */);
   render_frame_host_->SimulateCommitProcessed(
       request_, std::move(params), std::move(interface_provider_request_),
+      std::move(document_interface_broker_content_receiver_),
+      std::move(document_interface_broker_blink_receiver_),
       std::move(browser_interface_broker_receiver_), false /* same_document */);
 
   // Simulate the UnloadACK in the old RenderFrameHost if it was swapped out at
@@ -785,10 +798,14 @@
       true /* same_document */, false /* failed_navigation */);
 
   interface_provider_request_ = nullptr;
+  document_interface_broker_content_receiver_.reset();
+  document_interface_broker_blink_receiver_.reset();
   browser_interface_broker_receiver_.reset();
 
   render_frame_host_->SimulateCommitProcessed(
       request_, std::move(params), nullptr /* interface_provider_request_ */,
+      mojo::NullReceiver() /* document_interface_broker_content_receiver */,
+      mojo::NullReceiver() /* document_interface_broker_blink_receiver */,
       mojo::NullReceiver() /* browser_interface_broker_receiver */,
       true /* same_document */);
 
diff --git a/content/test/navigation_simulator_impl.h b/content/test/navigation_simulator_impl.h
index e7b5a8c..72a3603 100644
--- a/content/test/navigation_simulator_impl.h
+++ b/content/test/navigation_simulator_impl.h
@@ -22,6 +22,7 @@
 #include "net/base/host_port_pair.h"
 #include "net/base/ip_endpoint.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h"
 #include "third_party/blink/public/mojom/referrer.mojom.h"
 #include "url/gurl.h"
 
@@ -283,6 +284,10 @@
   int session_history_offset_ = 0;
   bool has_user_gesture_ = true;
   service_manager::mojom::InterfaceProviderRequest interface_provider_request_;
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content_receiver_;
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink_receiver_;
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker_receiver_;
   std::string contents_mime_type_;
diff --git a/content/test/test_document_interface_broker.cc b/content/test/test_document_interface_broker.cc
new file mode 100644
index 0000000..564bcfd
--- /dev/null
+++ b/content/test/test_document_interface_broker.cc
@@ -0,0 +1,26 @@
+// Copyright 2019 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 "content/test/test_document_interface_broker.h"
+
+namespace content {
+
+TestDocumentInterfaceBroker::TestDocumentInterfaceBroker(
+    blink::mojom::DocumentInterfaceBroker* document_interface_broker,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker> receiver)
+    : real_broker_(document_interface_broker),
+      receiver_(this, std::move(receiver)) {}
+
+TestDocumentInterfaceBroker::~TestDocumentInterfaceBroker() {}
+
+blink::mojom::DocumentInterfaceBroker*
+TestDocumentInterfaceBroker::GetForwardingInterface() {
+  return real_broker_;
+}
+
+void TestDocumentInterfaceBroker::Flush() {
+  receiver_.FlushForTesting();
+}
+
+}  // namespace content
\ No newline at end of file
diff --git a/content/test/test_document_interface_broker.h b/content/test/test_document_interface_broker.h
new file mode 100644
index 0000000..e78c3296
--- /dev/null
+++ b/content/test/test_document_interface_broker.h
@@ -0,0 +1,36 @@
+// Copyright 2019 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 CONTENT_TEST_TEST_DOCUMENT_INTERFACE_BROKER_H_
+#define CONTENT_TEST_TEST_DOCUMENT_INTERFACE_BROKER_H_
+
+#include <utility>
+
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-test-utils.h"
+
+namespace content {
+// This class can be subclassed to override specific methods of RenderFrame's
+// DocumentInterfaceBroker in tests. The rest of the calls will be forwarded to
+// the implementation passed to the constructor (typically returned by
+// RenderFrame::GetDocumentInterfaceBroker()).
+class TestDocumentInterfaceBroker
+    : public blink::mojom::DocumentInterfaceBrokerInterceptorForTesting {
+ public:
+  TestDocumentInterfaceBroker(
+      blink::mojom::DocumentInterfaceBroker* document_interface_broker,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker> receiver);
+  ~TestDocumentInterfaceBroker() override;
+  blink::mojom::DocumentInterfaceBroker* GetForwardingInterface() override;
+  void Flush();
+
+ private:
+  blink::mojom::DocumentInterfaceBroker* real_broker_;
+  mojo::Receiver<DocumentInterfaceBroker> receiver_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_TEST_TEST_DOCUMENT_INTERFACE_BROKER_H_
\ No newline at end of file
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index 8e163ba..19475ef 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -49,6 +49,11 @@
     return std::move(last_interface_provider_request_);
   }
 
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+  TakeLastDocumentInterfaceBrokerReceiver() {
+    return std::move(last_document_interface_broker_receiver_);
+  }
+
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
   TakeLastBrowserInterfaceBrokerReceiver() {
     return std::move(last_browser_interface_broker_receiver_);
@@ -69,6 +74,17 @@
     last_interface_provider_request_ = std::move(interface_provider_request);
   }
 
+  // Holds on to the receiver end of the DocumentInterfaceBroker interface whose
+  // client end is bound to the corresponding RenderFrame's
+  // |document_interface_broker_| to facilitate retrieving the most recent
+  // |document_interface_broker_receiver| in tests.
+  void PassLastDocumentInterfaceBrokerReceiver(
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_receiver) {
+    last_document_interface_broker_receiver_ =
+        std::move(document_interface_broker_receiver);
+  }
+
   // Holds on to the request end of the BrowserInterfaceBroker interface whose
   // client end is bound to the corresponding RenderFrame's
   // |browser_interface_broker_proxy_| to facilitate retrieving the most recent
@@ -88,6 +104,10 @@
     if (interface_params) {
       last_interface_provider_request_ =
           std::move(interface_params->interface_provider_request);
+      last_document_interface_broker_receiver_ =
+          mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>(
+              std::move(interface_params
+                            ->document_interface_broker_content_receiver));
       last_browser_interface_broker_receiver_ =
           std::move(interface_params->browser_interface_broker_receiver);
     }
@@ -204,6 +224,8 @@
       last_commit_params_;
   service_manager::mojom::InterfaceProviderRequest
       last_interface_provider_request_;
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+      last_document_interface_broker_receiver_;
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
       last_browser_interface_broker_receiver_;
 
@@ -227,6 +249,9 @@
   mock_frame_host_->PassLastInterfaceProviderRequest(
       mock_render_thread->TakeInitialInterfaceProviderRequestForFrame(
           params.routing_id));
+  mock_frame_host_->PassLastDocumentInterfaceBrokerReceiver(
+      mock_render_thread->TakeInitialDocumentInterfaceBrokerReceiverForFrame(
+          params.routing_id));
   mock_frame_host_->PassLastBrowserInterfaceBrokerReceiver(
       mock_render_thread->TakeInitialBrowserInterfaceBrokerReceiverForFrame(
           params.routing_id));
@@ -376,6 +401,11 @@
   return mock_frame_host_->TakeLastInterfaceProviderRequest();
 }
 
+mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+TestRenderFrame::TakeLastDocumentInterfaceBrokerReceiver() {
+  return mock_frame_host_->TakeLastDocumentInterfaceBrokerReceiver();
+}
+
 mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
 TestRenderFrame::TakeLastBrowserInterfaceBrokerReceiver() {
   return mock_frame_host_->TakeLastBrowserInterfaceBrokerReceiver();
diff --git a/content/test/test_render_frame.h b/content/test/test_render_frame.h
index c429df2b..9853bce 100644
--- a/content/test/test_render_frame.h
+++ b/content/test/test_render_frame.h
@@ -78,6 +78,9 @@
   service_manager::mojom::InterfaceProviderRequest
   TakeLastInterfaceProviderRequest();
 
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+  TakeLastDocumentInterfaceBrokerReceiver();
+
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
   TakeLastBrowserInterfaceBrokerReceiver();
 
diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc
index 0e9ebb01..c973a7c 100644
--- a/content/test/test_render_frame_host.cc
+++ b/content/test/test_render_frame_host.cc
@@ -135,6 +135,8 @@
   std::string frame_unique_name = base::GenerateGUID();
   OnCreateChildFrame(
       GetProcess()->GetNextRoutingID(), CreateStubInterfaceProviderRequest(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
+      CreateStubDocumentInterfaceBrokerReceiver(),
       CreateStubBrowserInterfaceBrokerReceiver(),
       blink::WebTreeScopeType::kDocument, frame_name, frame_unique_name, false,
       base::UnguessableToken::Create(), blink::FramePolicy(),
@@ -432,6 +434,10 @@
     NavigationRequest* navigation_request,
     std::unique_ptr<FrameHostMsg_DidCommitProvisionalLoad_Params> params,
     service_manager::mojom::InterfaceProviderRequest interface_provider_request,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_content_receiver,
+    mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+        document_interface_broker_blink_receiver,
     mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
         browser_interface_broker_receiver,
     bool same_document) {
@@ -449,6 +455,8 @@
             .Run(std::move(params),
                  mojom::DidCommitProvisionalLoadInterfaceParams::New(
                      std::move(interface_provider_request),
+                     std::move(document_interface_broker_content_receiver),
+                     std::move(document_interface_broker_blink_receiver),
                      std::move(browser_interface_broker_receiver)));
         did_commit = true;
       }
@@ -460,6 +468,8 @@
             .Run(std::move(params),
                  mojom::DidCommitProvisionalLoadInterfaceParams::New(
                      std::move(interface_provider_request),
+                     std::move(document_interface_broker_content_receiver),
+                     std::move(document_interface_broker_blink_receiver),
                      std::move(browser_interface_broker_receiver)));
         did_commit = true;
       }
@@ -471,6 +481,8 @@
         params.get(),
         mojom::DidCommitProvisionalLoadInterfaceParams::New(
             std::move(interface_provider_request),
+            std::move(document_interface_broker_content_receiver),
+            std::move(document_interface_broker_blink_receiver),
             std::move(browser_interface_broker_receiver)),
         same_document);
   }
@@ -593,11 +605,21 @@
   service_manager::mojom::InterfaceProviderPtr interface_provider;
   service_manager::mojom::InterfaceProviderRequest interface_provider_request;
 
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_content_receiver;
+  mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+      document_interface_broker_blink_receiver;
   mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
       browser_interface_broker_receiver;
 
   if (!is_same_document) {
     interface_provider_request = mojo::MakeRequest(&interface_provider);
+    document_interface_broker_content_receiver =
+        mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+            .InitWithNewPipeAndPassReceiver();
+    document_interface_broker_blink_receiver =
+        mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+            .InitWithNewPipeAndPassReceiver();
     browser_interface_broker_receiver =
         mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>()
             .InitWithNewPipeAndPassReceiver();
@@ -605,6 +627,8 @@
 
   auto interface_params = mojom::DidCommitProvisionalLoadInterfaceParams::New(
       std::move(interface_provider_request),
+      std::move(document_interface_broker_content_receiver),
+      std::move(document_interface_broker_blink_receiver),
       std::move(browser_interface_broker_receiver));
   return interface_params;
 }
@@ -622,6 +646,13 @@
 }
 
 // static
+mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+TestRenderFrameHost::CreateStubDocumentInterfaceBrokerReceiver() {
+  return mojo::PendingRemote<::blink::mojom::DocumentInterfaceBroker>()
+      .InitWithNewPipeAndPassReceiver();
+}
+
+// static
 mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
 TestRenderFrameHost::CreateStubBrowserInterfaceBrokerReceiver() {
   return mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>()
diff --git a/content/test/test_render_frame_host.h b/content/test/test_render_frame_host.h
index beab678..c1b6c436 100644
--- a/content/test/test_render_frame_host.h
+++ b/content/test/test_render_frame_host.h
@@ -155,6 +155,10 @@
       std::unique_ptr<FrameHostMsg_DidCommitProvisionalLoad_Params> params,
       service_manager::mojom::InterfaceProviderRequest
           interface_provider_request,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_content_receiver,
+      mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+          document_interface_broker_blink_receiver,
       mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
           browser_interface_broker_receiver,
       bool same_document);
@@ -178,6 +182,11 @@
   static service_manager::mojom::InterfaceProviderRequest
   CreateStubInterfaceProviderRequest();
 
+  // Returns a pending PendingReceiver<DocumentInterfaceBroker> that is safe to
+  // bind to an implementation, but will never receive any interface requests.
+  static mojo::PendingReceiver<blink::mojom::DocumentInterfaceBroker>
+  CreateStubDocumentInterfaceBrokerReceiver();
+
   // Returns a PendingReceiver<BrowserInterfaceBroker> that is safe to bind to
   // an implementation, but will never receive any interface requests.
   static mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker>
diff --git a/device/vr/public/mojom/vr_service.mojom b/device/vr/public/mojom/vr_service.mojom
index 1a9cc6e..b4c7045 100644
--- a/device/vr/public/mojom/vr_service.mojom
+++ b/device/vr/public/mojom/vr_service.mojom
@@ -57,6 +57,17 @@
   DOM_OVERLAY_FOR_HANDHELD_AR = 6,
 };
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// This enum corresponds to 'XRFeatureRequestStatus' in
+// tools/metrics/histograms/enums.xml
+enum XRSessionFeatureRequestStatus {
+  kNotRequested = 0,
+  kRequired = 1,
+  kOptionalAccepted = 2,
+  kOptionalRejected = 3,
+};
+
 struct XRSessionOptions {
   bool immersive;
   bool environment_integration;
@@ -470,8 +481,16 @@
   UNKNOWN_RUNTIME_ERROR = 6
 };
 
-union RequestSessionResult {
+struct RequestSessionSuccess {
   XRSession session;
+
+  // Used to report metrics during the session to the browser process.
+  // See the note on |XRSessionMetricsRecorder| for context.
+  pending_remote<XRSessionMetricsRecorder> metrics_recorder;
+};
+
+union RequestSessionResult {
+  RequestSessionSuccess success;
   RequestSessionError failure_reason;
 };
 
@@ -513,6 +532,15 @@
   SetFramesThrottled(bool throttled);
 };
 
+// Any metrics that must be recorded throughout the duration of an XR session
+// should be reported through this interface, so that the UKM event may still
+// be recorded even if the session is shut down via user navigation.
+interface XRSessionMetricsRecorder {
+  // Records a use (or attempted use - the feature request
+  // may not have been granted) of a feature.
+  ReportFeatureUsed(XRSessionFeature feature);
+};
+
 // The interface for the renderer to listen to top level XR events, events that
 // can be listened to and triggered without the renderer calling requestDevice.
 interface VRServiceClient {
diff --git a/docs/servicification.md b/docs/servicification.md
index 8e9735e..d24dcd3 100644
--- a/docs/servicification.md
+++ b/docs/servicification.md
@@ -300,6 +300,12 @@
 The current way to set up that sort of thing looks like
 [this](https://cs.chromium.org/chromium/src/third_party/blink/web_tests/battery-status/resources/mock-battery-monitor.js?rcl=be6e0001855f7f1cfc26205d0ff5a2b5b324fcbd&l=19).
 
+*** aside
+**NOTE:** The above approach to mocking in JS no longer applies when using
+the new recommended `DocumentInterfaceBroker` approach to exposing interfaces
+to documents. New JS mocking support is in development for this.
+***
+
 #### Feature Impls That Depend on Blink Headers
 In the course of servicifying a feature that has Blink as a client, you might
 encounter cases where the feature implementation has dependencies on Blink
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
index fa13ab8..34e4df9 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
@@ -19,7 +19,6 @@
 #include "content/public/common/url_constants.h"
 #include "content/public/common/web_preferences.h"
 #include "extensions/browser/api/extensions_api_client.h"
-#include "extensions/browser/api/mime_handler_private/mime_handler_private.h"
 #include "extensions/browser/event_router.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.h"
@@ -223,8 +222,6 @@
           owner_web_contents()->GetController().GetSessionStorageNamespaceMap())
           .release());
 
-  registry_.AddInterface(
-      base::Bind(&MimeHandlerServiceImpl::Create, stream_->GetWeakPtr()));
   registry_.AddInterface(base::BindRepeating(
       &MimeHandlerViewGuest::FuseBeforeUnloadControl, base::Unretained(this)));
 }
@@ -492,4 +489,8 @@
   return weak_factory_.GetWeakPtr();
 }
 
+base::WeakPtr<StreamContainer> MimeHandlerViewGuest::GetStreamWeakPtr() {
+  return stream_->GetWeakPtr();
+}
+
 }  // namespace extensions
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
index 3d0b70d0..cc32574 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
@@ -110,6 +110,8 @@
 
   base::WeakPtr<MimeHandlerViewGuest> GetWeakPtr();
 
+  base::WeakPtr<StreamContainer> GetStreamWeakPtr();
+
  protected:
   explicit MimeHandlerViewGuest(content::WebContents* owner_web_contents);
   ~MimeHandlerViewGuest() override;
diff --git a/extensions/renderer/DEPS b/extensions/renderer/DEPS
index ad6a8442..1e9c6096 100644
--- a/extensions/renderer/DEPS
+++ b/extensions/renderer/DEPS
@@ -9,6 +9,7 @@
   "+third_party/cld_3",
 
   "+third_party/blink/public/mojom/devtools/console_message.mojom.h",
+  "+third_party/blink/public/mojom/frame/document_interface_broker.mojom.h",
   "+third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h",
   "+third_party/blink/public/platform",
   "+third_party/blink/public/strings/grit/blink_strings.h",
diff --git a/extensions/renderer/resources/mime_handler_private_custom_bindings.js b/extensions/renderer/resources/mime_handler_private_custom_bindings.js
index 055957f5..9653886 100644
--- a/extensions/renderer/resources/mime_handler_private_custom_bindings.js
+++ b/extensions/renderer/resources/mime_handler_private_custom_bindings.js
@@ -19,7 +19,7 @@
 
 var servicePtr = new extensions.mimeHandler.MimeHandlerServicePtr;
 Mojo.bindInterface(extensions.mimeHandler.MimeHandlerService.name,
-                   mojo.makeRequest(servicePtr).handle);
+                   mojo.makeRequest(servicePtr).handle, "context", true);
 var beforeUnloadControlPtr =
     new extensions.mimeHandler.BeforeUnloadControlPtr;
 Mojo.bindInterface(
diff --git a/extensions/renderer/scoped_web_frame.cc b/extensions/renderer/scoped_web_frame.cc
index 1531ca6..18bcd84 100644
--- a/extensions/renderer/scoped_web_frame.cc
+++ b/extensions/renderer/scoped_web_frame.cc
@@ -5,21 +5,31 @@
 #include "extensions/renderer/scoped_web_frame.h"
 
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h"
 #include "third_party/blink/public/web/web_heap.h"
 #include "third_party/blink/public/web/web_view.h"
 #include "third_party/blink/public/web/web_widget.h"
 
 namespace extensions {
 
+// returns a valid handle that can be passed to WebLocalFrame constructor
+mojo::ScopedMessagePipeHandle CreateStubDocumentInterfaceBrokerHandle() {
+  return mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+      .InitWithNewPipeAndPassReceiver()
+      .PassPipe();
+}
+
 ScopedWebFrame::ScopedWebFrame()
     : view_(blink::WebView::Create(/*client=*/nullptr,
                                    /*is_hidden=*/false,
                                    /*compositing_enabled=*/false,
                                    /*opener=*/nullptr)),
-      frame_(blink::WebLocalFrame::CreateMainFrame(view_,
-                                                   &frame_client_,
-                                                   nullptr,
-                                                   nullptr)) {}
+      frame_(blink::WebLocalFrame::CreateMainFrame(
+          view_,
+          &frame_client_,
+          nullptr,
+          CreateStubDocumentInterfaceBrokerHandle(),
+          nullptr)) {}
 
 ScopedWebFrame::~ScopedWebFrame() {
   view_->Close();
diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc
index 24af79d5..1cb5bedc 100644
--- a/extensions/shell/browser/shell_content_browser_client.cc
+++ b/extensions/shell/browser/shell_content_browser_client.cc
@@ -138,7 +138,7 @@
     storage::OptionalQuotaSettingsCallback callback) {
   storage::GetNominalDynamicSettings(
       partition->GetPath(), context->IsOffTheRecord(),
-      storage::GetDefaultDiskInfoHelper(), std::move(callback));
+      storage::GetDefaultDeviceInfoHelper(), std::move(callback));
 }
 
 bool ShellContentBrowserClient::IsHandledURL(const GURL& url) {
diff --git a/google_apis/gcm/engine/account_mapping_unittest.cc b/google_apis/gcm/engine/account_mapping_unittest.cc
index f4764f1..ce27b81 100644
--- a/google_apis/gcm/engine/account_mapping_unittest.cc
+++ b/google_apis/gcm/engine/account_mapping_unittest.cc
@@ -14,7 +14,7 @@
 
 TEST(AccountMappingTest, SerializeAccountMapping) {
   AccountMapping account_mapping;
-  account_mapping.account_id = "acc_id";
+  account_mapping.account_id = CoreAccountId("acc_id");
   account_mapping.email = "test@example.com";
   account_mapping.access_token = "access_token";
   account_mapping.status = AccountMapping::NEW;
@@ -41,7 +41,7 @@
   EXPECT_EQ("test@example.com&mapped&1305797421259977",
             account_mapping.SerializeAsString());
 
-  account_mapping.account_id = "acc_id2";
+  account_mapping.account_id = CoreAccountId("acc_id2");
   account_mapping.email = "test@gmail.com";
   account_mapping.access_token = "access_token";  // should be ignored.
   account_mapping.status = AccountMapping::REMOVING;
@@ -59,10 +59,10 @@
 
 TEST(AccountMappingTest, DeserializeAccountMapping) {
   AccountMapping account_mapping;
-  account_mapping.account_id = "acc_id";
+  account_mapping.account_id = CoreAccountId("acc_id");
 
   EXPECT_TRUE(account_mapping.ParseFromString("test@example.com&new&0"));
-  EXPECT_EQ("acc_id", account_mapping.account_id);
+  EXPECT_EQ("acc_id", account_mapping.account_id.id);
   EXPECT_EQ("test@example.com", account_mapping.email);
   EXPECT_TRUE(account_mapping.access_token.empty());
   EXPECT_EQ(AccountMapping::NEW, account_mapping.status);
@@ -71,7 +71,7 @@
 
   EXPECT_TRUE(account_mapping.ParseFromString(
       "test@gmail.com&adding&1305797421259977&last_message_id_1"));
-  EXPECT_EQ("acc_id", account_mapping.account_id);
+  EXPECT_EQ("acc_id", account_mapping.account_id.id);
   EXPECT_EQ("test@gmail.com", account_mapping.email);
   EXPECT_TRUE(account_mapping.access_token.empty());
   EXPECT_EQ(AccountMapping::ADDING, account_mapping.status);
@@ -81,7 +81,7 @@
 
   EXPECT_TRUE(account_mapping.ParseFromString(
       "test@example.com&mapped&1305797421259977"));
-  EXPECT_EQ("acc_id", account_mapping.account_id);
+  EXPECT_EQ("acc_id", account_mapping.account_id.id);
   EXPECT_EQ("test@example.com", account_mapping.email);
   EXPECT_TRUE(account_mapping.access_token.empty());
   EXPECT_EQ(AccountMapping::MAPPED, account_mapping.status);
@@ -91,7 +91,7 @@
 
   EXPECT_TRUE(account_mapping.ParseFromString(
       "test@gmail.com&mapped&1305797421259977&last_message_id_1"));
-  EXPECT_EQ("acc_id", account_mapping.account_id);
+  EXPECT_EQ("acc_id", account_mapping.account_id.id);
   EXPECT_EQ("test@gmail.com", account_mapping.email);
   EXPECT_TRUE(account_mapping.access_token.empty());
   EXPECT_EQ(AccountMapping::MAPPED, account_mapping.status);
@@ -101,7 +101,7 @@
 
   EXPECT_TRUE(account_mapping.ParseFromString(
       "test@gmail.com&removing&1305797421259977&last_message_id_2"));
-  EXPECT_EQ("acc_id", account_mapping.account_id);
+  EXPECT_EQ("acc_id", account_mapping.account_id.id);
   EXPECT_EQ("test@gmail.com", account_mapping.email);
   EXPECT_TRUE(account_mapping.access_token.empty());
   EXPECT_EQ(AccountMapping::REMOVING, account_mapping.status);
@@ -111,7 +111,7 @@
 
   EXPECT_TRUE(account_mapping.ParseFromString(
       "test@gmail.com&removing&1305797421259935"));
-  EXPECT_EQ("acc_id", account_mapping.account_id);
+  EXPECT_EQ("acc_id", account_mapping.account_id.id);
   EXPECT_EQ("test@gmail.com", account_mapping.email);
   EXPECT_TRUE(account_mapping.access_token.empty());
   EXPECT_EQ(AccountMapping::REMOVING, account_mapping.status);
@@ -122,7 +122,7 @@
 
 TEST(AccountMappingTest, DeserializeAccountMappingInvalidInput) {
   AccountMapping account_mapping;
-  account_mapping.account_id = "acc_id";
+  account_mapping.account_id = CoreAccountId("acc_id");
   // Too many agruments.
   EXPECT_FALSE(account_mapping.ParseFromString(
       "test@example.com&adding&1305797421259935&last_message_id_1&stuff_here"));
diff --git a/google_apis/gcm/engine/gcm_store_impl_unittest.cc b/google_apis/gcm/engine/gcm_store_impl_unittest.cc
index 6c16b90..499201e 100644
--- a/google_apis/gcm/engine/gcm_store_impl_unittest.cc
+++ b/google_apis/gcm/engine/gcm_store_impl_unittest.cc
@@ -528,7 +528,7 @@
 
   // Add account mappings.
   AccountMapping account_mapping1;
-  account_mapping1.account_id = "account_id_1";
+  account_mapping1.account_id = CoreAccountId("account_id_1");
   account_mapping1.email = "account_id_1@gmail.com";
   account_mapping1.access_token = "account_token1";
   account_mapping1.status = AccountMapping::ADDING;
@@ -536,7 +536,7 @@
   account_mapping1.last_message_id = "message_1";
 
   AccountMapping account_mapping2;
-  account_mapping2.account_id = "account_id_2";
+  account_mapping2.account_id = CoreAccountId("account_id_2");
   account_mapping2.email = "account_id_2@gmail.com";
   account_mapping2.access_token = "account_token1";
   account_mapping2.status = AccountMapping::REMOVING;
diff --git a/headless/lib/browser/headless_content_browser_client.cc b/headless/lib/browser/headless_content_browser_client.cc
index 5f726cc..c508d2c 100644
--- a/headless/lib/browser/headless_content_browser_client.cc
+++ b/headless/lib/browser/headless_content_browser_client.cc
@@ -154,7 +154,7 @@
     ::storage::OptionalQuotaSettingsCallback callback) {
   ::storage::GetNominalDynamicSettings(
       partition->GetPath(), context->IsOffTheRecord(),
-      ::storage::GetDefaultDiskInfoHelper(), std::move(callback));
+      ::storage::GetDefaultDeviceInfoHelper(), std::move(callback));
 }
 
 content::GeneratedCodeCacheSettings
diff --git a/ios/chrome/browser/prerender/prerender_egtest.mm b/ios/chrome/browser/prerender/prerender_egtest.mm
index 88b324b..5599d32 100644
--- a/ios/chrome/browser/prerender/prerender_egtest.mm
+++ b/ios/chrome/browser/prerender/prerender_egtest.mm
@@ -115,12 +115,12 @@
   // Open the suggestion. The suggestion needs to be the first suggestion to
   // have the prerenderer activated.
   [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_accessibilityLabel(pageString),
-                                          grey_kindOfClassName(
-                                              @"OmniboxPopupTruncatingLabel"),
-                                          grey_ancestor(grey_accessibilityID(
-                                              @"omnibox suggestion 0")),
-                                          grey_sufficientlyVisible(), nil)]
+      selectElementWithMatcher:grey_allOf(
+                                   grey_accessibilityLabel(pageString),
+                                   grey_kindOfClassName(@"FadeTruncatingLabel"),
+                                   grey_ancestor(grey_accessibilityID(
+                                       @"omnibox suggestion 0")),
+                                   grey_sufficientlyVisible(), nil)]
       performAction:grey_tap()];
 
   [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString];
diff --git a/ios/chrome/browser/ui/elements/BUILD.gn b/ios/chrome/browser/ui/elements/BUILD.gn
index 02c5b800..eb818ce 100644
--- a/ios/chrome/browser/ui/elements/BUILD.gn
+++ b/ios/chrome/browser/ui/elements/BUILD.gn
@@ -7,6 +7,8 @@
   sources = [
     "extended_touch_target_button.h",
     "extended_touch_target_button.mm",
+    "fade_truncating_label.h",
+    "fade_truncating_label.mm",
     "gray_highlight_button.h",
     "gray_highlight_button.mm",
     "selector_coordinator.h",
diff --git a/ios/chrome/browser/ui/elements/fade_truncating_label.h b/ios/chrome/browser/ui/elements/fade_truncating_label.h
new file mode 100644
index 0000000..a564abc
--- /dev/null
+++ b/ios/chrome/browser/ui/elements/fade_truncating_label.h
@@ -0,0 +1,29 @@
+// Copyright (c) 2012 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_ELEMENTS_FADE_TRUNCATING_LABEL_H_
+#define IOS_CHROME_BROWSER_UI_ELEMENTS_FADE_TRUNCATING_LABEL_H_
+
+#import <UIKit/UIKit.h>
+
+typedef enum {
+  FadeTruncatingTail = 0x1,
+  FadeTruncatingHead = 0x2,
+  FadeTruncatingHeadAndTail = FadeTruncatingHead | FadeTruncatingTail
+} FadeTruncatingMode;
+
+// A label which applies a fade-to-background color gradient to one or both ends
+// of the string if it is too large to fit the available area. It  uses the
+// attributedText property of UILabel to implement the fading.
+@interface FadeTruncatingLabel : UILabel
+
+// Which side(s) to truncate.
+@property(nonatomic, assign) FadeTruncatingMode truncateMode;
+
+// Whether the text being displayed should be treated as a URL.
+@property(nonatomic, assign) BOOL displayAsURL;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_ELEMENTS_FADE_TRUNCATING_LABEL_H_
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.mm b/ios/chrome/browser/ui/elements/fade_truncating_label.mm
similarity index 87%
rename from ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.mm
rename to ios/chrome/browser/ui/elements/fade_truncating_label.mm
index 46e5a60..ffc7510 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.mm
+++ b/ios/chrome/browser/ui/elements/fade_truncating_label.mm
@@ -2,28 +2,28 @@
 // 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/omnibox/popup/omnibox_popup_truncating_label.h"
+#import "ios/chrome/browser/ui/elements/fade_truncating_label.h"
 
 #include <algorithm>
 
-#include "base/mac/scoped_cftyperef.h"
+#include "base/logging.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-@interface OmniboxPopupTruncatingLabel ()
+@interface FadeTruncatingLabel ()
 
 // Gradient used to create fade effect. Changes based on view.frame size.
 @property(nonatomic, strong) UIImage* gradient;
 
 @end
 
-@implementation OmniboxPopupTruncatingLabel
+@implementation FadeTruncatingLabel
 
 - (void)setup {
   self.backgroundColor = [UIColor clearColor];
-  _truncateMode = OmniboxPopupTruncatingTail;
+  _truncateMode = FadeTruncatingTail;
 }
 
 - (id)initWithFrame:(CGRect)frame {
@@ -83,11 +83,11 @@
 
 - (void)setTextAlignment:(NSTextAlignment)textAlignment {
   if (textAlignment == NSTextAlignmentLeft) {
-    self.truncateMode = OmniboxPopupTruncatingTail;
+    self.truncateMode = FadeTruncatingTail;
   } else if (textAlignment == NSTextAlignmentRight) {
-    self.truncateMode = OmniboxPopupTruncatingHead;
+    self.truncateMode = FadeTruncatingHead;
   } else if (textAlignment == NSTextAlignmentNatural) {
-    self.truncateMode = OmniboxPopupTruncatingTail;
+    self.truncateMode = FadeTruncatingTail;
   } else {
     NOTREACHED();
   }
@@ -103,7 +103,7 @@
   // Create an opaque context.
   CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
   CGContextRef context =
-      CGBitmapContextCreate(NULL, rect.size.width, rect.size.height, 8,
+      CGBitmapContextCreate(nullptr, rect.size.width, rect.size.height, 8,
                             4 * rect.size.width, colorSpace, kCGImageAlphaNone);
 
   // White background will mask opaque, black gradient will mask transparent.
@@ -122,13 +122,13 @@
       std::min(rect.size.height * 2, (CGFloat)floor(rect.size.width / 4));
   CGFloat minX = CGRectGetMinX(rect);
   CGFloat maxX = CGRectGetMaxX(rect);
-  if (self.truncateMode & OmniboxPopupTruncatingTail) {
+  if (self.truncateMode & FadeTruncatingTail) {
     CGFloat startX = maxX - fadeWidth;
     CGPoint startPoint = CGPointMake(startX, CGRectGetMidY(rect));
     CGPoint endPoint = CGPointMake(maxX, CGRectGetMidY(rect));
     CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
   }
-  if (self.truncateMode & OmniboxPopupTruncatingHead) {
+  if (self.truncateMode & FadeTruncatingHead) {
     CGFloat startX = minX + fadeWidth;
     CGPoint startPoint = CGPointMake(startX, CGRectGetMidY(rect));
     CGPoint endPoint = CGPointMake(minX, CGRectGetMidY(rect));
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm
index b3d86768..a50acdc 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm
@@ -25,7 +25,8 @@
 @property(nonatomic, strong) InfobarBannerViewController* bannerViewController;
 // InfobarModalViewController owned by this Coordinator.
 @property(nonatomic, strong) InfobarModalViewController* modalViewController;
-
+// YES if the Infobar has been Accepted.
+@property(nonatomic, assign) BOOL infobarAccepted;
 @end
 
 @implementation InfobarConfirmCoordinator
@@ -52,6 +53,7 @@
 - (void)start {
   if (!self.started) {
     self.started = YES;
+    self.infobarAccepted = NO;
     self.bannerViewController =
         [[InfobarBannerViewController alloc] initWithDelegate:self
                                                 presentsModal:self.hasBadge
@@ -90,7 +92,7 @@
 }
 
 - (BOOL)isInfobarAccepted {
-  return NO;
+  return self.infobarAccepted;
 }
 
 - (void)infobarBannerWasPresented {
@@ -101,12 +103,17 @@
   // NO-OP.
 }
 
-- (void)dismissBannerWhenInteractionIsFinished {
+- (void)dismissBannerIfReady {
   [self.bannerViewController dismissWhenInteractionIsFinished];
 }
 
+- (BOOL)infobarActionInProgress {
+  return NO;
+}
+
 - (void)performInfobarAction {
   self.confirmInfobarDelegate->Accept();
+  self.infobarAccepted = YES;
 }
 
 - (void)infobarBannerWillBeDismissed:(BOOL)userInitiated {
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h
index 1a229e9..0bfd18f 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h
@@ -66,10 +66,6 @@
 // Present the InfobarModal using |self.baseViewController|.
 - (void)presentInfobarModal;
 
-// Dismisses the InfobarBanner after the user is no longer interacting with it.
-// e.g. No in progress touch gestures,etc. The dismissal will be animated.
-- (void)dismissInfobarBannerAfterInteraction;
-
 // Dismisses the InfobarBanner immediately, if none is being presented
 // |completion| will still run.
 - (void)dismissInfobarBannerAnimated:(BOOL)animated
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
index e997bc3..56768556d 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
@@ -159,7 +159,7 @@
     }
     __weak InfobarCoordinator* weakSelf = self;
     self.dismissBannerBlock = ^(void) {
-      [weakSelf dismissInfobarBannerAfterInteraction];
+      [weakSelf dismissInfobarBannerIfReady];
       weakSelf.dismissBannerBlock = nil;
     };
     dispatch_after(popTime, dispatch_get_main_queue(), self.dismissBannerBlock);
@@ -193,12 +193,6 @@
   }
 }
 
-- (void)dismissInfobarBannerAfterInteraction {
-  if (!self.modalTransitionDriver) {
-    [self dismissBannerWhenInteractionIsFinished];
-  }
-}
-
 - (void)dismissInfobarBannerAnimated:(BOOL)animated
                           completion:(void (^)())completion {
   [self dismissInfobarBanner:self animated:animated completion:completion];
@@ -228,11 +222,15 @@
 
 - (void)bannerInfobarButtonWasPressed:(id)sender {
   [self performInfobarAction];
+  // The Infobar action might be async, and the banner should not dismiss until
+  // the Infobar has been accepted. In the  situation that the banner is not
+  // dismissed here, the completion callback of the async action should be in
+  // charge of calling infobarWasAccepted: and dismissing the banner.
   if ([self isInfobarAccepted]) {
     [self.badgeDelegate infobarWasAccepted:self.infobarType
                                forWebState:self.webState];
+    [self dismissInfobarBanner:sender animated:YES completion:nil];
   }
-  [self dismissInfobarBanner:sender animated:YES completion:nil];
 }
 
 - (void)presentInfobarModalFromBanner {
@@ -281,7 +279,13 @@
   self.bannerTransitionDriver = nil;
   animatedFullscreenDisabler_ = nullptr;
   [self infobarWasDismissed];
-  [self.infobarContainer childCoordinatorBannerWasDismissed:self];
+  if (!self.infobarActionInProgress) {
+    // Only inform InfobarContainer that the Infobar banner presentation is
+    // finished if it is not still executing the Infobar action. That way, the
+    // container won't start presenting a queued Infobar's banner when the
+    // current Infobar hasn't finished.
+    [self.infobarContainer childCoordinatorBannerFinishedPresented:self];
+  }
 }
 
 #pragma mark InfobarBannerPositioner
@@ -394,10 +398,15 @@
   NOTREACHED() << "Subclass must implement.";
 }
 
-- (void)dismissBannerWhenInteractionIsFinished {
+- (void)dismissBannerIfReady {
   NOTREACHED() << "Subclass must implement.";
 }
 
+- (BOOL)infobarActionInProgress {
+  NOTREACHED() << "Subclass must implement.";
+  return NO;
+}
+
 - (void)performInfobarAction {
   NOTREACHED() << "Subclass must implement.";
 }
@@ -417,6 +426,15 @@
 
 #pragma mark - Private
 
+// Dismisses the Infobar banner if it is ready. i.e. the user is no longer
+// interacting with it or the Infobar action is still in progress. The dismissal
+// will be animated.
+- (void)dismissInfobarBannerIfReady {
+  if (!self.modalTransitionDriver) {
+    [self dismissBannerIfReady];
+  }
+}
+
 // |presentingViewController| presents the InfobarModal using |driver|. If
 // Modal is presented successfully |completion| will be executed.
 - (void)presentInfobarModalFrom:(UIViewController*)presentingViewController
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h
index 5bc867c..c13897e 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h
@@ -26,9 +26,15 @@
 // Performs any actions related to an Infobar Modal presentation.
 - (void)infobarModalPresentedFromBanner:(BOOL)presentedFromBanner;
 
-// Dismisses the InfobarBanner once there's no interaction in progress. An
-// interaction is any user initiated behavior with the Banner.
-- (void)dismissBannerWhenInteractionIsFinished;
+// Dismisses the InfobarBanner if not currently being used. A user could be
+// interacting with the banner or the Infobar may still be using the banner to
+// present information (i.e. infobarActionInProgress is YES).
+- (void)dismissBannerIfReady;
+
+// YES if the infobar action has been started and has not finished yet (i.e.
+// Translate is in progress). If the Infobar action is not async, this should
+// most likely always return NO.
+- (BOOL)infobarActionInProgress;
 
 // Performs the main Infobar action. e.g. "Save Password", "Restore",etc.
 - (void)performInfobarAction;
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
index 64244e3..dc07d48 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
@@ -35,7 +35,8 @@
     InfobarPasswordTableViewController* modalViewController;
 // The InfobarType for the banner presented by this Coordinator.
 @property(nonatomic, assign, readonly) InfobarType infobarBannerType;
-
+// YES if the Infobar has been Accepted.
+@property(nonatomic, assign) BOOL infobarAccepted;
 @end
 
 @implementation InfobarPasswordCoordinator
@@ -65,6 +66,7 @@
 - (void)start {
   if (!self.started) {
     self.started = YES;
+    self.infobarAccepted = NO;
     self.bannerViewController = [[InfobarBannerViewController alloc]
         initWithDelegate:self
            presentsModal:self.hasBadge
@@ -150,7 +152,7 @@
 }
 
 - (BOOL)isInfobarAccepted {
-  return YES;
+  return self.infobarAccepted;
 }
 
 - (void)infobarBannerWasPresented {
@@ -169,12 +171,17 @@
   self.passwordInfoBarDelegate->InfobarPresenting(NO /*automatic*/);
 }
 
-- (void)dismissBannerWhenInteractionIsFinished {
+- (void)dismissBannerIfReady {
   [self.bannerViewController dismissWhenInteractionIsFinished];
 }
 
+- (BOOL)infobarActionInProgress {
+  return NO;
+}
+
 - (void)performInfobarAction {
   self.passwordInfoBarDelegate->Accept();
+  self.infobarAccepted = YES;
 }
 
 - (void)infobarBannerWillBeDismissed:(BOOL)userInitiated {
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_save_card_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_save_card_coordinator.mm
index ad8b8a80..da5ef569 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_save_card_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_save_card_coordinator.mm
@@ -28,7 +28,8 @@
 // Delegate that holds the Infobar information and actions.
 @property(nonatomic, readonly)
     autofill::AutofillSaveCardInfoBarDelegateMobile* saveCardInfoBarDelegate;
-
+// YES if the Infobar has been Accepted.
+@property(nonatomic, assign) BOOL infobarAccepted;
 @end
 
 @implementation InfobarSaveCardCoordinator
@@ -53,6 +54,7 @@
 - (void)start {
   if (!self.started) {
     self.started = YES;
+    self.infobarAccepted = NO;
     self.bannerViewController = [[InfobarBannerViewController alloc]
         initWithDelegate:self
            presentsModal:self.hasBadge
@@ -85,7 +87,7 @@
 #pragma mark - InfobarCoordinatorImplementation
 
 - (BOOL)isInfobarAccepted {
-  return YES;
+  return self.infobarAccepted;
 }
 
 - (void)performInfobarAction {
@@ -93,6 +95,7 @@
     // TODO(crbug.com/1014652): Open Modal if CreditCard details will be
     // uploaded. Meaning that the ToS needs to be displayed.
   } else if (self.saveCardInfoBarDelegate->Accept()) {
+    self.infobarAccepted = YES;
     // TODO(crbug.com/1014652): Until a post save editing functionality is
     // implemented the Infobar will be completely removed after its been
     // accepted.
@@ -126,10 +129,14 @@
   // between automatic and manual presentation.
 }
 
-- (void)dismissBannerWhenInteractionIsFinished {
+- (void)dismissBannerIfReady {
   [self.bannerViewController dismissWhenInteractionIsFinished];
 }
 
+- (BOOL)infobarActionInProgress {
+  return NO;
+}
+
 - (void)infobarBannerWillBeDismissed:(BOOL)userInitiated {
   // TODO(crbug.com/1014652): Record metrics here if there's a distinction
   // between ignoring or dismissing the Infobar.
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_translate_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_translate_coordinator.mm
index de39ef3..e69b09e1 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_translate_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_translate_coordinator.mm
@@ -11,6 +11,7 @@
 #import "ios/chrome/browser/translate/translate_constants.h"
 #import "ios/chrome/browser/translate/translate_infobar_delegate_observer_bridge.h"
 #import "ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.h"
+#import "ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h"
 #import "ios/chrome/browser/ui/infobars/infobar_container.h"
 #import "ios/chrome/browser/ui/infobars/modals/infobar_translate_modal_delegate.h"
 #import "ios/chrome/browser/ui/infobars/modals/infobar_translate_table_view_controller.h"
@@ -21,7 +22,8 @@
 #error "This file requires ARC support."
 #endif
 
-@interface TranslateInfobarCoordinator () <TranslateInfobarDelegateObserving,
+@interface TranslateInfobarCoordinator () <InfobarCoordinatorImplementation,
+                                           TranslateInfobarDelegateObserving,
                                            InfobarTranslateModalDelegate> {
   // Observer to listen for changes to the TranslateStep.
   std::unique_ptr<TranslateInfobarDelegateObserverBridge>
@@ -45,6 +47,9 @@
 // Tracks user actions taken throughout Translate lifetime.
 @property(nonatomic, assign) UserAction userAction;
 
+// YES if translate is currently in progress
+@property(nonatomic, assign) BOOL translateInProgress;
+
 @end
 
 @implementation TranslateInfobarCoordinator
@@ -52,6 +57,8 @@
 @synthesize bannerViewController = _bannerViewController;
 // Synthesize since readonly property from superclass is changed to readwrite.
 @synthesize modalViewController = _modalViewController;
+// Synthesized from InfobarCoordinatorImplementation
+@synthesize translateInProgress = _translateInProgress;
 
 - (instancetype)initWithInfoBarDelegate:
     (translate::TranslateInfoBarDelegate*)infoBarDelegate {
@@ -113,7 +120,7 @@
 
 #pragma mark - InfobarCoordinatorImplementation
 
-- (BOOL)shouldBadgeBeAccepted {
+- (BOOL)isInfobarAccepted {
   return self.currentStep ==
          translate::TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE;
 }
@@ -140,8 +147,15 @@
   // TODO(crbug.com/1014959): implement
 }
 
-- (void)dismissBannerWhenInteractionIsFinished {
-  [self.bannerViewController dismissWhenInteractionIsFinished];
+- (void)dismissBannerIfReady {
+  if (!self.translateInProgress) {
+    // Only attempt to dismiss banner if Translate is not in progress.
+    [self.bannerViewController dismissWhenInteractionIsFinished];
+  }
+}
+
+- (BOOL)infobarActionInProgress {
+  return self.translateInProgress;
 }
 
 - (void)infobarBannerWillBeDismissed:(BOOL)userInitiated {
diff --git a/ios/chrome/browser/ui/infobars/infobar_container.h b/ios/chrome/browser/ui/infobars/infobar_container.h
index b5f33ed..cb108b2 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container.h
+++ b/ios/chrome/browser/ui/infobars/infobar_container.h
@@ -14,8 +14,8 @@
 @protocol InfobarContainer
 
 // Informs the InfobarContainerCoordinator that |infobarCoordinator| has
-// dismissed its banner.
-- (void)childCoordinatorBannerWasDismissed:
+// finished presenting its banner(s).
+- (void)childCoordinatorBannerFinishedPresented:
     (InfobarCoordinator*)infobarCoordinator;
 
 // Informs the InfobarContainerCoordinator that |infobarCoordinator| has
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm b/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
index da3e8b20..7cc6f0e 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
@@ -245,7 +245,7 @@
 
 #pragma mark InfobarContainer
 
-- (void)childCoordinatorBannerWasDismissed:
+- (void)childCoordinatorBannerFinishedPresented:
     (InfobarCoordinator*)infobarCoordinator {
   InfobarCoordinator* coordinator =
       [self.infobarCoordinatorsToPresent firstObject];
diff --git a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
index 802af14..32bca74c 100644
--- a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
@@ -74,8 +74,6 @@
     "omnibox_popup_row.mm",
     "omnibox_popup_row_cell.h",
     "omnibox_popup_row_cell.mm",
-    "omnibox_popup_truncating_label.h",
-    "omnibox_popup_truncating_label.mm",
     "omnibox_popup_view_controller.h",
     "omnibox_popup_view_controller.mm",
     "self_sizing_table_view.h",
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_view_controller.mm
index bd8337c..0c98970 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_view_controller.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_view_controller.mm
@@ -9,10 +9,10 @@
 
 #include "base/ios/ios_util.h"
 #include "base/metrics/histogram_macros.h"
+#import "ios/chrome/browser/ui/elements/fade_truncating_label.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_constants.h"
 #import "ios/chrome/browser/ui/omnibox/popup/image_retriever.h"
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.h"
-#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.h"
 #import "ios/chrome/browser/ui/omnibox/popup/self_sizing_table_view.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h"
 #include "ios/chrome/browser/ui/util/animation_util.h"
@@ -214,7 +214,7 @@
 
   [detailTextLabel setNeedsDisplay];
 
-  OmniboxPopupTruncatingLabel* textLabel = row.textTruncatingLabel;
+  FadeTruncatingLabel* textLabel = row.textTruncatingLabel;
   [textLabel setTextAlignment:self.alignment];
   LayoutRect textLabelLayout =
       LayoutRectMake(kTextCellLeadingPadding, CGRectGetWidth(rowBounds), 0,
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.h b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.h
index fa2c9e07..0e504775 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.h
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.h
@@ -7,7 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-@class OmniboxPopupTruncatingLabel;
+@class FadeTruncatingLabel;
 
 @class OmniboxPopupRow;
 
@@ -23,11 +23,10 @@
 @interface OmniboxPopupRow : UITableViewCell
 
 // A truncate-by-fading version of the textLabel of a UITableViewCell.
-@property(nonatomic, readonly, strong)
-    OmniboxPopupTruncatingLabel* textTruncatingLabel;
+@property(nonatomic, readonly, strong) FadeTruncatingLabel* textTruncatingLabel;
 // A truncate-by-fading version of the detailTextLabel of a UITableViewCell.
 @property(nonatomic, readonly, strong)
-    OmniboxPopupTruncatingLabel* detailTruncatingLabel;
+    FadeTruncatingLabel* detailTruncatingLabel;
 // A standard UILabel for answers, which truncates with ellipses to support
 // multi-line text.
 @property(nonatomic, readonly, strong) UILabel* detailAnswerLabel;
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.mm
index 93cec041..93690b8 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row.mm
@@ -7,8 +7,8 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "components/omnibox/common/omnibox_features.h"
+#import "ios/chrome/browser/ui/elements/fade_truncating_label.h"
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_accessibility_identifier_constants.h"
-#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
@@ -63,12 +63,12 @@
         [UIColor colorNamed:kTableViewRowHighlightDarkColor]);
 
     _textTruncatingLabel =
-        [[OmniboxPopupTruncatingLabel alloc] initWithFrame:CGRectZero];
+        [[FadeTruncatingLabel alloc] initWithFrame:CGRectZero];
     _textTruncatingLabel.userInteractionEnabled = NO;
     [self.contentView addSubview:_textTruncatingLabel];
 
     _detailTruncatingLabel =
-        [[OmniboxPopupTruncatingLabel alloc] initWithFrame:CGRectZero];
+        [[FadeTruncatingLabel alloc] initWithFrame:CGRectZero];
     _detailTruncatingLabel.userInteractionEnabled = NO;
     [self.contentView addSubview:_detailTruncatingLabel];
 
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
index 89b5aa3..26846ea5 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
@@ -9,9 +9,9 @@
 #include "components/omnibox/common/omnibox_features.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/elements/extended_touch_target_button.h"
+#import "ios/chrome/browser/ui/elements/fade_truncating_label.h"
 #import "ios/chrome/browser/ui/omnibox/popup/autocomplete_suggestion.h"
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_icon_view.h"
-#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
@@ -45,9 +45,9 @@
 // Stack view containing all text labels.
 @property(nonatomic, strong) UIStackView* textStackView;
 // Truncating label for the main text.
-@property(nonatomic, strong) OmniboxPopupTruncatingLabel* textTruncatingLabel;
+@property(nonatomic, strong) FadeTruncatingLabel* textTruncatingLabel;
 // Truncating label for the detail text.
-@property(nonatomic, strong) OmniboxPopupTruncatingLabel* detailTruncatingLabel;
+@property(nonatomic, strong) FadeTruncatingLabel* detailTruncatingLabel;
 // Regular UILabel for the detail text when the suggestion is an answer.
 // Answers have slightly different display requirements, like possibility of
 // multiple lines and truncating with ellipses instead of a fade gradient.
@@ -74,7 +74,7 @@
         [UIColor colorNamed:kTableViewRowHighlightDarkColor]);
 
     _textTruncatingLabel =
-        [[OmniboxPopupTruncatingLabel alloc] initWithFrame:CGRectZero];
+        [[FadeTruncatingLabel alloc] initWithFrame:CGRectZero];
     _textTruncatingLabel.translatesAutoresizingMaskIntoConstraints = NO;
     [_textTruncatingLabel
         setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh + 1
@@ -87,7 +87,7 @@
     _textStackView.alignment = UIStackViewAlignmentLeading;
 
     _detailTruncatingLabel =
-        [[OmniboxPopupTruncatingLabel alloc] initWithFrame:CGRectZero];
+        [[FadeTruncatingLabel alloc] initWithFrame:CGRectZero];
     _detailTruncatingLabel.translatesAutoresizingMaskIntoConstraints = NO;
 
     // Answers use a UILabel with NSLineBreakByTruncatingTail to produce a
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.h b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.h
deleted file mode 100644
index ed6cf88..0000000
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_truncating_label.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2012 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_OMNIBOX_POPUP_OMNIBOX_POPUP_TRUNCATING_LABEL_H_
-#define IOS_CHROME_BROWSER_UI_OMNIBOX_POPUP_OMNIBOX_POPUP_TRUNCATING_LABEL_H_
-
-#import <UIKit/UIKit.h>
-
-typedef enum {
-  OmniboxPopupTruncatingTail = 0x1,
-  OmniboxPopupTruncatingHead = 0x2,
-  OmniboxPopupTruncatingHeadAndTail =
-      OmniboxPopupTruncatingHead | OmniboxPopupTruncatingTail
-} OmniboxPopupTruncatingMode;
-
-// A label which applies a fade-to-background color gradient to one or both ends
-// of the string if it is too large to fit the available area. It is based on
-// GTMFadeTruncatingLabel but uses the attributedText property of UILabel rather
-// than the text and font properties.
-@interface OmniboxPopupTruncatingLabel : UILabel
-
-// Which side(s) to truncate.
-@property(nonatomic, assign) OmniboxPopupTruncatingMode truncateMode;
-
-// Whether the text being displayed should be treated as a URL.
-@property(nonatomic, assign) BOOL displayAsURL;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_OMNIBOX_POPUP_OMNIBOX_POPUP_TRUNCATING_LABEL_H_
diff --git a/ios/chrome/browser/ui/tabs/BUILD.gn b/ios/chrome/browser/ui/tabs/BUILD.gn
index 97a649f..ca9ce3a 100644
--- a/ios/chrome/browser/ui/tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/tabs/BUILD.gn
@@ -48,6 +48,7 @@
     "//ios/chrome/browser/ui/bubble",
     "//ios/chrome/browser/ui/colors",
     "//ios/chrome/browser/ui/commands",
+    "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/favicon/resources:default_world_favicon",
     "//ios/chrome/browser/ui/fullscreen",
     "//ios/chrome/browser/ui/image_util",
@@ -64,7 +65,6 @@
     "//ios/chrome/common/ui_util",
     "//ios/third_party/material_components_ios",
     "//ios/web",
-    "//third_party/google_toolbox_for_mac",
     "//ui/base",
     "//ui/gfx",
   ]
diff --git a/ios/chrome/browser/ui/tabs/tab_view.mm b/ios/chrome/browser/ui/tabs/tab_view.mm
index 46d33b14..4404738 100644
--- a/ios/chrome/browser/ui/tabs/tab_view.mm
+++ b/ios/chrome/browser/ui/tabs/tab_view.mm
@@ -14,6 +14,7 @@
 #include "ios/chrome/browser/drag_and_drop/drop_and_navigate_delegate.h"
 #include "ios/chrome/browser/drag_and_drop/drop_and_navigate_interaction.h"
 #include "ios/chrome/browser/system_flags.h"
+#import "ios/chrome/browser/ui/elements/fade_truncating_label.h"
 #import "ios/chrome/browser/ui/image_util/image_util.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
@@ -22,7 +23,6 @@
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h"
-#include "third_party/google_toolbox_for_mac/src/iPhone/GTMFadeTruncatingLabel.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -70,7 +70,7 @@
   UIButton* _closeButton;
 
   // View that draws the tab title.
-  GTMFadeTruncatingLabel* _titleLabel;
+  FadeTruncatingLabel* _titleLabel;
 
   // Background image for this tab.
   UIImageView* _backgroundImageView;
@@ -157,9 +157,9 @@
     return;
   if (base::i18n::GetStringDirection(base::SysNSStringToUTF16(title)) ==
       base::i18n::RIGHT_TO_LEFT) {
-    [_titleLabel setTruncateMode:GTMFadeTruncatingHead];
+    _titleLabel.truncateMode = FadeTruncatingHead;
   } else {
-    [_titleLabel setTruncateMode:GTMFadeTruncatingTail];
+    _titleLabel.truncateMode = FadeTruncatingTail;
   }
   _titleLabel.text = title;
   [_closeButton setAccessibilityValue:title];
@@ -301,15 +301,8 @@
   [self addSubview:_closeButton];
 
   // Add fade truncating label.
-  _titleLabel = [[GTMFadeTruncatingLabel alloc] initWithFrame:CGRectZero];
+  _titleLabel = [[FadeTruncatingLabel alloc] initWithFrame:CGRectZero];
   [_titleLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
-
-  // Setting NSLineBreakByCharWrapping fixes an issue where the beginning of the
-  // text is truncated for RTL text writing direction. Anyway since the label is
-  // only one line and the end of the text is faded behind a gradient mask, it
-  // is visually almost equivalent to NSLineBreakByClipping.
-  [_titleLabel setLineBreakMode:NSLineBreakByCharWrapping];
-
   [_titleLabel setTextAlignment:NSTextAlignmentNatural];
   [self addSubview:_titleLabel];
 
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc
index 78d508ca..9f16754 100644
--- a/media/blink/webmediaplayer_impl_unittest.cc
+++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -51,6 +51,7 @@
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h"
 #include "third_party/blink/public/platform/media/webmediaplayer_delegate.h"
 #include "third_party/blink/public/platform/web_fullscreen_video_status.h"
 #include "third_party/blink/public/platform/web_media_player.h"
@@ -101,6 +102,13 @@
                                   std::string(new_rate_string));
 }
 
+// returns a valid handle that can be passed to WebLocalFrame constructor
+mojo::ScopedMessagePipeHandle CreateStubDocumentInterfaceBrokerHandle() {
+  return mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>()
+      .InitWithNewPipeAndPassReceiver()
+      .PassPipe();
+}
+
 class MockWebMediaPlayerClient : public blink::WebMediaPlayerClient {
  public:
   MockWebMediaPlayerClient() = default;
@@ -306,11 +314,12 @@
                                          /*is_hidden=*/false,
                                          /*compositing_enabled=*/false,
                                          nullptr)),
-        web_local_frame_(
-            blink::WebLocalFrame::CreateMainFrame(web_view_,
-                                                  &web_frame_client_,
-                                                  nullptr,
-                                                  nullptr)),
+        web_local_frame_(blink::WebLocalFrame::CreateMainFrame(
+            web_view_,
+            &web_frame_client_,
+            nullptr,
+            CreateStubDocumentInterfaceBrokerHandle(),
+            nullptr)),
         context_provider_(viz::TestContextProvider::Create()),
         audio_parameters_(TestAudioParameters::Normal()) {
     media_thread_.StartAndWaitForTesting();
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 2c77367..838971a 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -948,7 +948,6 @@
       "quic/quic_utils_chromium.cc",
       "quic/quic_utils_chromium.h",
       "quiche/common/platform/impl/quiche_logging_impl.h",
-      "quiche/common/platform/impl/quiche_ptr_util_impl.h",
       "quiche/common/platform/impl/quiche_unordered_containers_impl.h",
       "socket/client_socket_factory.cc",
       "socket/client_socket_factory.h",
@@ -1077,7 +1076,6 @@
       "ssl/threaded_ssl_private_key.cc",
       "ssl/threaded_ssl_private_key.h",
       "third_party/quiche/src/common/platform/api/quiche_logging.h",
-      "third_party/quiche/src/common/platform/api/quiche_ptr_util.h",
       "third_party/quiche/src/common/platform/api/quiche_unordered_containers.h",
       "third_party/quiche/src/common/simple_linked_hash_map.h",
       "third_party/quiche/src/http2/decoder/decode_buffer.cc",
@@ -1464,8 +1462,6 @@
       "third_party/quiche/src/quic/core/quic_one_block_arena.h",
       "third_party/quiche/src/quic/core/quic_packet_creator.cc",
       "third_party/quiche/src/quic/core/quic_packet_creator.h",
-      "third_party/quiche/src/quic/core/quic_packet_generator.cc",
-      "third_party/quiche/src/quic/core/quic_packet_generator.h",
       "third_party/quiche/src/quic/core/quic_packet_number.cc",
       "third_party/quiche/src/quic/core/quic_packet_number.h",
       "third_party/quiche/src/quic/core/quic_packet_writer.h",
@@ -3402,8 +3398,6 @@
     "third_party/quiche/src/quic/test_tools/quic_framer_peer.h",
     "third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.cc",
     "third_party/quiche/src/quic/test_tools/quic_packet_creator_peer.h",
-    "third_party/quiche/src/quic/test_tools/quic_packet_generator_peer.cc",
-    "third_party/quiche/src/quic/test_tools/quic_packet_generator_peer.h",
     "third_party/quiche/src/quic/test_tools/quic_sent_packet_manager_peer.cc",
     "third_party/quiche/src/quic/test_tools/quic_sent_packet_manager_peer.h",
     "third_party/quiche/src/quic/test_tools/quic_server_session_base_peer.h",
@@ -3552,6 +3546,10 @@
     "third_party/quiche/src/quic/tools/quic_spdy_client_base.cc",
     "third_party/quiche/src/quic/tools/quic_spdy_client_base.h",
     "third_party/quiche/src/quic/tools/quic_spdy_server_base.h",
+    "third_party/quiche/src/quic/tools/quic_transport_simple_server_dispatcher.cc",
+    "third_party/quiche/src/quic/tools/quic_transport_simple_server_dispatcher.h",
+    "third_party/quiche/src/quic/tools/quic_transport_simple_server_session.cc",
+    "third_party/quiche/src/quic/tools/quic_transport_simple_server_session.h",
     "third_party/quiche/src/quic/tools/quic_url.cc",
     "third_party/quiche/src/quic/tools/quic_url.h",
     "tools/quic/quic_client_message_loop_network_helper.cc",
@@ -5517,7 +5515,6 @@
     "third_party/quiche/src/quic/core/quic_lru_cache_test.cc",
     "third_party/quiche/src/quic/core/quic_one_block_arena_test.cc",
     "third_party/quiche/src/quic/core/quic_packet_creator_test.cc",
-    "third_party/quiche/src/quic/core/quic_packet_generator_test.cc",
     "third_party/quiche/src/quic/core/quic_packet_number_test.cc",
     "third_party/quiche/src/quic/core/quic_packets_test.cc",
     "third_party/quiche/src/quic/core/quic_received_packet_manager_test.cc",
@@ -5838,7 +5835,8 @@
       "quic/platform/impl/quic_socket_utils_test.cc",
       "third_party/quiche/src/epoll_server/simple_epoll_server_test.cc",
       "third_party/quiche/src/quic/core/chlo_extractor_test.cc",
-      "third_party/quiche/src/quic/core/http/end_to_end_test.cc",
+
+      #"third_party/quiche/src/quic/core/http/end_to_end_test.cc",
       "third_party/quiche/src/quic/core/http/quic_spdy_client_session_test.cc",
       "third_party/quiche/src/quic/core/http/quic_spdy_client_stream_test.cc",
       "third_party/quiche/src/quic/core/http/quic_spdy_server_stream_base_test.cc",
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index bc81789..4b91f17 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -618,6 +618,76 @@
   EXPECT_TRUE(quic_data.AllWriteDataConsumed());
 }
 
+// Regression test for https://crbug.com/1021938.
+// When the connection is closed, there may be tasks queued in the message loop
+// to read the last packet, reading that packet should not crash.
+TEST_P(QuicChromiumClientSessionTest, ReadAfterConnectionClose) {
+  MockQuicData quic_data(version_);
+  if (version_.transport_version == quic::QUIC_VERSION_99) {
+    quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeInitialSettingsPacket(1));
+    // The open stream limit is set to 50 by
+    // MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
+    // requested, a STREAMS_BLOCKED will be sent, indicating that it's blocked
+    // at the limit of 50.
+    quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+                                        2, true, 50,
+                                        /*unidirectional=*/false));
+    quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+                                        3, true, 50,
+                                        /*unidirectional=*/false));
+  }
+  quic_data.AddRead(ASYNC, ERR_IO_PENDING);
+  // This packet will be read after connection is closed.
+  quic_data.AddRead(
+      ASYNC,
+      server_maker_.MakeConnectionClosePacket(
+          1, false, quic::QUIC_CRYPTO_VERSION_NOT_SUPPORTED, "Time to panic!"));
+  quic_data.AddSocketDataToFactory(&socket_factory_);
+
+  Initialize();
+  CompleteCryptoHandshake();
+
+  // Open the maximum number of streams so that a subsequent request
+  // can not proceed immediately.
+  const size_t kMaxOpenStreams = GetMaxAllowedOutgoingBidirectionalStreams();
+  for (size_t i = 0; i < kMaxOpenStreams; i++) {
+    QuicChromiumClientSessionPeer::CreateOutgoingStream(session_.get());
+  }
+  EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams());
+
+  // Request two streams which will both be pending.
+  // In V99 each will generate a max stream id for each attempt.
+  std::unique_ptr<QuicChromiumClientSession::Handle> handle =
+      session_->CreateHandle(destination_);
+  std::unique_ptr<QuicChromiumClientSession::Handle> handle2 =
+      session_->CreateHandle(destination_);
+
+  ASSERT_EQ(
+      ERR_IO_PENDING,
+      handle->RequestStream(
+          /*requires_confirmation=*/false,
+          base::BindOnce(&QuicChromiumClientSessionTest::ResetHandleOnError,
+                         base::Unretained(this), &handle2),
+          TRAFFIC_ANNOTATION_FOR_TESTS));
+
+  TestCompletionCallback callback2;
+  ASSERT_EQ(ERR_IO_PENDING,
+            handle2->RequestStream(/*requires_confirmation=*/false,
+                                   callback2.callback(),
+                                   TRAFFIC_ANNOTATION_FOR_TESTS));
+
+  session_->connection()->CloseConnection(
+      quic::QUIC_NETWORK_IDLE_TIMEOUT, "Timed out",
+      quic::ConnectionCloseBehavior::SILENT_CLOSE);
+
+  // Pump the message loop to read the connection close packet.
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(handle2.get());
+  quic_data.Resume();
+  EXPECT_TRUE(quic_data.AllReadDataConsumed());
+  EXPECT_TRUE(quic_data.AllWriteDataConsumed());
+}
+
 TEST_P(QuicChromiumClientSessionTest, ClosedWithAsyncStreamRequest) {
   MockQuicData quic_data(version_);
   if (version_.transport_version == quic::QUIC_VERSION_99) {
diff --git a/net/quic/quic_chromium_packet_reader.cc b/net/quic/quic_chromium_packet_reader.cc
index bfce84a..e8f5f78 100644
--- a/net/quic/quic_chromium_packet_reader.cc
+++ b/net/quic/quic_chromium_packet_reader.cc
@@ -116,10 +116,17 @@
   quic::QuicReceivedPacket packet(read_buffer_->data(), result, clock_->Now());
   IPEndPoint local_address;
   IPEndPoint peer_address;
-  socket_->GetLocalAddress(&local_address);
-  socket_->GetPeerAddress(&peer_address);
-  return visitor_->OnPacket(packet, ToQuicSocketAddress(local_address),
-                            ToQuicSocketAddress(peer_address));
+  // TODO(zhongyi): once crbug.com/1014092 is root caused, consider early return
+  // false if |socket_| is nulled. For debugging purpose, still report up to
+  // avoid introducing behavior change.
+  // If the socket has been nulled, the connection is already closed. Reporting
+  // packet up to the visitor is a no-op.
+  if (socket_ != nullptr) {
+    socket_->GetLocalAddress(&local_address_);
+    socket_->GetPeerAddress(&peer_address_);
+  }
+  return visitor_->OnPacket(packet, ToQuicSocketAddress(local_address_),
+                            ToQuicSocketAddress(peer_address_));
 }
 
 void QuicChromiumPacketReader::OnReadComplete(int result) {
diff --git a/net/quic/quic_chromium_packet_reader.h b/net/quic/quic_chromium_packet_reader.h
index 7a9e6de..95067d8 100644
--- a/net/quic/quic_chromium_packet_reader.h
+++ b/net/quic/quic_chromium_packet_reader.h
@@ -16,6 +16,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "net/base/io_buffer.h"
+#include "net/base/ip_endpoint.h"
 #include "net/base/net_export.h"
 #include "net/log/net_log_with_source.h"
 #include "net/socket/datagram_client_socket.h"
@@ -65,6 +66,9 @@
   void SetShouldStopReading() {
     DCHECK(!should_stop_reading_);
     should_stop_reading_ = true;
+    // Cache local and peer addresses before null out the socket.
+    socket_->GetLocalAddress(&local_address_);
+    socket_->GetPeerAddress(&peer_address_);
     socket_ = nullptr;
   }
 
@@ -85,6 +89,8 @@
   bool ProcessReadResult(int result);
 
   DatagramClientSocket* socket_;
+  IPEndPoint local_address_;
+  IPEndPoint peer_address_;
   // Set to true if |this| should no longer attempt read.
   bool should_stop_reading_;
 
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index b49bf8cd..9e8eae7 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -370,3 +370,9 @@
 
 // The maximum congestion window in packets.
 QUIC_FLAG(int32_t, FLAGS_quic_max_congestion_window, 2000)
+
+// If true, QuicCryptoStream::OnCryptoFrame() will never use the frame's
+// encryption level.
+QUIC_FLAG(bool,
+          FLAGS_quic_reloadable_flag_quic_use_connection_encryption_level,
+          false)
diff --git a/net/quiche/common/platform/impl/quiche_ptr_util_impl.h b/net/quiche/common/platform/impl/quiche_ptr_util_impl.h
deleted file mode 100644
index 8f7dd21e..0000000
--- a/net/quiche/common/platform/impl/quiche_ptr_util_impl.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2019 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 NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_PTR_UTIL_IMPL_H_
-#define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_PTR_UTIL_IMPL_H_
-
-#include <memory>
-
-namespace quiche {
-
-template <typename T, typename... Args>
-std::unique_ptr<T> QuicheMakeUniqueImpl(Args&&... args) {
-  return std::make_unique<T>(std::forward<Args>(args)...);
-}
-
-}  // namespace quiche
-
-#endif  // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_PTR_UTIL_IMPL_H_
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn
index 09942bc..936c3a6 100644
--- a/remoting/host/BUILD.gn
+++ b/remoting/host/BUILD.gn
@@ -425,10 +425,7 @@
       "Carbon.framework",
     ]
 
-    deps += [
-      ":remoting_version",
-      "//third_party/google_toolbox_for_mac",
-    ]
+    deps += [ ":remoting_version" ]
   }
 
   if (is_win) {
diff --git a/remoting/host/input_monitor/BUILD.gn b/remoting/host/input_monitor/BUILD.gn
index 8293668..3e3a99e 100644
--- a/remoting/host/input_monitor/BUILD.gn
+++ b/remoting/host/input_monitor/BUILD.gn
@@ -39,10 +39,6 @@
     deps += [ "//ui/ozone" ]
   }
 
-  if (is_mac) {
-    deps += [ "//third_party/google_toolbox_for_mac" ]
-  }
-
   if (!use_x11 || (is_chromeos && !use_ozone)) {
     sources -= [
       "local_hotkey_input_monitor_x11.cc",
diff --git a/services/identity/identity_accessor_impl_unittest.cc b/services/identity/identity_accessor_impl_unittest.cc
index a1a463d4..c1be169 100644
--- a/services/identity/identity_accessor_impl_unittest.cc
+++ b/services/identity/identity_accessor_impl_unittest.cc
@@ -141,7 +141,7 @@
 // Check that the primary account info has expected values if signed in without
 // a refresh token available.
 TEST_F(IdentityAccessorImplTest, GetPrimaryAccountInfoSignedInNoRefreshToken) {
-  std::string primary_account_id =
+  CoreAccountId primary_account_id =
       identity_test_environment()->SetPrimaryAccount(kTestEmail).account_id;
 
   base::RunLoop run_loop;
@@ -161,9 +161,10 @@
 // Check that the primary account info has expected values if signed in with a
 // refresh token available.
 TEST_F(IdentityAccessorImplTest, GetPrimaryAccountInfoSignedInRefreshToken) {
-  std::string primary_account_id = identity_test_environment()
-                                       ->MakePrimaryAccountAvailable(kTestEmail)
-                                       .account_id;
+  CoreAccountId primary_account_id =
+      identity_test_environment()
+          ->MakePrimaryAccountAvailable(kTestEmail)
+          .account_id;
 
   base::RunLoop run_loop;
   GetIdentityAccessorImpl()->GetPrimaryAccountInfo(base::BindRepeating(
@@ -182,9 +183,10 @@
 // Check that GetPrimaryAccountWhenAvailable() returns immediately in the
 // case where the primary account is available when the call is received.
 TEST_F(IdentityAccessorImplTest, GetPrimaryAccountWhenAvailableSignedIn) {
-  std::string primary_account_id = identity_test_environment()
-                                       ->MakePrimaryAccountAvailable(kTestEmail)
-                                       .account_id;
+  CoreAccountId primary_account_id =
+      identity_test_environment()
+          ->MakePrimaryAccountAvailable(kTestEmail)
+          .account_id;
 
   AccountInfo account_info;
   AccountState account_state;
@@ -227,9 +229,10 @@
 
   // Make the primary account available and check that the callback is invoked
   // as expected.
-  std::string primary_account_id = identity_test_environment()
-                                       ->MakePrimaryAccountAvailable(kTestEmail)
-                                       .account_id;
+  CoreAccountId primary_account_id =
+      identity_test_environment()
+          ->MakePrimaryAccountAvailable(kTestEmail)
+          .account_id;
   run_loop.Run();
 
   EXPECT_EQ(primary_account_id, account_info.account_id);
@@ -248,7 +251,7 @@
   AccountState account_state;
 
   // Sign in, but don't set the refresh token yet.
-  std::string primary_account_id =
+  CoreAccountId primary_account_id =
       identity_test_environment()->SetPrimaryAccount(kTestEmail).account_id;
   base::RunLoop run_loop;
   GetIdentityAccessorImpl()->GetPrimaryAccountWhenAvailable(base::BindRepeating(
@@ -294,7 +297,7 @@
   AccountState account_state;
 
   // Set the refresh token, but don't sign in yet.
-  std::string account_id_to_use =
+  CoreAccountId account_id_to_use =
       identity_test_environment()->MakeAccountAvailable(kTestEmail).account_id;
   identity_test_environment()->SetRefreshTokenForAccount(account_id_to_use);
 
@@ -306,7 +309,7 @@
 
   // Sign the user in and check that the callback is invoked as expected (i.e.,
   // the primary account is now considered available).
-  std::string primary_account_id =
+  CoreAccountId primary_account_id =
       identity_test_environment()->SetPrimaryAccount(kTestEmail).account_id;
 
   run_loop.Run();
@@ -352,9 +355,10 @@
 
   // Make the primary account available and check that the callbacks are invoked
   // as expected.
-  std::string primary_account_id = identity_test_environment()
-                                       ->MakePrimaryAccountAvailable(kTestEmail)
-                                       .account_id;
+  CoreAccountId primary_account_id =
+      identity_test_environment()
+          ->MakePrimaryAccountAvailable(kTestEmail)
+          .account_id;
 
   run_loop.Run();
   run_loop2.Run();
@@ -376,9 +380,10 @@
 // available if the refresh token has an auth error.
 TEST_F(IdentityAccessorImplTest,
        GetPrimaryAccountWhenAvailableRefreshTokenHasAuthError) {
-  std::string primary_account_id = identity_test_environment()
-                                       ->MakePrimaryAccountAvailable(kTestEmail)
-                                       .account_id;
+  CoreAccountId primary_account_id =
+      identity_test_environment()
+          ->MakePrimaryAccountAvailable(kTestEmail)
+          .account_id;
   identity_test_environment()->UpdatePersistentErrorOfRefreshTokenForAccount(
       primary_account_id,
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
@@ -414,7 +419,7 @@
 TEST_F(IdentityAccessorImplTest, GetAccessTokenNotSignedIn) {
   base::RunLoop run_loop;
   GetIdentityAccessorImpl()->GetAccessToken(
-      kTestGaiaId, ScopeSet(), "dummy_consumer",
+      CoreAccountId(kTestGaiaId), ScopeSet(), "dummy_consumer",
       base::BindRepeating(&IdentityAccessorImplTest::OnReceivedAccessToken,
                           base::Unretained(this), run_loop.QuitClosure()));
   run_loop.Run();
@@ -426,9 +431,10 @@
 // Check that the expected access token is received if requesting an access
 // token when signed in.
 TEST_F(IdentityAccessorImplTest, GetAccessTokenSignedIn) {
-  std::string primary_account_id = identity_test_environment()
-                                       ->MakePrimaryAccountAvailable(kTestEmail)
-                                       .account_id;
+  CoreAccountId primary_account_id =
+      identity_test_environment()
+          ->MakePrimaryAccountAvailable(kTestEmail)
+          .account_id;
   base::RunLoop run_loop;
   GetIdentityAccessorImpl()->GetAccessToken(
       primary_account_id, ScopeSet(), "dummy_consumer",
diff --git a/services/network/cors/cors_url_loader_factory.h b/services/network/cors/cors_url_loader_factory.h
index c93ce999..b57ebbd 100644
--- a/services/network/cors/cors_url_loader_factory.h
+++ b/services/network/cors/cors_url_loader_factory.h
@@ -56,6 +56,8 @@
   // URLLoaders.
   void ClearBindings();
 
+  uint32_t process_id() const { return process_id_; }
+
   // Set whether the factory allows CORS preflights. See IsSane.
   static void SetAllowExternalPreflightsForTesting(bool allow) {
     allow_external_preflights_for_testing_ = allow;
diff --git a/services/network/keepalive_statistics_recorder.cc b/services/network/keepalive_statistics_recorder.cc
index aff4430..3ed390d 100644
--- a/services/network/keepalive_statistics_recorder.cc
+++ b/services/network/keepalive_statistics_recorder.cc
@@ -104,13 +104,4 @@
   return it->second.total_request_size;
 }
 
-bool KeepaliveStatisticsRecorder::HasRecordForProcess(int process_id) const {
-  auto it = per_process_records_.find(process_id);
-  if (it != per_process_records_.end()) {
-    DCHECK(it->second.num_registrations > 0);
-    return true;
-  }
-  return false;
-}
-
 }  // namespace network
diff --git a/services/network/keepalive_statistics_recorder.h b/services/network/keepalive_statistics_recorder.h
index 57245e19..b9780a58 100644
--- a/services/network/keepalive_statistics_recorder.h
+++ b/services/network/keepalive_statistics_recorder.h
@@ -44,8 +44,6 @@
   const std::unordered_map<int, PerProcessStats>& per_process_records() const {
     return per_process_records_;
   }
-  // Returns true iff. number of Register calls > Unregister calls.
-  bool HasRecordForProcess(int process_id) const;
   int NumInflightRequestsPerProcess(int process_id) const;
   int GetTotalRequestSizePerProcess(int process_id) const;
   int num_inflight_requests() const { return num_inflight_requests_; }
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index ac6f708..765693c 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -74,6 +74,7 @@
 #include "services/network/network_service.h"
 #include "services/network/network_service_network_delegate.h"
 #include "services/network/network_service_proxy_delegate.h"
+#include "services/network/network_usage_accumulator.h"
 #include "services/network/p2p/socket_manager.h"
 #include "services/network/proxy_config_service_mojo.h"
 #include "services/network/proxy_lookup_request.h"
@@ -534,9 +535,23 @@
 
 void NetworkContext::DestroyURLLoaderFactory(
     cors::CorsURLLoaderFactory* url_loader_factory) {
+  const uint32_t process_id = url_loader_factory->process_id();
+
   auto it = url_loader_factories_.find(url_loader_factory);
   DCHECK(it != url_loader_factories_.end());
   url_loader_factories_.erase(it);
+
+  // Reset bytes transferred for the process if |url_loader_factory| is the
+  // last factory associated with the process.
+  if (network_service() &&
+      std::none_of(url_loader_factories_.cbegin(), url_loader_factories_.cend(),
+                   [process_id](const auto& factory) {
+                     return factory->process_id() == process_id;
+                   })) {
+    network_service()
+        ->network_usage_accumulator()
+        ->ClearBytesTransferredForProcess(process_id);
+  }
 }
 
 void NetworkContext::LoaderCreated(uint32_t process_id) {
diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc
index 7145e0e96..9f064f17 100644
--- a/services/network/url_loader_factory.cc
+++ b/services/network/url_loader_factory.cc
@@ -79,15 +79,6 @@
   if (context_->network_service()) {
     context_->network_service()->keepalive_statistics_recorder()->Unregister(
         params_->process_id);
-    // Reset bytes transferred for the process if this is the last
-    // |URLLoaderFactory|.
-    if (!context_->network_service()
-             ->keepalive_statistics_recorder()
-             ->HasRecordForProcess(params_->process_id)) {
-      context_->network_service()
-          ->network_usage_accumulator()
-          ->ClearBytesTransferredForProcess(params_->process_id);
-    }
   }
 }
 
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index 87ee29d..99da57ad 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -26,7 +26,7 @@
 skia_support_skottie = true
 
 declare_args() {
-  enable_skia_wuffs_gif = false
+  enable_skia_wuffs_gif = true
   skia_whitelist_serialized_typefaces = false
 }
 
diff --git a/storage/browser/BUILD.gn b/storage/browser/BUILD.gn
index 8330dbc..f6429932 100644
--- a/storage/browser/BUILD.gn
+++ b/storage/browser/BUILD.gn
@@ -197,8 +197,8 @@
     "quota/quota_client.h",
     "quota/quota_database.cc",
     "quota/quota_database.h",
-    "quota/quota_disk_info_helper.cc",
-    "quota/quota_disk_info_helper.h",
+    "quota/quota_device_info_helper.cc",
+    "quota/quota_device_info_helper.h",
     "quota/quota_features.cc",
     "quota/quota_features.h",
     "quota/quota_limit_type.h",
diff --git a/storage/browser/file_system/file_system_features.cc b/storage/browser/file_system/file_system_features.cc
index a27a5dd..d8472bd 100644
--- a/storage/browser/file_system/file_system_features.cc
+++ b/storage/browser/file_system/file_system_features.cc
@@ -10,7 +10,7 @@
 
 // Enables persistent Filesystem API in incognito mode.
 const base::Feature kEnablePersistentFilesystemInIncognito{
-    "EnablePersistentFilesystemInIncognito", base::FEATURE_DISABLED_BY_DEFAULT};
+    "EnablePersistentFilesystemInIncognito", base::FEATURE_ENABLED_BY_DEFAULT};
 }  // namespace features
 
 }  // namespace storage
\ No newline at end of file
diff --git a/storage/browser/quota/quota_device_info_helper.cc b/storage/browser/quota/quota_device_info_helper.cc
new file mode 100644
index 0000000..23f5c288
--- /dev/null
+++ b/storage/browser/quota/quota_device_info_helper.cc
@@ -0,0 +1,20 @@
+// Copyright 2019 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 "storage/browser/quota/quota_device_info_helper.h"
+
+namespace storage {
+
+QuotaDeviceInfoHelper::~QuotaDeviceInfoHelper() = default;
+
+int64_t QuotaDeviceInfoHelper::AmountOfTotalDiskSpace(
+    const base::FilePath& path) const {
+  return base::SysInfo::AmountOfTotalDiskSpace(path);
+}
+
+int64_t QuotaDeviceInfoHelper::AmountOfPhysicalMemory() const {
+  return base::SysInfo::AmountOfPhysicalMemory();
+}
+
+}  // namespace storage
diff --git a/storage/browser/quota/quota_device_info_helper.h b/storage/browser/quota/quota_device_info_helper.h
new file mode 100644
index 0000000..b534d70
--- /dev/null
+++ b/storage/browser/quota/quota_device_info_helper.h
@@ -0,0 +1,33 @@
+// Copyright 2019 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/component_export.h"
+#include "base/no_destructor.h"
+#include "base/system/sys_info.h"
+
+#ifndef STORAGE_BROWSER_QUOTA_QUOTA_DEVICE_INFO_HELPER_H_
+#define STORAGE_BROWSER_QUOTA_QUOTA_DEVICE_INFO_HELPER_H_
+
+namespace storage {
+
+// Interface used by the quota system to gather disk space information.
+// Can be overridden in tests.
+// Subclasses must be thread-safe.
+// QuotaSettings instances own a singleton instance of QuotaDeviceInfoHelper.
+class COMPONENT_EXPORT(STORAGE_BROWSER) QuotaDeviceInfoHelper {
+ public:
+  QuotaDeviceInfoHelper() = default;
+  virtual ~QuotaDeviceInfoHelper();
+
+  virtual int64_t AmountOfTotalDiskSpace(const base::FilePath& path) const;
+
+  virtual int64_t AmountOfPhysicalMemory() const;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(QuotaDeviceInfoHelper);
+};  // class QuotaDeviceInfoHelper
+
+}  // namespace storage
+
+#endif  // STORAGE_BROWSER_QUOTA_QUOTA_DEVICE_INFO_HELPER_H_
diff --git a/storage/browser/quota/quota_disk_info_helper.cc b/storage/browser/quota/quota_disk_info_helper.cc
deleted file mode 100644
index 0acb2de..0000000
--- a/storage/browser/quota/quota_disk_info_helper.cc
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2019 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 "storage/browser/quota/quota_disk_info_helper.h"
-
-namespace storage {
-
-QuotaDiskInfoHelper::~QuotaDiskInfoHelper() = default;
-
-int64_t QuotaDiskInfoHelper::AmountOfTotalDiskSpace(
-    const base::FilePath& path) const {
-  return base::SysInfo::AmountOfTotalDiskSpace(path);
-}
-
-}  // namespace storage
diff --git a/storage/browser/quota/quota_disk_info_helper.h b/storage/browser/quota/quota_disk_info_helper.h
deleted file mode 100644
index 79ce6a7e..0000000
--- a/storage/browser/quota/quota_disk_info_helper.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2019 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/component_export.h"
-#include "base/no_destructor.h"
-#include "base/system/sys_info.h"
-
-#ifndef STORAGE_BROWSER_QUOTA_QUOTA_DISK_INFO_HELPER_H_
-#define STORAGE_BROWSER_QUOTA_QUOTA_DISK_INFO_HELPER_H_
-
-namespace storage {
-
-// Interface used by the quota system to gather disk space information.
-// Can be overridden in tests.
-// Subclasses must be thread-safe.
-// QuotaSettings instances own a singleton instance of QuotaDiskInfoHelper.
-class COMPONENT_EXPORT(STORAGE_BROWSER) QuotaDiskInfoHelper {
- public:
-  QuotaDiskInfoHelper() = default;
-  virtual ~QuotaDiskInfoHelper();
-
-  virtual int64_t AmountOfTotalDiskSpace(const base::FilePath& path) const;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(QuotaDiskInfoHelper);
-};  // class QuotaDiskInfoHelper
-
-}  // namespace storage
-
-#endif  // STORAGE_BROWSER_QUOTA_QUOTA_DISK_INFO_HELPER_H_
diff --git a/storage/browser/quota/quota_settings.cc b/storage/browser/quota/quota_settings.cc
index d4b51ae..5e7ff04 100644
--- a/storage/browser/quota/quota_settings.cc
+++ b/storage/browser/quota/quota_settings.cc
@@ -13,7 +13,7 @@
 #include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "build/build_config.h"
-#include "storage/browser/quota/quota_disk_info_helper.h"
+#include "storage/browser/quota/quota_device_info_helper.h"
 #include "storage/browser/quota/quota_features.h"
 #include "storage/browser/quota/quota_macros.h"
 
@@ -60,13 +60,13 @@
 base::Optional<storage::QuotaSettings> CalculateNominalDynamicSettings(
     const base::FilePath& partition_path,
     bool is_incognito,
-    QuotaDiskInfoHelper* disk_info_helper) {
+    QuotaDeviceInfoHelper* device_info_helper) {
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
                                                 base::BlockingType::MAY_BLOCK);
 
   if (is_incognito) {
     return CalculateIncognitoDynamicSettings(
-        base::SysInfo::AmountOfPhysicalMemory());
+        device_info_helper->AmountOfPhysicalMemory());
   }
 
   // The fraction of the device's storage the browser is willing to
@@ -124,7 +124,7 @@
 
   storage::QuotaSettings settings;
 
-  int64_t total = disk_info_helper->AmountOfTotalDiskSpace(partition_path);
+  int64_t total = device_info_helper->AmountOfTotalDiskSpace(partition_path);
   if (total == -1) {
     LOG(ERROR) << "Unable to compute QuotaSettings.";
     return base::nullopt;
@@ -150,25 +150,21 @@
 
 }  // namespace
 
-int64_t GetIncognitoPoolSizeForTesting(int64_t physical_memory_amount) {
-  return CalculateIncognitoDynamicSettings(physical_memory_amount).pool_size;
-}
-
 void GetNominalDynamicSettings(const base::FilePath& partition_path,
                                bool is_incognito,
-                               QuotaDiskInfoHelper* disk_info_helper,
+                               QuotaDeviceInfoHelper* device_info_helper,
                                OptionalQuotaSettingsCallback callback) {
   base::PostTaskAndReplyWithResult(
       FROM_HERE,
       {base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_VISIBLE,
        base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
       base::BindOnce(&CalculateNominalDynamicSettings, partition_path,
-                     is_incognito, base::Unretained(disk_info_helper)),
+                     is_incognito, base::Unretained(device_info_helper)),
       std::move(callback));
 }
 
-QuotaDiskInfoHelper* GetDefaultDiskInfoHelper() {
-  static base::NoDestructor<QuotaDiskInfoHelper> singleton;
+QuotaDeviceInfoHelper* GetDefaultDeviceInfoHelper() {
+  static base::NoDestructor<QuotaDeviceInfoHelper> singleton;
   return singleton.get();
 }
 
diff --git a/storage/browser/quota/quota_settings.h b/storage/browser/quota/quota_settings.h
index 23234318..c01ce6d 100644
--- a/storage/browser/quota/quota_settings.h
+++ b/storage/browser/quota/quota_settings.h
@@ -13,7 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/optional.h"
 #include "base/time/time.h"
-#include "storage/browser/quota/quota_disk_info_helper.h"
+#include "storage/browser/quota/quota_device_info_helper.h"
 
 namespace storage {
 
@@ -79,13 +79,10 @@
 COMPONENT_EXPORT(STORAGE_BROWSER)
 void GetNominalDynamicSettings(const base::FilePath& partition_path,
                                bool is_incognito,
-                               QuotaDiskInfoHelper* diskInfoHelper,
+                               QuotaDeviceInfoHelper* deviceInfoHelper,
                                OptionalQuotaSettingsCallback callback);
 
 COMPONENT_EXPORT(STORAGE_BROWSER)
-// TODO(https://crbug.com/1017120): Add memory size mocking support to
-// QuotaDiskInfoHelper and remove this function.
-int64_t GetIncognitoPoolSizeForTesting(int64_t physical_memory_amount);
 
 // Returns settings with a poolsize of zero and no per host quota.
 inline QuotaSettings GetNoQuotaSettings() {
@@ -102,7 +99,7 @@
 // Returns object that can fetch actual total disk space; instance lives
 // as long as the process is a live.
 COMPONENT_EXPORT(STORAGE_BROWSER)
-QuotaDiskInfoHelper* GetDefaultDiskInfoHelper();
+QuotaDeviceInfoHelper* GetDefaultDeviceInfoHelper();
 }  // namespace storage
 
 #endif  // STORAGE_BROWSER_QUOTA_QUOTA_SETTINGS_H_
diff --git a/storage/browser/quota/quota_settings_unittest.cc b/storage/browser/quota/quota_settings_unittest.cc
index 4617370e..d9ae9d8 100644
--- a/storage/browser/quota/quota_settings_unittest.cc
+++ b/storage/browser/quota/quota_settings_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
-#include "storage/browser/quota/quota_disk_info_helper.h"
+#include "storage/browser/quota/quota_device_info_helper.h"
 #include "storage/browser/quota/quota_features.h"
 #include "storage/browser/quota/quota_settings.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -20,10 +20,11 @@
 
 namespace storage {
 
-class MockQuotaDiskInfoHelper : public QuotaDiskInfoHelper {
+class MockQuotaDeviceInfoHelper : public QuotaDeviceInfoHelper {
  public:
-  MockQuotaDiskInfoHelper() = default;
+  MockQuotaDeviceInfoHelper() = default;
   MOCK_CONST_METHOD1(AmountOfTotalDiskSpace, int64_t(const base::FilePath&));
+  MOCK_CONST_METHOD0(AmountOfPhysicalMemory, int64_t());
 };
 
 class QuotaSettingsTest : public testing::Test {
@@ -43,13 +44,13 @@
 };
 
 TEST_F(QuotaSettingsTest, Default) {
-  MockQuotaDiskInfoHelper disk_info_helper;
-  ON_CALL(disk_info_helper, AmountOfTotalDiskSpace(_))
+  MockQuotaDeviceInfoHelper device_info_helper;
+  ON_CALL(device_info_helper, AmountOfTotalDiskSpace(_))
       .WillByDefault(::testing::Return(2000));
 
   bool callback_executed = false;
   GetNominalDynamicSettings(
-      profile_path(), false, &disk_info_helper,
+      profile_path(), false, &device_info_helper,
       base::BindLambdaForTesting([&](base::Optional<QuotaSettings> settings) {
         callback_executed = true;
         ASSERT_NE(settings, base::nullopt);
@@ -63,8 +64,8 @@
 }
 
 TEST_F(QuotaSettingsTest, ExpandedTempPool) {
-  MockQuotaDiskInfoHelper disk_info_helper;
-  ON_CALL(disk_info_helper, AmountOfTotalDiskSpace(_))
+  MockQuotaDeviceInfoHelper device_info_helper;
+  ON_CALL(device_info_helper, AmountOfTotalDiskSpace(_))
       .WillByDefault(::testing::Return(2000));
   scoped_feature_list_.InitAndEnableFeatureWithParameters(
       features::kQuotaExpandPoolSize,
@@ -72,7 +73,7 @@
 
   bool callback_executed = false;
   GetNominalDynamicSettings(
-      profile_path(), false, &disk_info_helper,
+      profile_path(), false, &device_info_helper,
       base::BindLambdaForTesting([&](base::Optional<QuotaSettings> settings) {
         callback_executed = true;
         ASSERT_NE(settings, base::nullopt);
@@ -86,14 +87,14 @@
 }
 
 TEST_F(QuotaSettingsTest, UnlimitedTempPool) {
-  MockQuotaDiskInfoHelper disk_info_helper;
-  ON_CALL(disk_info_helper, AmountOfTotalDiskSpace(_))
+  MockQuotaDeviceInfoHelper device_info_helper;
+  ON_CALL(device_info_helper, AmountOfTotalDiskSpace(_))
       .WillByDefault(::testing::Return(2000));
   scoped_feature_list_.InitAndEnableFeature(features::kQuotaUnlimitedPoolSize);
 
   bool callback_executed = false;
   GetNominalDynamicSettings(
-      profile_path(), false, &disk_info_helper,
+      profile_path(), false, &device_info_helper,
       base::BindLambdaForTesting([&](base::Optional<QuotaSettings> settings) {
         callback_executed = true;
         ASSERT_NE(settings, base::nullopt);
@@ -108,30 +109,124 @@
   const int64_t kMBytes = 1024 * 1024;
   const int64_t kMaxIncognitoPoolSize = 330 * kMBytes;  // 300 MB + 10%
 
+  MockQuotaDeviceInfoHelper device_info_helper;
+  ON_CALL(device_info_helper, AmountOfPhysicalMemory())
+      .WillByDefault(::testing::Return(kMaxIncognitoPoolSize));
+
   scoped_feature_list_.InitAndDisableFeature(features::kIncognitoDynamicQuota);
-  EXPECT_GE(kMaxIncognitoPoolSize,
-            GetIncognitoPoolSizeForTesting(kMaxIncognitoPoolSize * 1000));
+  bool callback_executed = false;
+  GetNominalDynamicSettings(
+      profile_path(), true, &device_info_helper,
+      base::BindLambdaForTesting([&](base::Optional<QuotaSettings> settings) {
+        callback_executed = true;
+        EXPECT_GE(kMaxIncognitoPoolSize, settings->pool_size);
+      }));
+  task_environment_.RunUntilIdle();
+  EXPECT_TRUE(callback_executed);
 }
 
-TEST_F(QuotaSettingsTest, IncognitoQuotaDynamic) {
+TEST_F(QuotaSettingsTest, IncognitoDynamicQuota1) {
   const int64_t kMBytes = 1024 * 1024;
   const int64_t kMaxIncognitoPoolSize = 330 * kMBytes;  // 300 MB + 10%
-  const int64_t test_cases[] = {
-      kMaxIncognitoPoolSize / 10, kMaxIncognitoPoolSize,
-      kMaxIncognitoPoolSize * 100, kMaxIncognitoPoolSize * 1000};
+  const int64_t physical_memory_amount = kMaxIncognitoPoolSize / 10;
+
+  MockQuotaDeviceInfoHelper device_info_helper;
+  ON_CALL(device_info_helper, AmountOfPhysicalMemory())
+      .WillByDefault(::testing::Return(physical_memory_amount));
 
   scoped_feature_list_.InitAndEnableFeatureWithParameters(
       features::kIncognitoDynamicQuota,
       {{"IncognitoQuotaRatioLowerBound", "0.1"},
-       {"IncognitoQuotaRatioLowerBound", "0.2"}});
+       {"IncognitoQuotaRatioUpperBound", "0.2"}});
 
-  for (const int64_t physical_memory_amount : test_cases) {
-    EXPECT_LE(physical_memory_amount / 10,
-              GetIncognitoPoolSizeForTesting(physical_memory_amount))
-        << physical_memory_amount;
-    EXPECT_GE(physical_memory_amount / 5,
-              GetIncognitoPoolSizeForTesting(physical_memory_amount))
-        << physical_memory_amount;
-  }
+  bool callback_executed = false;
+  GetNominalDynamicSettings(
+      profile_path(), true, &device_info_helper,
+      base::BindLambdaForTesting([&](base::Optional<QuotaSettings> settings) {
+        callback_executed = true;
+        EXPECT_LE(physical_memory_amount / 10, settings->pool_size);
+        EXPECT_GE(physical_memory_amount / 5, settings->pool_size);
+      }));
+  task_environment_.RunUntilIdle();
+  EXPECT_TRUE(callback_executed);
 }
+
+TEST_F(QuotaSettingsTest, IncognitoDynamicQuota2) {
+  const int64_t kMBytes = 1024 * 1024;
+  const int64_t kMaxIncognitoPoolSize = 330 * kMBytes;  // 300 MB + 10%
+  const int64_t physical_memory_amount = kMaxIncognitoPoolSize;
+
+  MockQuotaDeviceInfoHelper device_info_helper;
+  ON_CALL(device_info_helper, AmountOfPhysicalMemory())
+      .WillByDefault(::testing::Return(physical_memory_amount));
+
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      features::kIncognitoDynamicQuota,
+      {{"IncognitoQuotaRatioLowerBound", "0.1"},
+       {"IncognitoQuotaRatioUpperBound", "0.2"}});
+
+  bool callback_executed = false;
+  GetNominalDynamicSettings(
+      profile_path(), true, &device_info_helper,
+      base::BindLambdaForTesting([&](base::Optional<QuotaSettings> settings) {
+        callback_executed = true;
+        EXPECT_LE(physical_memory_amount / 10, settings->pool_size);
+        EXPECT_GE(physical_memory_amount / 5, settings->pool_size);
+      }));
+  task_environment_.RunUntilIdle();
+  EXPECT_TRUE(callback_executed);
+}
+
+TEST_F(QuotaSettingsTest, IncognitoDynamicQuota3) {
+  const int64_t kMBytes = 1024 * 1024;
+  const int64_t kMaxIncognitoPoolSize = 330 * kMBytes;  // 300 MB + 10%
+  const int64_t physical_memory_amount = kMaxIncognitoPoolSize * 100;
+
+  MockQuotaDeviceInfoHelper device_info_helper;
+  ON_CALL(device_info_helper, AmountOfPhysicalMemory())
+      .WillByDefault(::testing::Return(physical_memory_amount));
+
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      features::kIncognitoDynamicQuota,
+      {{"IncognitoQuotaRatioLowerBound", "0.1"},
+       {"IncognitoQuotaRatioUpperBound", "0.2"}});
+
+  bool callback_executed = false;
+  GetNominalDynamicSettings(
+      profile_path(), true, &device_info_helper,
+      base::BindLambdaForTesting([&](base::Optional<QuotaSettings> settings) {
+        callback_executed = true;
+        EXPECT_LE(physical_memory_amount / 10, settings->pool_size);
+        EXPECT_GE(physical_memory_amount / 5, settings->pool_size);
+      }));
+  task_environment_.RunUntilIdle();
+  EXPECT_TRUE(callback_executed);
+}
+
+TEST_F(QuotaSettingsTest, IncognitoDynamicQuota4) {
+  const int64_t kMBytes = 1024 * 1024;
+  const int64_t kMaxIncognitoPoolSize = 330 * kMBytes;  // 300 MB + 10%
+  const int64_t physical_memory_amount = kMaxIncognitoPoolSize * 1000;
+
+  MockQuotaDeviceInfoHelper device_info_helper;
+  ON_CALL(device_info_helper, AmountOfPhysicalMemory())
+      .WillByDefault(::testing::Return(physical_memory_amount));
+
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      features::kIncognitoDynamicQuota,
+      {{"IncognitoQuotaRatioLowerBound", "0.1"},
+       {"IncognitoQuotaRatioUpperBound", "0.2"}});
+
+  bool callback_executed = false;
+  GetNominalDynamicSettings(
+      profile_path(), true, &device_info_helper,
+      base::BindLambdaForTesting([&](base::Optional<QuotaSettings> settings) {
+        callback_executed = true;
+        EXPECT_LE(physical_memory_amount / 10, settings->pool_size);
+        EXPECT_GE(physical_memory_amount / 5, settings->pool_size);
+      }));
+  task_environment_.RunUntilIdle();
+  EXPECT_TRUE(callback_executed);
+}
+
 }  // namespace storage
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index afdc5d0..39dad1c 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -18750,12 +18750,12 @@
         }
       },
       {
-        "isolate_name": "devtools_closure_compile",
+        "isolate_name": "devtools_lint_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_closure_compile",
+        "name": "devtools_lint_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -18766,12 +18766,12 @@
         }
       },
       {
-        "isolate_name": "devtools_eslint",
+        "isolate_name": "devtools_type_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_eslint",
+        "name": "devtools_type_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 712f4ef..6a9e322 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -3739,12 +3739,12 @@
       },
       {
         "isolate_coverage_data": true,
-        "isolate_name": "devtools_closure_compile",
+        "isolate_name": "devtools_lint_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_closure_compile",
+        "name": "devtools_lint_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -3756,12 +3756,12 @@
       },
       {
         "isolate_coverage_data": true,
-        "isolate_name": "devtools_eslint",
+        "isolate_name": "devtools_type_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_eslint",
+        "name": "devtools_type_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5452,12 +5452,12 @@
         }
       },
       {
-        "isolate_name": "devtools_closure_compile",
+        "isolate_name": "devtools_lint_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_closure_compile",
+        "name": "devtools_lint_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5468,12 +5468,12 @@
         }
       },
       {
-        "isolate_name": "devtools_eslint",
+        "isolate_name": "devtools_type_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_eslint",
+        "name": "devtools_type_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7210,12 +7210,12 @@
         }
       },
       {
-        "isolate_name": "devtools_closure_compile",
+        "isolate_name": "devtools_lint_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_closure_compile",
+        "name": "devtools_lint_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -7226,12 +7226,12 @@
         }
       },
       {
-        "isolate_name": "devtools_eslint",
+        "isolate_name": "devtools_type_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_eslint",
+        "name": "devtools_type_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/client.v8.chromium.json b/testing/buildbot/client.v8.chromium.json
index cf16614..c8d79fda5 100644
--- a/testing/buildbot/client.v8.chromium.json
+++ b/testing/buildbot/client.v8.chromium.json
@@ -458,12 +458,12 @@
         }
       },
       {
-        "isolate_name": "devtools_closure_compile",
+        "isolate_name": "devtools_lint_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_closure_compile",
+        "name": "devtools_lint_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -474,12 +474,12 @@
         }
       },
       {
-        "isolate_name": "devtools_eslint",
+        "isolate_name": "devtools_type_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_eslint",
+        "name": "devtools_type_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1009,12 +1009,12 @@
         }
       },
       {
-        "isolate_name": "devtools_closure_compile",
+        "isolate_name": "devtools_lint_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_closure_compile",
+        "name": "devtools_lint_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1025,12 +1025,12 @@
         }
       },
       {
-        "isolate_name": "devtools_eslint",
+        "isolate_name": "devtools_type_check",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "devtools_eslint",
+        "name": "devtools_type_check",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/filters/bfcache.content_unittests.filter b/testing/buildbot/filters/bfcache.content_unittests.filter
index d61a626..2d8f82a 100644
--- a/testing/buildbot/filters/bfcache.content_unittests.filter
+++ b/testing/buildbot/filters/bfcache.content_unittests.filter
@@ -1,15 +1 @@
 # These tests currently fail when run with --enable-features=BackForwardCache
-
-# https://crbug.com/1019077
-# Expects the process used by the previous document to exit.
--RenderFrameHostManagerTest.DeleteFrameAfterSwapOutACK
-
-# https://crbug.com/1019077
-# Check failed: is_waiting_for_swapout_ack_.
-# The swap out mechanism isn't used with the BackForwardCache.
--RenderFrameHostManagerTest.CommitNewNavigationBeforeSendingSwapOut
--RenderFrameHostManagerTest.SwapOutFrameAfterSwapOutACK
-
-# https://crbug.com/1019077
-# navigation_simulator_impl.cc(581)] Check failed: state_ <= READY_TO_COMMIT
--RenderFrameHostManagerTest.NavigateAfterMissingSwapOutACK
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 9dcffaa..d3dc0195 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1021,19 +1021,19 @@
     "label": "//device:device_unittests",
     "type": "console_test_launcher",
   },
-  "devtools_closure_compile": {
+  "devtools_type_check": {
     "args": [
-      "../../third_party/devtools-frontend/src/scripts/compile_frontend.py",
+      "../../third_party/devtools-frontend/src/scripts/test/run_type_check.py",
     ],
-    "label": "//third_party/devtools-frontend/src:devtools_closure_compile",
+    "label": "//third_party/devtools-frontend/src:devtools_type_check",
     "script": "//testing/scripts/run_devtools_check.py",
     "type": "script",
   },
-  "devtools_eslint": {
+  "devtools_lint_check": {
     "args": [
-      "../../third_party/devtools-frontend/src/scripts/lint_javascript.py",
+      "../../third_party/devtools-frontend/src/scripts/test/run_lint_check.py",
     ],
-    "label": "//third_party/devtools-frontend/src:devtools_eslint",
+    "label": "//third_party/devtools-frontend/src:devtools_lint_check",
     "script": "//testing/scripts/run_devtools_check.py",
     "type": "script",
   },
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index c3d5e4b4..de79137 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -2696,8 +2696,8 @@
 
     'client_v8_chromium_isolated_scripts': {
       'content_shell_crash_test': {},
-      'devtools_closure_compile': {},
-      'devtools_eslint': {},
+      'devtools_type_check': {},
+      'devtools_lint_check': {},
       'telemetry_gpu_unittests': {
         'swarming': {
           'idempotent': False,  # https://crbug.com/549140
@@ -4242,8 +4242,8 @@
     },
 
     'linux_specific_chromium_isolated_scripts': {
-      'devtools_closure_compile': {},
-      'devtools_eslint': {},
+      'devtools_type_check': {},
+      'devtools_lint_check': {},
       'not_site_per_process_webkit_layout_tests': {
         # not_site_per_process_webkit_layout_tests provides coverage for
         # running Layout Tests without site-per-process.  This is the mode used
diff --git a/testing/merge_scripts/code_coverage/merge_lib.py b/testing/merge_scripts/code_coverage/merge_lib.py
index e1ac166..dfea190 100644
--- a/testing/merge_scripts/code_coverage/merge_lib.py
+++ b/testing/merge_scripts/code_coverage/merge_lib.py
@@ -248,7 +248,7 @@
 
   # The list of input files could be empty in the following scenarios:
   # 1. The test target is pure Python scripts test which doesn't execute any
-  #    C/C++ binaries, such as devtools_closure_compile.
+  #    C/C++ binaries, such as devtools_type_check.
   # 2. The test target executes binary and does dumps coverage profile data
   #    files, however, all of them turned out to be invalid.
   if not profile_input_file_paths:
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 6db1757b..a59b79fd 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3659,6 +3659,24 @@
             ]
         }
     ],
+    "NavigationPredictorMultiplePrerenders": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_Limit_5",
+                    "params": {
+                        "prerender_limit": "5"
+                    },
+                    "enable_features": [
+                        "NavigationPredictorMultiplePrerenders"
+                    ]
+                }
+            ]
+        }
+    ],
     "NetworkServiceSandbox": [
         {
             "platforms": [
@@ -5318,24 +5336,6 @@
             ]
         }
     ],
-    "SafeBrowsingRealTimeUrlLookupFetchAllowlist": [
-        {
-            "platforms": [
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "SafeBrowsingRealTimeUrlLookupFetchAllowlist"
-                    ]
-                }
-            ]
-        }
-    ],
     "SafeBrowsingScoutTransitionStudy": [
         {
             "platforms": [
diff --git a/third_party/blink/perf_tests/layout/auto-grid-lots-of-spanning-data.html b/third_party/blink/perf_tests/layout/auto-grid-lots-of-spanning-data.html
new file mode 100644
index 0000000..2d492a2
--- /dev/null
+++ b/third_party/blink/perf_tests/layout/auto-grid-lots-of-spanning-data.html
@@ -0,0 +1,2040 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+html, body {
+    margin: 0;
+    height: 100%;
+}
+
+body {
+    display: grid;
+    grid-template-rows: repeat(100, auto);
+    grid-template-columns: repeat(100, auto);;
+}
+
+.gridItem {
+    height: 200px;
+    width: 200px;
+}
+</style>
+<script src="../resources/runner.js"></script>
+<script>
+function startTest() {
+    PerfTestRunner.forceLayout();
+
+    var index = 0;
+    PerfTestRunner.measureRunsPerSecond({
+        description: "Measures performance of layout on a page using CSS grid layout (spanning items).",
+        run: function() {
+            document.body.style.width = ++index % 2 ? "99%" : "98%";
+            PerfTestRunner.forceLayout();
+        }
+    });
+}
+</script>
+</head>
+<body onload="startTest()">
+<div class='gridItem' style='grid-area: 1 / 1 / span 2 / span 2; background-color: rgb(36, 100, 135)'></div>
+<div class='gridItem' style='grid-area: 1 / 2 / span 2 / span 2; background-color: rgb(41, 156, 157)'></div>
+<div class='gridItem' style='grid-area: 1 / 3 / span 2 / span 2; background-color: rgb(204, 225, 15)'></div>
+<div class='gridItem' style='grid-area: 1 / 4 / span 2 / span 2; background-color: rgb(106, 245, 133)'></div>
+<div class='gridItem' style='grid-area: 1 / 5 / span 2 / span 2; background-color: rgb(159, 213, 189)'></div>
+<div class='gridItem' style='grid-area: 1 / 6 / span 2 / span 2; background-color: rgb(39, 38, 236)'></div>
+<div class='gridItem' style='grid-area: 1 / 7 / span 2 / span 2; background-color: rgb(234, 102, 236)'></div>
+<div class='gridItem' style='grid-area: 1 / 8 / span 2 / span 2; background-color: rgb(239, 166, 146)'></div>
+<div class='gridItem' style='grid-area: 1 / 9 / span 2 / span 2; background-color: rgb(29, 202, 217)'></div>
+<div class='gridItem' style='grid-area: 1 / 10 / span 2 / span 2; background-color: rgb(170, 182, 228)'></div>
+<div class='gridItem' style='grid-area: 1 / 11 / span 2 / span 2; background-color: rgb(154, 120, 173)'></div>
+<div class='gridItem' style='grid-area: 1 / 12 / span 2 / span 2; background-color: rgb(57, 247, 18)'></div>
+<div class='gridItem' style='grid-area: 1 / 13 / span 2 / span 2; background-color: rgb(61, 121, 26)'></div>
+<div class='gridItem' style='grid-area: 1 / 14 / span 2 / span 2; background-color: rgb(226, 240, 208)'></div>
+<div class='gridItem' style='grid-area: 1 / 15 / span 2 / span 2; background-color: rgb(21, 125, 254)'></div>
+<div class='gridItem' style='grid-area: 1 / 16 / span 2 / span 2; background-color: rgb(236, 97, 255)'></div>
+<div class='gridItem' style='grid-area: 1 / 17 / span 2 / span 2; background-color: rgb(228, 209, 187)'></div>
+<div class='gridItem' style='grid-area: 1 / 18 / span 2 / span 2; background-color: rgb(189, 142, 103)'></div>
+<div class='gridItem' style='grid-area: 1 / 19 / span 2 / span 2; background-color: rgb(34, 147, 180)'></div>
+<div class='gridItem' style='grid-area: 1 / 20 / span 2 / span 2; background-color: rgb(206, 11, 249)'></div>
+<div class='gridItem' style='grid-area: 2 / 1 / span 2 / span 2; background-color: rgb(142, 26, 226)'></div>
+<div class='gridItem' style='grid-area: 2 / 2 / span 2 / span 2; background-color: rgb(140, 195, 5)'></div>
+<div class='gridItem' style='grid-area: 2 / 3 / span 2 / span 2; background-color: rgb(122, 86, 33)'></div>
+<div class='gridItem' style='grid-area: 2 / 4 / span 2 / span 2; background-color: rgb(242, 247, 24)'></div>
+<div class='gridItem' style='grid-area: 2 / 5 / span 2 / span 2; background-color: rgb(13, 102, 180)'></div>
+<div class='gridItem' style='grid-area: 2 / 6 / span 2 / span 2; background-color: rgb(5, 234, 62)'></div>
+<div class='gridItem' style='grid-area: 2 / 7 / span 2 / span 2; background-color: rgb(78, 29, 58)'></div>
+<div class='gridItem' style='grid-area: 2 / 8 / span 2 / span 2; background-color: rgb(185, 50, 52)'></div>
+<div class='gridItem' style='grid-area: 2 / 9 / span 2 / span 2; background-color: rgb(217, 213, 222)'></div>
+<div class='gridItem' style='grid-area: 2 / 10 / span 2 / span 2; background-color: rgb(14, 236, 144)'></div>
+<div class='gridItem' style='grid-area: 2 / 11 / span 2 / span 2; background-color: rgb(43, 188, 145)'></div>
+<div class='gridItem' style='grid-area: 2 / 12 / span 2 / span 2; background-color: rgb(220, 17, 198)'></div>
+<div class='gridItem' style='grid-area: 2 / 13 / span 2 / span 2; background-color: rgb(12, 247, 112)'></div>
+<div class='gridItem' style='grid-area: 2 / 14 / span 2 / span 2; background-color: rgb(41, 52, 80)'></div>
+<div class='gridItem' style='grid-area: 2 / 15 / span 2 / span 2; background-color: rgb(225, 235, 184)'></div>
+<div class='gridItem' style='grid-area: 2 / 16 / span 2 / span 2; background-color: rgb(125, 53, 129)'></div>
+<div class='gridItem' style='grid-area: 2 / 17 / span 2 / span 2; background-color: rgb(144, 206, 84)'></div>
+<div class='gridItem' style='grid-area: 2 / 18 / span 2 / span 2; background-color: rgb(18, 147, 251)'></div>
+<div class='gridItem' style='grid-area: 2 / 19 / span 2 / span 2; background-color: rgb(62, 214, 193)'></div>
+<div class='gridItem' style='grid-area: 2 / 20 / span 2 / span 2; background-color: rgb(188, 127, 226)'></div>
+<div class='gridItem' style='grid-area: 3 / 1 / span 2 / span 2; background-color: rgb(28, 15, 98)'></div>
+<div class='gridItem' style='grid-area: 3 / 2 / span 2 / span 2; background-color: rgb(31, 124, 15)'></div>
+<div class='gridItem' style='grid-area: 3 / 3 / span 2 / span 2; background-color: rgb(160, 116, 86)'></div>
+<div class='gridItem' style='grid-area: 3 / 4 / span 2 / span 2; background-color: rgb(22, 14, 76)'></div>
+<div class='gridItem' style='grid-area: 3 / 5 / span 2 / span 2; background-color: rgb(199, 51, 155)'></div>
+<div class='gridItem' style='grid-area: 3 / 6 / span 2 / span 2; background-color: rgb(195, 254, 137)'></div>
+<div class='gridItem' style='grid-area: 3 / 7 / span 2 / span 2; background-color: rgb(109, 253, 46)'></div>
+<div class='gridItem' style='grid-area: 3 / 8 / span 2 / span 2; background-color: rgb(20, 27, 48)'></div>
+<div class='gridItem' style='grid-area: 3 / 9 / span 2 / span 2; background-color: rgb(79, 234, 49)'></div>
+<div class='gridItem' style='grid-area: 3 / 10 / span 2 / span 2; background-color: rgb(230, 193, 12)'></div>
+<div class='gridItem' style='grid-area: 3 / 11 / span 2 / span 2; background-color: rgb(68, 96, 14)'></div>
+<div class='gridItem' style='grid-area: 3 / 12 / span 2 / span 2; background-color: rgb(59, 60, 71)'></div>
+<div class='gridItem' style='grid-area: 3 / 13 / span 2 / span 2; background-color: rgb(180, 204, 137)'></div>
+<div class='gridItem' style='grid-area: 3 / 14 / span 2 / span 2; background-color: rgb(7, 165, 186)'></div>
+<div class='gridItem' style='grid-area: 3 / 15 / span 2 / span 2; background-color: rgb(29, 91, 113)'></div>
+<div class='gridItem' style='grid-area: 3 / 16 / span 2 / span 2; background-color: rgb(59, 66, 16)'></div>
+<div class='gridItem' style='grid-area: 3 / 17 / span 2 / span 2; background-color: rgb(106, 41, 144)'></div>
+<div class='gridItem' style='grid-area: 3 / 18 / span 2 / span 2; background-color: rgb(174, 116, 85)'></div>
+<div class='gridItem' style='grid-area: 3 / 19 / span 2 / span 2; background-color: rgb(132, 94, 166)'></div>
+<div class='gridItem' style='grid-area: 3 / 20 / span 2 / span 2; background-color: rgb(238, 82, 67)'></div>
+<div class='gridItem' style='grid-area: 4 / 1 / span 2 / span 2; background-color: rgb(194, 85, 115)'></div>
+<div class='gridItem' style='grid-area: 4 / 2 / span 2 / span 2; background-color: rgb(10, 219, 54)'></div>
+<div class='gridItem' style='grid-area: 4 / 3 / span 2 / span 2; background-color: rgb(179, 20, 40)'></div>
+<div class='gridItem' style='grid-area: 4 / 4 / span 2 / span 2; background-color: rgb(164, 105, 181)'></div>
+<div class='gridItem' style='grid-area: 4 / 5 / span 2 / span 2; background-color: rgb(30, 82, 234)'></div>
+<div class='gridItem' style='grid-area: 4 / 6 / span 2 / span 2; background-color: rgb(39, 120, 44)'></div>
+<div class='gridItem' style='grid-area: 4 / 7 / span 2 / span 2; background-color: rgb(124, 235, 123)'></div>
+<div class='gridItem' style='grid-area: 4 / 8 / span 2 / span 2; background-color: rgb(131, 27, 68)'></div>
+<div class='gridItem' style='grid-area: 4 / 9 / span 2 / span 2; background-color: rgb(13, 80, 129)'></div>
+<div class='gridItem' style='grid-area: 4 / 10 / span 2 / span 2; background-color: rgb(0, 215, 125)'></div>
+<div class='gridItem' style='grid-area: 4 / 11 / span 2 / span 2; background-color: rgb(215, 247, 53)'></div>
+<div class='gridItem' style='grid-area: 4 / 12 / span 2 / span 2; background-color: rgb(138, 81, 38)'></div>
+<div class='gridItem' style='grid-area: 4 / 13 / span 2 / span 2; background-color: rgb(185, 107, 33)'></div>
+<div class='gridItem' style='grid-area: 4 / 14 / span 2 / span 2; background-color: rgb(246, 29, 34)'></div>
+<div class='gridItem' style='grid-area: 4 / 15 / span 2 / span 2; background-color: rgb(190, 100, 182)'></div>
+<div class='gridItem' style='grid-area: 4 / 16 / span 2 / span 2; background-color: rgb(26, 171, 237)'></div>
+<div class='gridItem' style='grid-area: 4 / 17 / span 2 / span 2; background-color: rgb(249, 143, 96)'></div>
+<div class='gridItem' style='grid-area: 4 / 18 / span 2 / span 2; background-color: rgb(71, 245, 26)'></div>
+<div class='gridItem' style='grid-area: 4 / 19 / span 2 / span 2; background-color: rgb(89, 231, 158)'></div>
+<div class='gridItem' style='grid-area: 4 / 20 / span 2 / span 2; background-color: rgb(233, 114, 20)'></div>
+<div class='gridItem' style='grid-area: 5 / 1 / span 2 / span 2; background-color: rgb(201, 139, 254)'></div>
+<div class='gridItem' style='grid-area: 5 / 2 / span 2 / span 2; background-color: rgb(176, 66, 242)'></div>
+<div class='gridItem' style='grid-area: 5 / 3 / span 2 / span 2; background-color: rgb(82, 19, 194)'></div>
+<div class='gridItem' style='grid-area: 5 / 4 / span 2 / span 2; background-color: rgb(3, 244, 246)'></div>
+<div class='gridItem' style='grid-area: 5 / 5 / span 2 / span 2; background-color: rgb(197, 243, 66)'></div>
+<div class='gridItem' style='grid-area: 5 / 6 / span 2 / span 2; background-color: rgb(146, 136, 91)'></div>
+<div class='gridItem' style='grid-area: 5 / 7 / span 2 / span 2; background-color: rgb(181, 119, 137)'></div>
+<div class='gridItem' style='grid-area: 5 / 8 / span 2 / span 2; background-color: rgb(128, 156, 9)'></div>
+<div class='gridItem' style='grid-area: 5 / 9 / span 2 / span 2; background-color: rgb(100, 148, 110)'></div>
+<div class='gridItem' style='grid-area: 5 / 10 / span 2 / span 2; background-color: rgb(61, 150, 231)'></div>
+<div class='gridItem' style='grid-area: 5 / 11 / span 2 / span 2; background-color: rgb(233, 77, 35)'></div>
+<div class='gridItem' style='grid-area: 5 / 12 / span 2 / span 2; background-color: rgb(94, 103, 229)'></div>
+<div class='gridItem' style='grid-area: 5 / 13 / span 2 / span 2; background-color: rgb(247, 92, 231)'></div>
+<div class='gridItem' style='grid-area: 5 / 14 / span 2 / span 2; background-color: rgb(144, 165, 196)'></div>
+<div class='gridItem' style='grid-area: 5 / 15 / span 2 / span 2; background-color: rgb(104, 195, 130)'></div>
+<div class='gridItem' style='grid-area: 5 / 16 / span 2 / span 2; background-color: rgb(6, 15, 17)'></div>
+<div class='gridItem' style='grid-area: 5 / 17 / span 2 / span 2; background-color: rgb(94, 238, 63)'></div>
+<div class='gridItem' style='grid-area: 5 / 18 / span 2 / span 2; background-color: rgb(150, 23, 68)'></div>
+<div class='gridItem' style='grid-area: 5 / 19 / span 2 / span 2; background-color: rgb(160, 34, 119)'></div>
+<div class='gridItem' style='grid-area: 5 / 20 / span 2 / span 2; background-color: rgb(254, 111, 83)'></div>
+<div class='gridItem' style='grid-area: 6 / 1 / span 2 / span 2; background-color: rgb(189, 231, 192)'></div>
+<div class='gridItem' style='grid-area: 6 / 2 / span 2 / span 2; background-color: rgb(202, 127, 122)'></div>
+<div class='gridItem' style='grid-area: 6 / 3 / span 2 / span 2; background-color: rgb(86, 152, 130)'></div>
+<div class='gridItem' style='grid-area: 6 / 4 / span 2 / span 2; background-color: rgb(128, 111, 255)'></div>
+<div class='gridItem' style='grid-area: 6 / 5 / span 2 / span 2; background-color: rgb(112, 214, 196)'></div>
+<div class='gridItem' style='grid-area: 6 / 6 / span 2 / span 2; background-color: rgb(26, 185, 21)'></div>
+<div class='gridItem' style='grid-area: 6 / 7 / span 2 / span 2; background-color: rgb(138, 121, 184)'></div>
+<div class='gridItem' style='grid-area: 6 / 8 / span 2 / span 2; background-color: rgb(86, 25, 98)'></div>
+<div class='gridItem' style='grid-area: 6 / 9 / span 2 / span 2; background-color: rgb(236, 218, 194)'></div>
+<div class='gridItem' style='grid-area: 6 / 10 / span 2 / span 2; background-color: rgb(226, 69, 125)'></div>
+<div class='gridItem' style='grid-area: 6 / 11 / span 2 / span 2; background-color: rgb(140, 57, 187)'></div>
+<div class='gridItem' style='grid-area: 6 / 12 / span 2 / span 2; background-color: rgb(150, 161, 189)'></div>
+<div class='gridItem' style='grid-area: 6 / 13 / span 2 / span 2; background-color: rgb(140, 25, 168)'></div>
+<div class='gridItem' style='grid-area: 6 / 14 / span 2 / span 2; background-color: rgb(208, 224, 186)'></div>
+<div class='gridItem' style='grid-area: 6 / 15 / span 2 / span 2; background-color: rgb(85, 46, 240)'></div>
+<div class='gridItem' style='grid-area: 6 / 16 / span 2 / span 2; background-color: rgb(105, 215, 87)'></div>
+<div class='gridItem' style='grid-area: 6 / 17 / span 2 / span 2; background-color: rgb(204, 21, 106)'></div>
+<div class='gridItem' style='grid-area: 6 / 18 / span 2 / span 2; background-color: rgb(181, 88, 64)'></div>
+<div class='gridItem' style='grid-area: 6 / 19 / span 2 / span 2; background-color: rgb(252, 135, 115)'></div>
+<div class='gridItem' style='grid-area: 6 / 20 / span 2 / span 2; background-color: rgb(235, 50, 139)'></div>
+<div class='gridItem' style='grid-area: 7 / 1 / span 2 / span 2; background-color: rgb(46, 129, 223)'></div>
+<div class='gridItem' style='grid-area: 7 / 2 / span 2 / span 2; background-color: rgb(96, 33, 177)'></div>
+<div class='gridItem' style='grid-area: 7 / 3 / span 2 / span 2; background-color: rgb(205, 196, 118)'></div>
+<div class='gridItem' style='grid-area: 7 / 4 / span 2 / span 2; background-color: rgb(253, 197, 216)'></div>
+<div class='gridItem' style='grid-area: 7 / 5 / span 2 / span 2; background-color: rgb(244, 123, 146)'></div>
+<div class='gridItem' style='grid-area: 7 / 6 / span 2 / span 2; background-color: rgb(177, 188, 204)'></div>
+<div class='gridItem' style='grid-area: 7 / 7 / span 2 / span 2; background-color: rgb(89, 224, 203)'></div>
+<div class='gridItem' style='grid-area: 7 / 8 / span 2 / span 2; background-color: rgb(187, 211, 108)'></div>
+<div class='gridItem' style='grid-area: 7 / 9 / span 2 / span 2; background-color: rgb(156, 222, 180)'></div>
+<div class='gridItem' style='grid-area: 7 / 10 / span 2 / span 2; background-color: rgb(178, 87, 127)'></div>
+<div class='gridItem' style='grid-area: 7 / 11 / span 2 / span 2; background-color: rgb(172, 83, 30)'></div>
+<div class='gridItem' style='grid-area: 7 / 12 / span 2 / span 2; background-color: rgb(36, 152, 31)'></div>
+<div class='gridItem' style='grid-area: 7 / 13 / span 2 / span 2; background-color: rgb(188, 94, 121)'></div>
+<div class='gridItem' style='grid-area: 7 / 14 / span 2 / span 2; background-color: rgb(42, 14, 162)'></div>
+<div class='gridItem' style='grid-area: 7 / 15 / span 2 / span 2; background-color: rgb(195, 162, 180)'></div>
+<div class='gridItem' style='grid-area: 7 / 16 / span 2 / span 2; background-color: rgb(17, 4, 205)'></div>
+<div class='gridItem' style='grid-area: 7 / 17 / span 2 / span 2; background-color: rgb(241, 160, 89)'></div>
+<div class='gridItem' style='grid-area: 7 / 18 / span 2 / span 2; background-color: rgb(29, 70, 93)'></div>
+<div class='gridItem' style='grid-area: 7 / 19 / span 2 / span 2; background-color: rgb(248, 179, 147)'></div>
+<div class='gridItem' style='grid-area: 7 / 20 / span 2 / span 2; background-color: rgb(195, 141, 116)'></div>
+<div class='gridItem' style='grid-area: 8 / 1 / span 2 / span 2; background-color: rgb(240, 103, 63)'></div>
+<div class='gridItem' style='grid-area: 8 / 2 / span 2 / span 2; background-color: rgb(80, 100, 134)'></div>
+<div class='gridItem' style='grid-area: 8 / 3 / span 2 / span 2; background-color: rgb(76, 192, 127)'></div>
+<div class='gridItem' style='grid-area: 8 / 4 / span 2 / span 2; background-color: rgb(238, 31, 229)'></div>
+<div class='gridItem' style='grid-area: 8 / 5 / span 2 / span 2; background-color: rgb(34, 49, 156)'></div>
+<div class='gridItem' style='grid-area: 8 / 6 / span 2 / span 2; background-color: rgb(6, 31, 100)'></div>
+<div class='gridItem' style='grid-area: 8 / 7 / span 2 / span 2; background-color: rgb(2, 3, 38)'></div>
+<div class='gridItem' style='grid-area: 8 / 8 / span 2 / span 2; background-color: rgb(198, 165, 46)'></div>
+<div class='gridItem' style='grid-area: 8 / 9 / span 2 / span 2; background-color: rgb(191, 147, 159)'></div>
+<div class='gridItem' style='grid-area: 8 / 10 / span 2 / span 2; background-color: rgb(243, 96, 21)'></div>
+<div class='gridItem' style='grid-area: 8 / 11 / span 2 / span 2; background-color: rgb(88, 188, 130)'></div>
+<div class='gridItem' style='grid-area: 8 / 12 / span 2 / span 2; background-color: rgb(23, 37, 121)'></div>
+<div class='gridItem' style='grid-area: 8 / 13 / span 2 / span 2; background-color: rgb(17, 100, 106)'></div>
+<div class='gridItem' style='grid-area: 8 / 14 / span 2 / span 2; background-color: rgb(84, 136, 96)'></div>
+<div class='gridItem' style='grid-area: 8 / 15 / span 2 / span 2; background-color: rgb(170, 7, 128)'></div>
+<div class='gridItem' style='grid-area: 8 / 16 / span 2 / span 2; background-color: rgb(176, 78, 105)'></div>
+<div class='gridItem' style='grid-area: 8 / 17 / span 2 / span 2; background-color: rgb(21, 98, 217)'></div>
+<div class='gridItem' style='grid-area: 8 / 18 / span 2 / span 2; background-color: rgb(79, 112, 114)'></div>
+<div class='gridItem' style='grid-area: 8 / 19 / span 2 / span 2; background-color: rgb(196, 57, 133)'></div>
+<div class='gridItem' style='grid-area: 8 / 20 / span 2 / span 2; background-color: rgb(225, 81, 36)'></div>
+<div class='gridItem' style='grid-area: 9 / 1 / span 2 / span 2; background-color: rgb(251, 125, 248)'></div>
+<div class='gridItem' style='grid-area: 9 / 2 / span 2 / span 2; background-color: rgb(174, 162, 137)'></div>
+<div class='gridItem' style='grid-area: 9 / 3 / span 2 / span 2; background-color: rgb(254, 178, 9)'></div>
+<div class='gridItem' style='grid-area: 9 / 4 / span 2 / span 2; background-color: rgb(105, 11, 18)'></div>
+<div class='gridItem' style='grid-area: 9 / 5 / span 2 / span 2; background-color: rgb(137, 159, 231)'></div>
+<div class='gridItem' style='grid-area: 9 / 6 / span 2 / span 2; background-color: rgb(233, 167, 52)'></div>
+<div class='gridItem' style='grid-area: 9 / 7 / span 2 / span 2; background-color: rgb(133, 16, 144)'></div>
+<div class='gridItem' style='grid-area: 9 / 8 / span 2 / span 2; background-color: rgb(152, 154, 36)'></div>
+<div class='gridItem' style='grid-area: 9 / 9 / span 2 / span 2; background-color: rgb(18, 174, 89)'></div>
+<div class='gridItem' style='grid-area: 9 / 10 / span 2 / span 2; background-color: rgb(83, 40, 80)'></div>
+<div class='gridItem' style='grid-area: 9 / 11 / span 2 / span 2; background-color: rgb(121, 67, 143)'></div>
+<div class='gridItem' style='grid-area: 9 / 12 / span 2 / span 2; background-color: rgb(211, 222, 225)'></div>
+<div class='gridItem' style='grid-area: 9 / 13 / span 2 / span 2; background-color: rgb(49, 244, 4)'></div>
+<div class='gridItem' style='grid-area: 9 / 14 / span 2 / span 2; background-color: rgb(60, 220, 166)'></div>
+<div class='gridItem' style='grid-area: 9 / 15 / span 2 / span 2; background-color: rgb(42, 46, 236)'></div>
+<div class='gridItem' style='grid-area: 9 / 16 / span 2 / span 2; background-color: rgb(251, 160, 195)'></div>
+<div class='gridItem' style='grid-area: 9 / 17 / span 2 / span 2; background-color: rgb(22, 35, 27)'></div>
+<div class='gridItem' style='grid-area: 9 / 18 / span 2 / span 2; background-color: rgb(147, 63, 30)'></div>
+<div class='gridItem' style='grid-area: 9 / 19 / span 2 / span 2; background-color: rgb(134, 238, 42)'></div>
+<div class='gridItem' style='grid-area: 9 / 20 / span 2 / span 2; background-color: rgb(157, 53, 160)'></div>
+<div class='gridItem' style='grid-area: 10 / 1 / span 2 / span 2; background-color: rgb(166, 225, 190)'></div>
+<div class='gridItem' style='grid-area: 10 / 2 / span 2 / span 2; background-color: rgb(43, 251, 27)'></div>
+<div class='gridItem' style='grid-area: 10 / 3 / span 2 / span 2; background-color: rgb(138, 82, 236)'></div>
+<div class='gridItem' style='grid-area: 10 / 4 / span 2 / span 2; background-color: rgb(133, 27, 45)'></div>
+<div class='gridItem' style='grid-area: 10 / 5 / span 2 / span 2; background-color: rgb(152, 52, 169)'></div>
+<div class='gridItem' style='grid-area: 10 / 6 / span 2 / span 2; background-color: rgb(55, 36, 0)'></div>
+<div class='gridItem' style='grid-area: 10 / 7 / span 2 / span 2; background-color: rgb(74, 125, 195)'></div>
+<div class='gridItem' style='grid-area: 10 / 8 / span 2 / span 2; background-color: rgb(203, 84, 103)'></div>
+<div class='gridItem' style='grid-area: 10 / 9 / span 2 / span 2; background-color: rgb(16, 104, 62)'></div>
+<div class='gridItem' style='grid-area: 10 / 10 / span 2 / span 2; background-color: rgb(119, 219, 124)'></div>
+<div class='gridItem' style='grid-area: 10 / 11 / span 2 / span 2; background-color: rgb(124, 251, 141)'></div>
+<div class='gridItem' style='grid-area: 10 / 12 / span 2 / span 2; background-color: rgb(150, 253, 236)'></div>
+<div class='gridItem' style='grid-area: 10 / 13 / span 2 / span 2; background-color: rgb(23, 100, 146)'></div>
+<div class='gridItem' style='grid-area: 10 / 14 / span 2 / span 2; background-color: rgb(116, 14, 224)'></div>
+<div class='gridItem' style='grid-area: 10 / 15 / span 2 / span 2; background-color: rgb(201, 159, 118)'></div>
+<div class='gridItem' style='grid-area: 10 / 16 / span 2 / span 2; background-color: rgb(66, 96, 209)'></div>
+<div class='gridItem' style='grid-area: 10 / 17 / span 2 / span 2; background-color: rgb(153, 219, 172)'></div>
+<div class='gridItem' style='grid-area: 10 / 18 / span 2 / span 2; background-color: rgb(86, 222, 14)'></div>
+<div class='gridItem' style='grid-area: 10 / 19 / span 2 / span 2; background-color: rgb(145, 71, 211)'></div>
+<div class='gridItem' style='grid-area: 10 / 20 / span 2 / span 2; background-color: rgb(250, 91, 111)'></div>
+<div class='gridItem' style='grid-area: 11 / 1 / span 2 / span 2; background-color: rgb(144, 204, 119)'></div>
+<div class='gridItem' style='grid-area: 11 / 2 / span 2 / span 2; background-color: rgb(35, 147, 180)'></div>
+<div class='gridItem' style='grid-area: 11 / 3 / span 2 / span 2; background-color: rgb(53, 83, 191)'></div>
+<div class='gridItem' style='grid-area: 11 / 4 / span 2 / span 2; background-color: rgb(104, 182, 76)'></div>
+<div class='gridItem' style='grid-area: 11 / 5 / span 2 / span 2; background-color: rgb(158, 11, 85)'></div>
+<div class='gridItem' style='grid-area: 11 / 6 / span 2 / span 2; background-color: rgb(67, 101, 53)'></div>
+<div class='gridItem' style='grid-area: 11 / 7 / span 2 / span 2; background-color: rgb(4, 123, 0)'></div>
+<div class='gridItem' style='grid-area: 11 / 8 / span 2 / span 2; background-color: rgb(80, 177, 30)'></div>
+<div class='gridItem' style='grid-area: 11 / 9 / span 2 / span 2; background-color: rgb(45, 111, 243)'></div>
+<div class='gridItem' style='grid-area: 11 / 10 / span 2 / span 2; background-color: rgb(8, 164, 245)'></div>
+<div class='gridItem' style='grid-area: 11 / 11 / span 2 / span 2; background-color: rgb(190, 81, 147)'></div>
+<div class='gridItem' style='grid-area: 11 / 12 / span 2 / span 2; background-color: rgb(121, 9, 185)'></div>
+<div class='gridItem' style='grid-area: 11 / 13 / span 2 / span 2; background-color: rgb(222, 23, 135)'></div>
+<div class='gridItem' style='grid-area: 11 / 14 / span 2 / span 2; background-color: rgb(8, 208, 47)'></div>
+<div class='gridItem' style='grid-area: 11 / 15 / span 2 / span 2; background-color: rgb(177, 111, 139)'></div>
+<div class='gridItem' style='grid-area: 11 / 16 / span 2 / span 2; background-color: rgb(186, 172, 175)'></div>
+<div class='gridItem' style='grid-area: 11 / 17 / span 2 / span 2; background-color: rgb(151, 27, 224)'></div>
+<div class='gridItem' style='grid-area: 11 / 18 / span 2 / span 2; background-color: rgb(198, 115, 182)'></div>
+<div class='gridItem' style='grid-area: 11 / 19 / span 2 / span 2; background-color: rgb(97, 208, 141)'></div>
+<div class='gridItem' style='grid-area: 11 / 20 / span 2 / span 2; background-color: rgb(219, 22, 242)'></div>
+<div class='gridItem' style='grid-area: 12 / 1 / span 2 / span 2; background-color: rgb(48, 126, 34)'></div>
+<div class='gridItem' style='grid-area: 12 / 2 / span 2 / span 2; background-color: rgb(21, 35, 187)'></div>
+<div class='gridItem' style='grid-area: 12 / 3 / span 2 / span 2; background-color: rgb(150, 220, 226)'></div>
+<div class='gridItem' style='grid-area: 12 / 4 / span 2 / span 2; background-color: rgb(64, 107, 119)'></div>
+<div class='gridItem' style='grid-area: 12 / 5 / span 2 / span 2; background-color: rgb(112, 109, 8)'></div>
+<div class='gridItem' style='grid-area: 12 / 6 / span 2 / span 2; background-color: rgb(204, 16, 188)'></div>
+<div class='gridItem' style='grid-area: 12 / 7 / span 2 / span 2; background-color: rgb(206, 119, 225)'></div>
+<div class='gridItem' style='grid-area: 12 / 8 / span 2 / span 2; background-color: rgb(132, 200, 107)'></div>
+<div class='gridItem' style='grid-area: 12 / 9 / span 2 / span 2; background-color: rgb(88, 124, 39)'></div>
+<div class='gridItem' style='grid-area: 12 / 10 / span 2 / span 2; background-color: rgb(190, 221, 212)'></div>
+<div class='gridItem' style='grid-area: 12 / 11 / span 2 / span 2; background-color: rgb(228, 130, 248)'></div>
+<div class='gridItem' style='grid-area: 12 / 12 / span 2 / span 2; background-color: rgb(129, 232, 250)'></div>
+<div class='gridItem' style='grid-area: 12 / 13 / span 2 / span 2; background-color: rgb(156, 142, 10)'></div>
+<div class='gridItem' style='grid-area: 12 / 14 / span 2 / span 2; background-color: rgb(218, 242, 53)'></div>
+<div class='gridItem' style='grid-area: 12 / 15 / span 2 / span 2; background-color: rgb(136, 133, 150)'></div>
+<div class='gridItem' style='grid-area: 12 / 16 / span 2 / span 2; background-color: rgb(27, 102, 130)'></div>
+<div class='gridItem' style='grid-area: 12 / 17 / span 2 / span 2; background-color: rgb(73, 60, 131)'></div>
+<div class='gridItem' style='grid-area: 12 / 18 / span 2 / span 2; background-color: rgb(117, 161, 183)'></div>
+<div class='gridItem' style='grid-area: 12 / 19 / span 2 / span 2; background-color: rgb(183, 150, 89)'></div>
+<div class='gridItem' style='grid-area: 12 / 20 / span 2 / span 2; background-color: rgb(223, 210, 34)'></div>
+<div class='gridItem' style='grid-area: 13 / 1 / span 2 / span 2; background-color: rgb(37, 110, 70)'></div>
+<div class='gridItem' style='grid-area: 13 / 2 / span 2 / span 2; background-color: rgb(158, 184, 122)'></div>
+<div class='gridItem' style='grid-area: 13 / 3 / span 2 / span 2; background-color: rgb(131, 50, 156)'></div>
+<div class='gridItem' style='grid-area: 13 / 4 / span 2 / span 2; background-color: rgb(198, 184, 72)'></div>
+<div class='gridItem' style='grid-area: 13 / 5 / span 2 / span 2; background-color: rgb(163, 59, 1)'></div>
+<div class='gridItem' style='grid-area: 13 / 6 / span 2 / span 2; background-color: rgb(25, 239, 11)'></div>
+<div class='gridItem' style='grid-area: 13 / 7 / span 2 / span 2; background-color: rgb(35, 157, 205)'></div>
+<div class='gridItem' style='grid-area: 13 / 8 / span 2 / span 2; background-color: rgb(130, 236, 218)'></div>
+<div class='gridItem' style='grid-area: 13 / 9 / span 2 / span 2; background-color: rgb(37, 66, 27)'></div>
+<div class='gridItem' style='grid-area: 13 / 10 / span 2 / span 2; background-color: rgb(116, 156, 157)'></div>
+<div class='gridItem' style='grid-area: 13 / 11 / span 2 / span 2; background-color: rgb(105, 21, 202)'></div>
+<div class='gridItem' style='grid-area: 13 / 12 / span 2 / span 2; background-color: rgb(41, 125, 199)'></div>
+<div class='gridItem' style='grid-area: 13 / 13 / span 2 / span 2; background-color: rgb(138, 198, 125)'></div>
+<div class='gridItem' style='grid-area: 13 / 14 / span 2 / span 2; background-color: rgb(245, 153, 248)'></div>
+<div class='gridItem' style='grid-area: 13 / 15 / span 2 / span 2; background-color: rgb(239, 42, 121)'></div>
+<div class='gridItem' style='grid-area: 13 / 16 / span 2 / span 2; background-color: rgb(162, 54, 47)'></div>
+<div class='gridItem' style='grid-area: 13 / 17 / span 2 / span 2; background-color: rgb(230, 54, 235)'></div>
+<div class='gridItem' style='grid-area: 13 / 18 / span 2 / span 2; background-color: rgb(68, 16, 24)'></div>
+<div class='gridItem' style='grid-area: 13 / 19 / span 2 / span 2; background-color: rgb(45, 159, 40)'></div>
+<div class='gridItem' style='grid-area: 13 / 20 / span 2 / span 2; background-color: rgb(33, 97, 110)'></div>
+<div class='gridItem' style='grid-area: 14 / 1 / span 2 / span 2; background-color: rgb(6, 113, 161)'></div>
+<div class='gridItem' style='grid-area: 14 / 2 / span 2 / span 2; background-color: rgb(221, 125, 237)'></div>
+<div class='gridItem' style='grid-area: 14 / 3 / span 2 / span 2; background-color: rgb(119, 153, 90)'></div>
+<div class='gridItem' style='grid-area: 14 / 4 / span 2 / span 2; background-color: rgb(122, 227, 53)'></div>
+<div class='gridItem' style='grid-area: 14 / 5 / span 2 / span 2; background-color: rgb(110, 4, 57)'></div>
+<div class='gridItem' style='grid-area: 14 / 6 / span 2 / span 2; background-color: rgb(149, 160, 85)'></div>
+<div class='gridItem' style='grid-area: 14 / 7 / span 2 / span 2; background-color: rgb(26, 3, 213)'></div>
+<div class='gridItem' style='grid-area: 14 / 8 / span 2 / span 2; background-color: rgb(68, 56, 197)'></div>
+<div class='gridItem' style='grid-area: 14 / 9 / span 2 / span 2; background-color: rgb(226, 80, 7)'></div>
+<div class='gridItem' style='grid-area: 14 / 10 / span 2 / span 2; background-color: rgb(225, 107, 232)'></div>
+<div class='gridItem' style='grid-area: 14 / 11 / span 2 / span 2; background-color: rgb(220, 19, 109)'></div>
+<div class='gridItem' style='grid-area: 14 / 12 / span 2 / span 2; background-color: rgb(77, 165, 75)'></div>
+<div class='gridItem' style='grid-area: 14 / 13 / span 2 / span 2; background-color: rgb(213, 63, 96)'></div>
+<div class='gridItem' style='grid-area: 14 / 14 / span 2 / span 2; background-color: rgb(144, 7, 87)'></div>
+<div class='gridItem' style='grid-area: 14 / 15 / span 2 / span 2; background-color: rgb(22, 190, 21)'></div>
+<div class='gridItem' style='grid-area: 14 / 16 / span 2 / span 2; background-color: rgb(124, 111, 227)'></div>
+<div class='gridItem' style='grid-area: 14 / 17 / span 2 / span 2; background-color: rgb(0, 41, 172)'></div>
+<div class='gridItem' style='grid-area: 14 / 18 / span 2 / span 2; background-color: rgb(25, 25, 164)'></div>
+<div class='gridItem' style='grid-area: 14 / 19 / span 2 / span 2; background-color: rgb(39, 119, 44)'></div>
+<div class='gridItem' style='grid-area: 14 / 20 / span 2 / span 2; background-color: rgb(66, 138, 238)'></div>
+<div class='gridItem' style='grid-area: 15 / 1 / span 2 / span 2; background-color: rgb(59, 215, 249)'></div>
+<div class='gridItem' style='grid-area: 15 / 2 / span 2 / span 2; background-color: rgb(183, 116, 39)'></div>
+<div class='gridItem' style='grid-area: 15 / 3 / span 2 / span 2; background-color: rgb(64, 71, 212)'></div>
+<div class='gridItem' style='grid-area: 15 / 4 / span 2 / span 2; background-color: rgb(154, 198, 45)'></div>
+<div class='gridItem' style='grid-area: 15 / 5 / span 2 / span 2; background-color: rgb(132, 57, 196)'></div>
+<div class='gridItem' style='grid-area: 15 / 6 / span 2 / span 2; background-color: rgb(62, 211, 119)'></div>
+<div class='gridItem' style='grid-area: 15 / 7 / span 2 / span 2; background-color: rgb(246, 246, 170)'></div>
+<div class='gridItem' style='grid-area: 15 / 8 / span 2 / span 2; background-color: rgb(31, 220, 11)'></div>
+<div class='gridItem' style='grid-area: 15 / 9 / span 2 / span 2; background-color: rgb(192, 219, 54)'></div>
+<div class='gridItem' style='grid-area: 15 / 10 / span 2 / span 2; background-color: rgb(83, 247, 136)'></div>
+<div class='gridItem' style='grid-area: 15 / 11 / span 2 / span 2; background-color: rgb(175, 139, 192)'></div>
+<div class='gridItem' style='grid-area: 15 / 12 / span 2 / span 2; background-color: rgb(176, 195, 29)'></div>
+<div class='gridItem' style='grid-area: 15 / 13 / span 2 / span 2; background-color: rgb(44, 101, 107)'></div>
+<div class='gridItem' style='grid-area: 15 / 14 / span 2 / span 2; background-color: rgb(31, 213, 63)'></div>
+<div class='gridItem' style='grid-area: 15 / 15 / span 2 / span 2; background-color: rgb(157, 97, 231)'></div>
+<div class='gridItem' style='grid-area: 15 / 16 / span 2 / span 2; background-color: rgb(227, 14, 12)'></div>
+<div class='gridItem' style='grid-area: 15 / 17 / span 2 / span 2; background-color: rgb(133, 37, 37)'></div>
+<div class='gridItem' style='grid-area: 15 / 18 / span 2 / span 2; background-color: rgb(129, 140, 88)'></div>
+<div class='gridItem' style='grid-area: 15 / 19 / span 2 / span 2; background-color: rgb(50, 151, 18)'></div>
+<div class='gridItem' style='grid-area: 15 / 20 / span 2 / span 2; background-color: rgb(174, 90, 85)'></div>
+<div class='gridItem' style='grid-area: 16 / 1 / span 2 / span 2; background-color: rgb(239, 205, 20)'></div>
+<div class='gridItem' style='grid-area: 16 / 2 / span 2 / span 2; background-color: rgb(15, 218, 101)'></div>
+<div class='gridItem' style='grid-area: 16 / 3 / span 2 / span 2; background-color: rgb(253, 121, 123)'></div>
+<div class='gridItem' style='grid-area: 16 / 4 / span 2 / span 2; background-color: rgb(22, 85, 89)'></div>
+<div class='gridItem' style='grid-area: 16 / 5 / span 2 / span 2; background-color: rgb(189, 232, 192)'></div>
+<div class='gridItem' style='grid-area: 16 / 6 / span 2 / span 2; background-color: rgb(235, 232, 222)'></div>
+<div class='gridItem' style='grid-area: 16 / 7 / span 2 / span 2; background-color: rgb(15, 163, 54)'></div>
+<div class='gridItem' style='grid-area: 16 / 8 / span 2 / span 2; background-color: rgb(106, 104, 76)'></div>
+<div class='gridItem' style='grid-area: 16 / 9 / span 2 / span 2; background-color: rgb(41, 248, 99)'></div>
+<div class='gridItem' style='grid-area: 16 / 10 / span 2 / span 2; background-color: rgb(251, 48, 136)'></div>
+<div class='gridItem' style='grid-area: 16 / 11 / span 2 / span 2; background-color: rgb(205, 63, 60)'></div>
+<div class='gridItem' style='grid-area: 16 / 12 / span 2 / span 2; background-color: rgb(17, 145, 157)'></div>
+<div class='gridItem' style='grid-area: 16 / 13 / span 2 / span 2; background-color: rgb(197, 117, 57)'></div>
+<div class='gridItem' style='grid-area: 16 / 14 / span 2 / span 2; background-color: rgb(137, 60, 232)'></div>
+<div class='gridItem' style='grid-area: 16 / 15 / span 2 / span 2; background-color: rgb(167, 23, 60)'></div>
+<div class='gridItem' style='grid-area: 16 / 16 / span 2 / span 2; background-color: rgb(137, 61, 78)'></div>
+<div class='gridItem' style='grid-area: 16 / 17 / span 2 / span 2; background-color: rgb(59, 0, 74)'></div>
+<div class='gridItem' style='grid-area: 16 / 18 / span 2 / span 2; background-color: rgb(74, 174, 217)'></div>
+<div class='gridItem' style='grid-area: 16 / 19 / span 2 / span 2; background-color: rgb(91, 205, 9)'></div>
+<div class='gridItem' style='grid-area: 16 / 20 / span 2 / span 2; background-color: rgb(120, 65, 48)'></div>
+<div class='gridItem' style='grid-area: 17 / 1 / span 2 / span 2; background-color: rgb(233, 21, 76)'></div>
+<div class='gridItem' style='grid-area: 17 / 2 / span 2 / span 2; background-color: rgb(88, 8, 213)'></div>
+<div class='gridItem' style='grid-area: 17 / 3 / span 2 / span 2; background-color: rgb(95, 192, 94)'></div>
+<div class='gridItem' style='grid-area: 17 / 4 / span 2 / span 2; background-color: rgb(213, 70, 118)'></div>
+<div class='gridItem' style='grid-area: 17 / 5 / span 2 / span 2; background-color: rgb(229, 132, 167)'></div>
+<div class='gridItem' style='grid-area: 17 / 6 / span 2 / span 2; background-color: rgb(134, 45, 58)'></div>
+<div class='gridItem' style='grid-area: 17 / 7 / span 2 / span 2; background-color: rgb(182, 184, 82)'></div>
+<div class='gridItem' style='grid-area: 17 / 8 / span 2 / span 2; background-color: rgb(52, 41, 157)'></div>
+<div class='gridItem' style='grid-area: 17 / 9 / span 2 / span 2; background-color: rgb(14, 7, 246)'></div>
+<div class='gridItem' style='grid-area: 17 / 10 / span 2 / span 2; background-color: rgb(25, 234, 105)'></div>
+<div class='gridItem' style='grid-area: 17 / 11 / span 2 / span 2; background-color: rgb(155, 80, 239)'></div>
+<div class='gridItem' style='grid-area: 17 / 12 / span 2 / span 2; background-color: rgb(220, 206, 126)'></div>
+<div class='gridItem' style='grid-area: 17 / 13 / span 2 / span 2; background-color: rgb(202, 63, 13)'></div>
+<div class='gridItem' style='grid-area: 17 / 14 / span 2 / span 2; background-color: rgb(133, 250, 72)'></div>
+<div class='gridItem' style='grid-area: 17 / 15 / span 2 / span 2; background-color: rgb(26, 207, 104)'></div>
+<div class='gridItem' style='grid-area: 17 / 16 / span 2 / span 2; background-color: rgb(242, 23, 28)'></div>
+<div class='gridItem' style='grid-area: 17 / 17 / span 2 / span 2; background-color: rgb(219, 231, 38)'></div>
+<div class='gridItem' style='grid-area: 17 / 18 / span 2 / span 2; background-color: rgb(81, 198, 243)'></div>
+<div class='gridItem' style='grid-area: 17 / 19 / span 2 / span 2; background-color: rgb(2, 116, 115)'></div>
+<div class='gridItem' style='grid-area: 17 / 20 / span 2 / span 2; background-color: rgb(219, 90, 35)'></div>
+<div class='gridItem' style='grid-area: 18 / 1 / span 2 / span 2; background-color: rgb(58, 91, 104)'></div>
+<div class='gridItem' style='grid-area: 18 / 2 / span 2 / span 2; background-color: rgb(191, 150, 115)'></div>
+<div class='gridItem' style='grid-area: 18 / 3 / span 2 / span 2; background-color: rgb(137, 235, 204)'></div>
+<div class='gridItem' style='grid-area: 18 / 4 / span 2 / span 2; background-color: rgb(128, 160, 238)'></div>
+<div class='gridItem' style='grid-area: 18 / 5 / span 2 / span 2; background-color: rgb(219, 229, 251)'></div>
+<div class='gridItem' style='grid-area: 18 / 6 / span 2 / span 2; background-color: rgb(171, 136, 44)'></div>
+<div class='gridItem' style='grid-area: 18 / 7 / span 2 / span 2; background-color: rgb(233, 86, 121)'></div>
+<div class='gridItem' style='grid-area: 18 / 8 / span 2 / span 2; background-color: rgb(139, 99, 128)'></div>
+<div class='gridItem' style='grid-area: 18 / 9 / span 2 / span 2; background-color: rgb(12, 214, 126)'></div>
+<div class='gridItem' style='grid-area: 18 / 10 / span 2 / span 2; background-color: rgb(118, 27, 21)'></div>
+<div class='gridItem' style='grid-area: 18 / 11 / span 2 / span 2; background-color: rgb(191, 112, 25)'></div>
+<div class='gridItem' style='grid-area: 18 / 12 / span 2 / span 2; background-color: rgb(16, 101, 233)'></div>
+<div class='gridItem' style='grid-area: 18 / 13 / span 2 / span 2; background-color: rgb(166, 127, 165)'></div>
+<div class='gridItem' style='grid-area: 18 / 14 / span 2 / span 2; background-color: rgb(12, 140, 162)'></div>
+<div class='gridItem' style='grid-area: 18 / 15 / span 2 / span 2; background-color: rgb(25, 163, 131)'></div>
+<div class='gridItem' style='grid-area: 18 / 16 / span 2 / span 2; background-color: rgb(169, 70, 208)'></div>
+<div class='gridItem' style='grid-area: 18 / 17 / span 2 / span 2; background-color: rgb(236, 172, 129)'></div>
+<div class='gridItem' style='grid-area: 18 / 18 / span 2 / span 2; background-color: rgb(207, 130, 221)'></div>
+<div class='gridItem' style='grid-area: 18 / 19 / span 2 / span 2; background-color: rgb(27, 148, 87)'></div>
+<div class='gridItem' style='grid-area: 18 / 20 / span 2 / span 2; background-color: rgb(184, 170, 113)'></div>
+<div class='gridItem' style='grid-area: 19 / 1 / span 2 / span 2; background-color: rgb(89, 50, 217)'></div>
+<div class='gridItem' style='grid-area: 19 / 2 / span 2 / span 2; background-color: rgb(17, 112, 89)'></div>
+<div class='gridItem' style='grid-area: 19 / 3 / span 2 / span 2; background-color: rgb(206, 62, 196)'></div>
+<div class='gridItem' style='grid-area: 19 / 4 / span 2 / span 2; background-color: rgb(44, 195, 252)'></div>
+<div class='gridItem' style='grid-area: 19 / 5 / span 2 / span 2; background-color: rgb(152, 18, 133)'></div>
+<div class='gridItem' style='grid-area: 19 / 6 / span 2 / span 2; background-color: rgb(140, 176, 222)'></div>
+<div class='gridItem' style='grid-area: 19 / 7 / span 2 / span 2; background-color: rgb(79, 252, 183)'></div>
+<div class='gridItem' style='grid-area: 19 / 8 / span 2 / span 2; background-color: rgb(226, 117, 120)'></div>
+<div class='gridItem' style='grid-area: 19 / 9 / span 2 / span 2; background-color: rgb(132, 187, 210)'></div>
+<div class='gridItem' style='grid-area: 19 / 10 / span 2 / span 2; background-color: rgb(109, 82, 44)'></div>
+<div class='gridItem' style='grid-area: 19 / 11 / span 2 / span 2; background-color: rgb(40, 150, 78)'></div>
+<div class='gridItem' style='grid-area: 19 / 12 / span 2 / span 2; background-color: rgb(94, 136, 8)'></div>
+<div class='gridItem' style='grid-area: 19 / 13 / span 2 / span 2; background-color: rgb(194, 243, 110)'></div>
+<div class='gridItem' style='grid-area: 19 / 14 / span 2 / span 2; background-color: rgb(134, 98, 125)'></div>
+<div class='gridItem' style='grid-area: 19 / 15 / span 2 / span 2; background-color: rgb(96, 240, 175)'></div>
+<div class='gridItem' style='grid-area: 19 / 16 / span 2 / span 2; background-color: rgb(38, 90, 64)'></div>
+<div class='gridItem' style='grid-area: 19 / 17 / span 2 / span 2; background-color: rgb(91, 218, 145)'></div>
+<div class='gridItem' style='grid-area: 19 / 18 / span 2 / span 2; background-color: rgb(231, 191, 193)'></div>
+<div class='gridItem' style='grid-area: 19 / 19 / span 2 / span 2; background-color: rgb(246, 117, 106)'></div>
+<div class='gridItem' style='grid-area: 19 / 20 / span 2 / span 2; background-color: rgb(187, 19, 114)'></div>
+<div class='gridItem' style='grid-area: 20 / 1 / span 2 / span 2; background-color: rgb(27, 61, 17)'></div>
+<div class='gridItem' style='grid-area: 20 / 2 / span 2 / span 2; background-color: rgb(52, 128, 161)'></div>
+<div class='gridItem' style='grid-area: 20 / 3 / span 2 / span 2; background-color: rgb(243, 50, 187)'></div>
+<div class='gridItem' style='grid-area: 20 / 4 / span 2 / span 2; background-color: rgb(139, 108, 157)'></div>
+<div class='gridItem' style='grid-area: 20 / 5 / span 2 / span 2; background-color: rgb(237, 111, 157)'></div>
+<div class='gridItem' style='grid-area: 20 / 6 / span 2 / span 2; background-color: rgb(41, 220, 130)'></div>
+<div class='gridItem' style='grid-area: 20 / 7 / span 2 / span 2; background-color: rgb(73, 253, 239)'></div>
+<div class='gridItem' style='grid-area: 20 / 8 / span 2 / span 2; background-color: rgb(22, 136, 50)'></div>
+<div class='gridItem' style='grid-area: 20 / 9 / span 2 / span 2; background-color: rgb(215, 136, 15)'></div>
+<div class='gridItem' style='grid-area: 20 / 10 / span 2 / span 2; background-color: rgb(1, 161, 103)'></div>
+<div class='gridItem' style='grid-area: 20 / 11 / span 2 / span 2; background-color: rgb(138, 57, 139)'></div>
+<div class='gridItem' style='grid-area: 20 / 12 / span 2 / span 2; background-color: rgb(56, 58, 160)'></div>
+<div class='gridItem' style='grid-area: 20 / 13 / span 2 / span 2; background-color: rgb(132, 68, 175)'></div>
+<div class='gridItem' style='grid-area: 20 / 14 / span 2 / span 2; background-color: rgb(125, 57, 109)'></div>
+<div class='gridItem' style='grid-area: 20 / 15 / span 2 / span 2; background-color: rgb(197, 106, 91)'></div>
+<div class='gridItem' style='grid-area: 20 / 16 / span 2 / span 2; background-color: rgb(162, 215, 238)'></div>
+<div class='gridItem' style='grid-area: 20 / 17 / span 2 / span 2; background-color: rgb(70, 146, 115)'></div>
+<div class='gridItem' style='grid-area: 20 / 18 / span 2 / span 2; background-color: rgb(2, 149, 242)'></div>
+<div class='gridItem' style='grid-area: 20 / 19 / span 2 / span 2; background-color: rgb(219, 80, 6)'></div>
+<div class='gridItem' style='grid-area: 20 / 20 / span 2 / span 2; background-color: rgb(65, 57, 37)'></div>
+<div class='gridItem' style='grid-area: 21 / 1 / span 2 / span 2; background-color: rgb(89, 218, 223)'></div>
+<div class='gridItem' style='grid-area: 21 / 2 / span 2 / span 2; background-color: rgb(42, 37, 205)'></div>
+<div class='gridItem' style='grid-area: 21 / 3 / span 2 / span 2; background-color: rgb(82, 186, 133)'></div>
+<div class='gridItem' style='grid-area: 21 / 4 / span 2 / span 2; background-color: rgb(165, 86, 40)'></div>
+<div class='gridItem' style='grid-area: 21 / 5 / span 2 / span 2; background-color: rgb(174, 126, 88)'></div>
+<div class='gridItem' style='grid-area: 21 / 6 / span 2 / span 2; background-color: rgb(203, 238, 145)'></div>
+<div class='gridItem' style='grid-area: 21 / 7 / span 2 / span 2; background-color: rgb(47, 213, 233)'></div>
+<div class='gridItem' style='grid-area: 21 / 8 / span 2 / span 2; background-color: rgb(9, 117, 173)'></div>
+<div class='gridItem' style='grid-area: 21 / 9 / span 2 / span 2; background-color: rgb(86, 84, 18)'></div>
+<div class='gridItem' style='grid-area: 21 / 10 / span 2 / span 2; background-color: rgb(78, 34, 85)'></div>
+<div class='gridItem' style='grid-area: 21 / 11 / span 2 / span 2; background-color: rgb(250, 119, 194)'></div>
+<div class='gridItem' style='grid-area: 21 / 12 / span 2 / span 2; background-color: rgb(215, 170, 23)'></div>
+<div class='gridItem' style='grid-area: 21 / 13 / span 2 / span 2; background-color: rgb(141, 247, 13)'></div>
+<div class='gridItem' style='grid-area: 21 / 14 / span 2 / span 2; background-color: rgb(1, 220, 45)'></div>
+<div class='gridItem' style='grid-area: 21 / 15 / span 2 / span 2; background-color: rgb(189, 49, 5)'></div>
+<div class='gridItem' style='grid-area: 21 / 16 / span 2 / span 2; background-color: rgb(164, 252, 147)'></div>
+<div class='gridItem' style='grid-area: 21 / 17 / span 2 / span 2; background-color: rgb(10, 88, 80)'></div>
+<div class='gridItem' style='grid-area: 21 / 18 / span 2 / span 2; background-color: rgb(149, 210, 131)'></div>
+<div class='gridItem' style='grid-area: 21 / 19 / span 2 / span 2; background-color: rgb(215, 109, 238)'></div>
+<div class='gridItem' style='grid-area: 21 / 20 / span 2 / span 2; background-color: rgb(146, 166, 63)'></div>
+<div class='gridItem' style='grid-area: 22 / 1 / span 2 / span 2; background-color: rgb(23, 21, 111)'></div>
+<div class='gridItem' style='grid-area: 22 / 2 / span 2 / span 2; background-color: rgb(90, 100, 123)'></div>
+<div class='gridItem' style='grid-area: 22 / 3 / span 2 / span 2; background-color: rgb(161, 7, 120)'></div>
+<div class='gridItem' style='grid-area: 22 / 4 / span 2 / span 2; background-color: rgb(25, 144, 0)'></div>
+<div class='gridItem' style='grid-area: 22 / 5 / span 2 / span 2; background-color: rgb(232, 184, 247)'></div>
+<div class='gridItem' style='grid-area: 22 / 6 / span 2 / span 2; background-color: rgb(98, 156, 47)'></div>
+<div class='gridItem' style='grid-area: 22 / 7 / span 2 / span 2; background-color: rgb(131, 123, 1)'></div>
+<div class='gridItem' style='grid-area: 22 / 8 / span 2 / span 2; background-color: rgb(62, 166, 200)'></div>
+<div class='gridItem' style='grid-area: 22 / 9 / span 2 / span 2; background-color: rgb(94, 49, 248)'></div>
+<div class='gridItem' style='grid-area: 22 / 10 / span 2 / span 2; background-color: rgb(187, 84, 35)'></div>
+<div class='gridItem' style='grid-area: 22 / 11 / span 2 / span 2; background-color: rgb(193, 224, 254)'></div>
+<div class='gridItem' style='grid-area: 22 / 12 / span 2 / span 2; background-color: rgb(6, 145, 158)'></div>
+<div class='gridItem' style='grid-area: 22 / 13 / span 2 / span 2; background-color: rgb(57, 236, 223)'></div>
+<div class='gridItem' style='grid-area: 22 / 14 / span 2 / span 2; background-color: rgb(62, 125, 101)'></div>
+<div class='gridItem' style='grid-area: 22 / 15 / span 2 / span 2; background-color: rgb(66, 7, 128)'></div>
+<div class='gridItem' style='grid-area: 22 / 16 / span 2 / span 2; background-color: rgb(172, 65, 227)'></div>
+<div class='gridItem' style='grid-area: 22 / 17 / span 2 / span 2; background-color: rgb(52, 38, 226)'></div>
+<div class='gridItem' style='grid-area: 22 / 18 / span 2 / span 2; background-color: rgb(9, 80, 223)'></div>
+<div class='gridItem' style='grid-area: 22 / 19 / span 2 / span 2; background-color: rgb(34, 87, 239)'></div>
+<div class='gridItem' style='grid-area: 22 / 20 / span 2 / span 2; background-color: rgb(209, 175, 154)'></div>
+<div class='gridItem' style='grid-area: 23 / 1 / span 2 / span 2; background-color: rgb(95, 87, 28)'></div>
+<div class='gridItem' style='grid-area: 23 / 2 / span 2 / span 2; background-color: rgb(3, 222, 23)'></div>
+<div class='gridItem' style='grid-area: 23 / 3 / span 2 / span 2; background-color: rgb(227, 108, 40)'></div>
+<div class='gridItem' style='grid-area: 23 / 4 / span 2 / span 2; background-color: rgb(16, 96, 197)'></div>
+<div class='gridItem' style='grid-area: 23 / 5 / span 2 / span 2; background-color: rgb(158, 189, 126)'></div>
+<div class='gridItem' style='grid-area: 23 / 6 / span 2 / span 2; background-color: rgb(36, 97, 108)'></div>
+<div class='gridItem' style='grid-area: 23 / 7 / span 2 / span 2; background-color: rgb(112, 144, 129)'></div>
+<div class='gridItem' style='grid-area: 23 / 8 / span 2 / span 2; background-color: rgb(49, 47, 177)'></div>
+<div class='gridItem' style='grid-area: 23 / 9 / span 2 / span 2; background-color: rgb(225, 182, 57)'></div>
+<div class='gridItem' style='grid-area: 23 / 10 / span 2 / span 2; background-color: rgb(228, 154, 166)'></div>
+<div class='gridItem' style='grid-area: 23 / 11 / span 2 / span 2; background-color: rgb(253, 155, 163)'></div>
+<div class='gridItem' style='grid-area: 23 / 12 / span 2 / span 2; background-color: rgb(189, 249, 253)'></div>
+<div class='gridItem' style='grid-area: 23 / 13 / span 2 / span 2; background-color: rgb(158, 74, 194)'></div>
+<div class='gridItem' style='grid-area: 23 / 14 / span 2 / span 2; background-color: rgb(253, 176, 173)'></div>
+<div class='gridItem' style='grid-area: 23 / 15 / span 2 / span 2; background-color: rgb(44, 232, 41)'></div>
+<div class='gridItem' style='grid-area: 23 / 16 / span 2 / span 2; background-color: rgb(235, 108, 177)'></div>
+<div class='gridItem' style='grid-area: 23 / 17 / span 2 / span 2; background-color: rgb(99, 212, 203)'></div>
+<div class='gridItem' style='grid-area: 23 / 18 / span 2 / span 2; background-color: rgb(156, 238, 159)'></div>
+<div class='gridItem' style='grid-area: 23 / 19 / span 2 / span 2; background-color: rgb(143, 139, 76)'></div>
+<div class='gridItem' style='grid-area: 23 / 20 / span 2 / span 2; background-color: rgb(203, 38, 16)'></div>
+<div class='gridItem' style='grid-area: 24 / 1 / span 2 / span 2; background-color: rgb(33, 123, 74)'></div>
+<div class='gridItem' style='grid-area: 24 / 2 / span 2 / span 2; background-color: rgb(90, 195, 5)'></div>
+<div class='gridItem' style='grid-area: 24 / 3 / span 2 / span 2; background-color: rgb(134, 243, 91)'></div>
+<div class='gridItem' style='grid-area: 24 / 4 / span 2 / span 2; background-color: rgb(213, 137, 30)'></div>
+<div class='gridItem' style='grid-area: 24 / 5 / span 2 / span 2; background-color: rgb(229, 122, 90)'></div>
+<div class='gridItem' style='grid-area: 24 / 6 / span 2 / span 2; background-color: rgb(37, 146, 112)'></div>
+<div class='gridItem' style='grid-area: 24 / 7 / span 2 / span 2; background-color: rgb(116, 228, 23)'></div>
+<div class='gridItem' style='grid-area: 24 / 8 / span 2 / span 2; background-color: rgb(161, 205, 147)'></div>
+<div class='gridItem' style='grid-area: 24 / 9 / span 2 / span 2; background-color: rgb(13, 122, 153)'></div>
+<div class='gridItem' style='grid-area: 24 / 10 / span 2 / span 2; background-color: rgb(81, 21, 84)'></div>
+<div class='gridItem' style='grid-area: 24 / 11 / span 2 / span 2; background-color: rgb(219, 10, 173)'></div>
+<div class='gridItem' style='grid-area: 24 / 12 / span 2 / span 2; background-color: rgb(15, 94, 54)'></div>
+<div class='gridItem' style='grid-area: 24 / 13 / span 2 / span 2; background-color: rgb(23, 185, 211)'></div>
+<div class='gridItem' style='grid-area: 24 / 14 / span 2 / span 2; background-color: rgb(190, 202, 168)'></div>
+<div class='gridItem' style='grid-area: 24 / 15 / span 2 / span 2; background-color: rgb(210, 56, 27)'></div>
+<div class='gridItem' style='grid-area: 24 / 16 / span 2 / span 2; background-color: rgb(120, 227, 129)'></div>
+<div class='gridItem' style='grid-area: 24 / 17 / span 2 / span 2; background-color: rgb(198, 208, 114)'></div>
+<div class='gridItem' style='grid-area: 24 / 18 / span 2 / span 2; background-color: rgb(153, 172, 113)'></div>
+<div class='gridItem' style='grid-area: 24 / 19 / span 2 / span 2; background-color: rgb(209, 151, 46)'></div>
+<div class='gridItem' style='grid-area: 24 / 20 / span 2 / span 2; background-color: rgb(36, 3, 107)'></div>
+<div class='gridItem' style='grid-area: 25 / 1 / span 2 / span 2; background-color: rgb(155, 70, 124)'></div>
+<div class='gridItem' style='grid-area: 25 / 2 / span 2 / span 2; background-color: rgb(160, 194, 239)'></div>
+<div class='gridItem' style='grid-area: 25 / 3 / span 2 / span 2; background-color: rgb(215, 51, 22)'></div>
+<div class='gridItem' style='grid-area: 25 / 4 / span 2 / span 2; background-color: rgb(169, 215, 206)'></div>
+<div class='gridItem' style='grid-area: 25 / 5 / span 2 / span 2; background-color: rgb(132, 145, 197)'></div>
+<div class='gridItem' style='grid-area: 25 / 6 / span 2 / span 2; background-color: rgb(227, 219, 8)'></div>
+<div class='gridItem' style='grid-area: 25 / 7 / span 2 / span 2; background-color: rgb(56, 92, 236)'></div>
+<div class='gridItem' style='grid-area: 25 / 8 / span 2 / span 2; background-color: rgb(199, 158, 71)'></div>
+<div class='gridItem' style='grid-area: 25 / 9 / span 2 / span 2; background-color: rgb(198, 56, 233)'></div>
+<div class='gridItem' style='grid-area: 25 / 10 / span 2 / span 2; background-color: rgb(218, 37, 33)'></div>
+<div class='gridItem' style='grid-area: 25 / 11 / span 2 / span 2; background-color: rgb(165, 32, 76)'></div>
+<div class='gridItem' style='grid-area: 25 / 12 / span 2 / span 2; background-color: rgb(65, 20, 17)'></div>
+<div class='gridItem' style='grid-area: 25 / 13 / span 2 / span 2; background-color: rgb(126, 22, 25)'></div>
+<div class='gridItem' style='grid-area: 25 / 14 / span 2 / span 2; background-color: rgb(250, 39, 157)'></div>
+<div class='gridItem' style='grid-area: 25 / 15 / span 2 / span 2; background-color: rgb(94, 46, 28)'></div>
+<div class='gridItem' style='grid-area: 25 / 16 / span 2 / span 2; background-color: rgb(111, 58, 193)'></div>
+<div class='gridItem' style='grid-area: 25 / 17 / span 2 / span 2; background-color: rgb(206, 97, 152)'></div>
+<div class='gridItem' style='grid-area: 25 / 18 / span 2 / span 2; background-color: rgb(71, 51, 207)'></div>
+<div class='gridItem' style='grid-area: 25 / 19 / span 2 / span 2; background-color: rgb(237, 13, 80)'></div>
+<div class='gridItem' style='grid-area: 25 / 20 / span 2 / span 2; background-color: rgb(23, 188, 254)'></div>
+<div class='gridItem' style='grid-area: 26 / 1 / span 2 / span 2; background-color: rgb(205, 49, 30)'></div>
+<div class='gridItem' style='grid-area: 26 / 2 / span 2 / span 2; background-color: rgb(131, 42, 3)'></div>
+<div class='gridItem' style='grid-area: 26 / 3 / span 2 / span 2; background-color: rgb(90, 94, 184)'></div>
+<div class='gridItem' style='grid-area: 26 / 4 / span 2 / span 2; background-color: rgb(253, 125, 105)'></div>
+<div class='gridItem' style='grid-area: 26 / 5 / span 2 / span 2; background-color: rgb(48, 80, 56)'></div>
+<div class='gridItem' style='grid-area: 26 / 6 / span 2 / span 2; background-color: rgb(214, 44, 214)'></div>
+<div class='gridItem' style='grid-area: 26 / 7 / span 2 / span 2; background-color: rgb(87, 210, 7)'></div>
+<div class='gridItem' style='grid-area: 26 / 8 / span 2 / span 2; background-color: rgb(246, 134, 110)'></div>
+<div class='gridItem' style='grid-area: 26 / 9 / span 2 / span 2; background-color: rgb(28, 235, 156)'></div>
+<div class='gridItem' style='grid-area: 26 / 10 / span 2 / span 2; background-color: rgb(196, 196, 122)'></div>
+<div class='gridItem' style='grid-area: 26 / 11 / span 2 / span 2; background-color: rgb(219, 237, 78)'></div>
+<div class='gridItem' style='grid-area: 26 / 12 / span 2 / span 2; background-color: rgb(6, 46, 74)'></div>
+<div class='gridItem' style='grid-area: 26 / 13 / span 2 / span 2; background-color: rgb(152, 65, 91)'></div>
+<div class='gridItem' style='grid-area: 26 / 14 / span 2 / span 2; background-color: rgb(67, 172, 165)'></div>
+<div class='gridItem' style='grid-area: 26 / 15 / span 2 / span 2; background-color: rgb(101, 92, 18)'></div>
+<div class='gridItem' style='grid-area: 26 / 16 / span 2 / span 2; background-color: rgb(167, 128, 83)'></div>
+<div class='gridItem' style='grid-area: 26 / 17 / span 2 / span 2; background-color: rgb(18, 100, 201)'></div>
+<div class='gridItem' style='grid-area: 26 / 18 / span 2 / span 2; background-color: rgb(55, 94, 198)'></div>
+<div class='gridItem' style='grid-area: 26 / 19 / span 2 / span 2; background-color: rgb(23, 141, 34)'></div>
+<div class='gridItem' style='grid-area: 26 / 20 / span 2 / span 2; background-color: rgb(93, 91, 54)'></div>
+<div class='gridItem' style='grid-area: 27 / 1 / span 2 / span 2; background-color: rgb(32, 101, 179)'></div>
+<div class='gridItem' style='grid-area: 27 / 2 / span 2 / span 2; background-color: rgb(143, 215, 70)'></div>
+<div class='gridItem' style='grid-area: 27 / 3 / span 2 / span 2; background-color: rgb(164, 20, 146)'></div>
+<div class='gridItem' style='grid-area: 27 / 4 / span 2 / span 2; background-color: rgb(54, 170, 112)'></div>
+<div class='gridItem' style='grid-area: 27 / 5 / span 2 / span 2; background-color: rgb(240, 231, 151)'></div>
+<div class='gridItem' style='grid-area: 27 / 6 / span 2 / span 2; background-color: rgb(65, 146, 47)'></div>
+<div class='gridItem' style='grid-area: 27 / 7 / span 2 / span 2; background-color: rgb(56, 233, 21)'></div>
+<div class='gridItem' style='grid-area: 27 / 8 / span 2 / span 2; background-color: rgb(88, 15, 249)'></div>
+<div class='gridItem' style='grid-area: 27 / 9 / span 2 / span 2; background-color: rgb(65, 178, 170)'></div>
+<div class='gridItem' style='grid-area: 27 / 10 / span 2 / span 2; background-color: rgb(95, 29, 2)'></div>
+<div class='gridItem' style='grid-area: 27 / 11 / span 2 / span 2; background-color: rgb(207, 151, 203)'></div>
+<div class='gridItem' style='grid-area: 27 / 12 / span 2 / span 2; background-color: rgb(176, 23, 207)'></div>
+<div class='gridItem' style='grid-area: 27 / 13 / span 2 / span 2; background-color: rgb(96, 197, 234)'></div>
+<div class='gridItem' style='grid-area: 27 / 14 / span 2 / span 2; background-color: rgb(99, 23, 77)'></div>
+<div class='gridItem' style='grid-area: 27 / 15 / span 2 / span 2; background-color: rgb(231, 234, 107)'></div>
+<div class='gridItem' style='grid-area: 27 / 16 / span 2 / span 2; background-color: rgb(121, 228, 37)'></div>
+<div class='gridItem' style='grid-area: 27 / 17 / span 2 / span 2; background-color: rgb(223, 206, 209)'></div>
+<div class='gridItem' style='grid-area: 27 / 18 / span 2 / span 2; background-color: rgb(23, 89, 133)'></div>
+<div class='gridItem' style='grid-area: 27 / 19 / span 2 / span 2; background-color: rgb(174, 195, 125)'></div>
+<div class='gridItem' style='grid-area: 27 / 20 / span 2 / span 2; background-color: rgb(164, 120, 70)'></div>
+<div class='gridItem' style='grid-area: 28 / 1 / span 2 / span 2; background-color: rgb(24, 241, 163)'></div>
+<div class='gridItem' style='grid-area: 28 / 2 / span 2 / span 2; background-color: rgb(188, 14, 14)'></div>
+<div class='gridItem' style='grid-area: 28 / 3 / span 2 / span 2; background-color: rgb(37, 13, 196)'></div>
+<div class='gridItem' style='grid-area: 28 / 4 / span 2 / span 2; background-color: rgb(19, 4, 41)'></div>
+<div class='gridItem' style='grid-area: 28 / 5 / span 2 / span 2; background-color: rgb(68, 83, 114)'></div>
+<div class='gridItem' style='grid-area: 28 / 6 / span 2 / span 2; background-color: rgb(161, 172, 81)'></div>
+<div class='gridItem' style='grid-area: 28 / 7 / span 2 / span 2; background-color: rgb(238, 31, 124)'></div>
+<div class='gridItem' style='grid-area: 28 / 8 / span 2 / span 2; background-color: rgb(139, 3, 39)'></div>
+<div class='gridItem' style='grid-area: 28 / 9 / span 2 / span 2; background-color: rgb(223, 187, 114)'></div>
+<div class='gridItem' style='grid-area: 28 / 10 / span 2 / span 2; background-color: rgb(237, 138, 56)'></div>
+<div class='gridItem' style='grid-area: 28 / 11 / span 2 / span 2; background-color: rgb(219, 250, 66)'></div>
+<div class='gridItem' style='grid-area: 28 / 12 / span 2 / span 2; background-color: rgb(50, 148, 14)'></div>
+<div class='gridItem' style='grid-area: 28 / 13 / span 2 / span 2; background-color: rgb(22, 5, 112)'></div>
+<div class='gridItem' style='grid-area: 28 / 14 / span 2 / span 2; background-color: rgb(244, 168, 122)'></div>
+<div class='gridItem' style='grid-area: 28 / 15 / span 2 / span 2; background-color: rgb(78, 207, 104)'></div>
+<div class='gridItem' style='grid-area: 28 / 16 / span 2 / span 2; background-color: rgb(208, 50, 16)'></div>
+<div class='gridItem' style='grid-area: 28 / 17 / span 2 / span 2; background-color: rgb(104, 110, 96)'></div>
+<div class='gridItem' style='grid-area: 28 / 18 / span 2 / span 2; background-color: rgb(104, 240, 147)'></div>
+<div class='gridItem' style='grid-area: 28 / 19 / span 2 / span 2; background-color: rgb(155, 151, 168)'></div>
+<div class='gridItem' style='grid-area: 28 / 20 / span 2 / span 2; background-color: rgb(78, 119, 143)'></div>
+<div class='gridItem' style='grid-area: 29 / 1 / span 2 / span 2; background-color: rgb(71, 239, 143)'></div>
+<div class='gridItem' style='grid-area: 29 / 2 / span 2 / span 2; background-color: rgb(164, 187, 158)'></div>
+<div class='gridItem' style='grid-area: 29 / 3 / span 2 / span 2; background-color: rgb(250, 145, 157)'></div>
+<div class='gridItem' style='grid-area: 29 / 4 / span 2 / span 2; background-color: rgb(214, 172, 72)'></div>
+<div class='gridItem' style='grid-area: 29 / 5 / span 2 / span 2; background-color: rgb(210, 17, 16)'></div>
+<div class='gridItem' style='grid-area: 29 / 6 / span 2 / span 2; background-color: rgb(149, 53, 200)'></div>
+<div class='gridItem' style='grid-area: 29 / 7 / span 2 / span 2; background-color: rgb(174, 119, 143)'></div>
+<div class='gridItem' style='grid-area: 29 / 8 / span 2 / span 2; background-color: rgb(22, 243, 58)'></div>
+<div class='gridItem' style='grid-area: 29 / 9 / span 2 / span 2; background-color: rgb(11, 243, 75)'></div>
+<div class='gridItem' style='grid-area: 29 / 10 / span 2 / span 2; background-color: rgb(65, 165, 44)'></div>
+<div class='gridItem' style='grid-area: 29 / 11 / span 2 / span 2; background-color: rgb(99, 22, 22)'></div>
+<div class='gridItem' style='grid-area: 29 / 12 / span 2 / span 2; background-color: rgb(20, 35, 133)'></div>
+<div class='gridItem' style='grid-area: 29 / 13 / span 2 / span 2; background-color: rgb(205, 17, 83)'></div>
+<div class='gridItem' style='grid-area: 29 / 14 / span 2 / span 2; background-color: rgb(145, 59, 192)'></div>
+<div class='gridItem' style='grid-area: 29 / 15 / span 2 / span 2; background-color: rgb(56, 40, 13)'></div>
+<div class='gridItem' style='grid-area: 29 / 16 / span 2 / span 2; background-color: rgb(53, 57, 177)'></div>
+<div class='gridItem' style='grid-area: 29 / 17 / span 2 / span 2; background-color: rgb(14, 73, 177)'></div>
+<div class='gridItem' style='grid-area: 29 / 18 / span 2 / span 2; background-color: rgb(145, 76, 36)'></div>
+<div class='gridItem' style='grid-area: 29 / 19 / span 2 / span 2; background-color: rgb(136, 14, 198)'></div>
+<div class='gridItem' style='grid-area: 29 / 20 / span 2 / span 2; background-color: rgb(254, 79, 202)'></div>
+<div class='gridItem' style='grid-area: 30 / 1 / span 2 / span 2; background-color: rgb(223, 94, 134)'></div>
+<div class='gridItem' style='grid-area: 30 / 2 / span 2 / span 2; background-color: rgb(106, 182, 172)'></div>
+<div class='gridItem' style='grid-area: 30 / 3 / span 2 / span 2; background-color: rgb(85, 121, 55)'></div>
+<div class='gridItem' style='grid-area: 30 / 4 / span 2 / span 2; background-color: rgb(199, 150, 177)'></div>
+<div class='gridItem' style='grid-area: 30 / 5 / span 2 / span 2; background-color: rgb(116, 134, 24)'></div>
+<div class='gridItem' style='grid-area: 30 / 6 / span 2 / span 2; background-color: rgb(91, 7, 75)'></div>
+<div class='gridItem' style='grid-area: 30 / 7 / span 2 / span 2; background-color: rgb(51, 217, 135)'></div>
+<div class='gridItem' style='grid-area: 30 / 8 / span 2 / span 2; background-color: rgb(161, 160, 184)'></div>
+<div class='gridItem' style='grid-area: 30 / 9 / span 2 / span 2; background-color: rgb(130, 159, 7)'></div>
+<div class='gridItem' style='grid-area: 30 / 10 / span 2 / span 2; background-color: rgb(21, 26, 168)'></div>
+<div class='gridItem' style='grid-area: 30 / 11 / span 2 / span 2; background-color: rgb(153, 207, 69)'></div>
+<div class='gridItem' style='grid-area: 30 / 12 / span 2 / span 2; background-color: rgb(215, 33, 69)'></div>
+<div class='gridItem' style='grid-area: 30 / 13 / span 2 / span 2; background-color: rgb(137, 237, 33)'></div>
+<div class='gridItem' style='grid-area: 30 / 14 / span 2 / span 2; background-color: rgb(183, 125, 138)'></div>
+<div class='gridItem' style='grid-area: 30 / 15 / span 2 / span 2; background-color: rgb(254, 131, 166)'></div>
+<div class='gridItem' style='grid-area: 30 / 16 / span 2 / span 2; background-color: rgb(17, 74, 151)'></div>
+<div class='gridItem' style='grid-area: 30 / 17 / span 2 / span 2; background-color: rgb(134, 15, 125)'></div>
+<div class='gridItem' style='grid-area: 30 / 18 / span 2 / span 2; background-color: rgb(231, 214, 142)'></div>
+<div class='gridItem' style='grid-area: 30 / 19 / span 2 / span 2; background-color: rgb(39, 221, 131)'></div>
+<div class='gridItem' style='grid-area: 30 / 20 / span 2 / span 2; background-color: rgb(132, 62, 165)'></div>
+<div class='gridItem' style='grid-area: 31 / 1 / span 2 / span 2; background-color: rgb(16, 110, 181)'></div>
+<div class='gridItem' style='grid-area: 31 / 2 / span 2 / span 2; background-color: rgb(9, 6, 29)'></div>
+<div class='gridItem' style='grid-area: 31 / 3 / span 2 / span 2; background-color: rgb(124, 59, 153)'></div>
+<div class='gridItem' style='grid-area: 31 / 4 / span 2 / span 2; background-color: rgb(190, 187, 5)'></div>
+<div class='gridItem' style='grid-area: 31 / 5 / span 2 / span 2; background-color: rgb(178, 90, 31)'></div>
+<div class='gridItem' style='grid-area: 31 / 6 / span 2 / span 2; background-color: rgb(205, 26, 244)'></div>
+<div class='gridItem' style='grid-area: 31 / 7 / span 2 / span 2; background-color: rgb(123, 148, 15)'></div>
+<div class='gridItem' style='grid-area: 31 / 8 / span 2 / span 2; background-color: rgb(205, 242, 180)'></div>
+<div class='gridItem' style='grid-area: 31 / 9 / span 2 / span 2; background-color: rgb(217, 238, 142)'></div>
+<div class='gridItem' style='grid-area: 31 / 10 / span 2 / span 2; background-color: rgb(149, 192, 142)'></div>
+<div class='gridItem' style='grid-area: 31 / 11 / span 2 / span 2; background-color: rgb(133, 234, 234)'></div>
+<div class='gridItem' style='grid-area: 31 / 12 / span 2 / span 2; background-color: rgb(99, 190, 138)'></div>
+<div class='gridItem' style='grid-area: 31 / 13 / span 2 / span 2; background-color: rgb(100, 228, 141)'></div>
+<div class='gridItem' style='grid-area: 31 / 14 / span 2 / span 2; background-color: rgb(59, 181, 159)'></div>
+<div class='gridItem' style='grid-area: 31 / 15 / span 2 / span 2; background-color: rgb(191, 100, 29)'></div>
+<div class='gridItem' style='grid-area: 31 / 16 / span 2 / span 2; background-color: rgb(55, 137, 68)'></div>
+<div class='gridItem' style='grid-area: 31 / 17 / span 2 / span 2; background-color: rgb(107, 5, 22)'></div>
+<div class='gridItem' style='grid-area: 31 / 18 / span 2 / span 2; background-color: rgb(192, 129, 22)'></div>
+<div class='gridItem' style='grid-area: 31 / 19 / span 2 / span 2; background-color: rgb(65, 14, 186)'></div>
+<div class='gridItem' style='grid-area: 31 / 20 / span 2 / span 2; background-color: rgb(226, 108, 82)'></div>
+<div class='gridItem' style='grid-area: 32 / 1 / span 2 / span 2; background-color: rgb(254, 123, 26)'></div>
+<div class='gridItem' style='grid-area: 32 / 2 / span 2 / span 2; background-color: rgb(215, 97, 217)'></div>
+<div class='gridItem' style='grid-area: 32 / 3 / span 2 / span 2; background-color: rgb(159, 164, 70)'></div>
+<div class='gridItem' style='grid-area: 32 / 4 / span 2 / span 2; background-color: rgb(163, 92, 130)'></div>
+<div class='gridItem' style='grid-area: 32 / 5 / span 2 / span 2; background-color: rgb(187, 62, 254)'></div>
+<div class='gridItem' style='grid-area: 32 / 6 / span 2 / span 2; background-color: rgb(202, 181, 162)'></div>
+<div class='gridItem' style='grid-area: 32 / 7 / span 2 / span 2; background-color: rgb(198, 225, 6)'></div>
+<div class='gridItem' style='grid-area: 32 / 8 / span 2 / span 2; background-color: rgb(84, 188, 48)'></div>
+<div class='gridItem' style='grid-area: 32 / 9 / span 2 / span 2; background-color: rgb(85, 245, 187)'></div>
+<div class='gridItem' style='grid-area: 32 / 10 / span 2 / span 2; background-color: rgb(137, 228, 147)'></div>
+<div class='gridItem' style='grid-area: 32 / 11 / span 2 / span 2; background-color: rgb(89, 77, 173)'></div>
+<div class='gridItem' style='grid-area: 32 / 12 / span 2 / span 2; background-color: rgb(111, 68, 186)'></div>
+<div class='gridItem' style='grid-area: 32 / 13 / span 2 / span 2; background-color: rgb(5, 155, 112)'></div>
+<div class='gridItem' style='grid-area: 32 / 14 / span 2 / span 2; background-color: rgb(39, 128, 197)'></div>
+<div class='gridItem' style='grid-area: 32 / 15 / span 2 / span 2; background-color: rgb(7, 233, 120)'></div>
+<div class='gridItem' style='grid-area: 32 / 16 / span 2 / span 2; background-color: rgb(195, 122, 109)'></div>
+<div class='gridItem' style='grid-area: 32 / 17 / span 2 / span 2; background-color: rgb(184, 166, 52)'></div>
+<div class='gridItem' style='grid-area: 32 / 18 / span 2 / span 2; background-color: rgb(14, 231, 222)'></div>
+<div class='gridItem' style='grid-area: 32 / 19 / span 2 / span 2; background-color: rgb(130, 78, 159)'></div>
+<div class='gridItem' style='grid-area: 32 / 20 / span 2 / span 2; background-color: rgb(77, 15, 229)'></div>
+<div class='gridItem' style='grid-area: 33 / 1 / span 2 / span 2; background-color: rgb(97, 16, 80)'></div>
+<div class='gridItem' style='grid-area: 33 / 2 / span 2 / span 2; background-color: rgb(146, 109, 173)'></div>
+<div class='gridItem' style='grid-area: 33 / 3 / span 2 / span 2; background-color: rgb(18, 46, 199)'></div>
+<div class='gridItem' style='grid-area: 33 / 4 / span 2 / span 2; background-color: rgb(229, 130, 96)'></div>
+<div class='gridItem' style='grid-area: 33 / 5 / span 2 / span 2; background-color: rgb(230, 232, 205)'></div>
+<div class='gridItem' style='grid-area: 33 / 6 / span 2 / span 2; background-color: rgb(144, 132, 58)'></div>
+<div class='gridItem' style='grid-area: 33 / 7 / span 2 / span 2; background-color: rgb(72, 220, 149)'></div>
+<div class='gridItem' style='grid-area: 33 / 8 / span 2 / span 2; background-color: rgb(96, 176, 39)'></div>
+<div class='gridItem' style='grid-area: 33 / 9 / span 2 / span 2; background-color: rgb(45, 109, 17)'></div>
+<div class='gridItem' style='grid-area: 33 / 10 / span 2 / span 2; background-color: rgb(48, 93, 189)'></div>
+<div class='gridItem' style='grid-area: 33 / 11 / span 2 / span 2; background-color: rgb(88, 15, 71)'></div>
+<div class='gridItem' style='grid-area: 33 / 12 / span 2 / span 2; background-color: rgb(174, 74, 18)'></div>
+<div class='gridItem' style='grid-area: 33 / 13 / span 2 / span 2; background-color: rgb(236, 106, 40)'></div>
+<div class='gridItem' style='grid-area: 33 / 14 / span 2 / span 2; background-color: rgb(132, 141, 152)'></div>
+<div class='gridItem' style='grid-area: 33 / 15 / span 2 / span 2; background-color: rgb(157, 34, 80)'></div>
+<div class='gridItem' style='grid-area: 33 / 16 / span 2 / span 2; background-color: rgb(124, 221, 92)'></div>
+<div class='gridItem' style='grid-area: 33 / 17 / span 2 / span 2; background-color: rgb(58, 40, 79)'></div>
+<div class='gridItem' style='grid-area: 33 / 18 / span 2 / span 2; background-color: rgb(102, 202, 92)'></div>
+<div class='gridItem' style='grid-area: 33 / 19 / span 2 / span 2; background-color: rgb(107, 39, 161)'></div>
+<div class='gridItem' style='grid-area: 33 / 20 / span 2 / span 2; background-color: rgb(214, 82, 170)'></div>
+<div class='gridItem' style='grid-area: 34 / 1 / span 2 / span 2; background-color: rgb(123, 121, 137)'></div>
+<div class='gridItem' style='grid-area: 34 / 2 / span 2 / span 2; background-color: rgb(155, 138, 115)'></div>
+<div class='gridItem' style='grid-area: 34 / 3 / span 2 / span 2; background-color: rgb(217, 245, 252)'></div>
+<div class='gridItem' style='grid-area: 34 / 4 / span 2 / span 2; background-color: rgb(128, 164, 69)'></div>
+<div class='gridItem' style='grid-area: 34 / 5 / span 2 / span 2; background-color: rgb(43, 78, 42)'></div>
+<div class='gridItem' style='grid-area: 34 / 6 / span 2 / span 2; background-color: rgb(31, 74, 247)'></div>
+<div class='gridItem' style='grid-area: 34 / 7 / span 2 / span 2; background-color: rgb(32, 93, 211)'></div>
+<div class='gridItem' style='grid-area: 34 / 8 / span 2 / span 2; background-color: rgb(118, 56, 89)'></div>
+<div class='gridItem' style='grid-area: 34 / 9 / span 2 / span 2; background-color: rgb(68, 204, 132)'></div>
+<div class='gridItem' style='grid-area: 34 / 10 / span 2 / span 2; background-color: rgb(183, 134, 146)'></div>
+<div class='gridItem' style='grid-area: 34 / 11 / span 2 / span 2; background-color: rgb(213, 189, 37)'></div>
+<div class='gridItem' style='grid-area: 34 / 12 / span 2 / span 2; background-color: rgb(212, 218, 38)'></div>
+<div class='gridItem' style='grid-area: 34 / 13 / span 2 / span 2; background-color: rgb(32, 72, 167)'></div>
+<div class='gridItem' style='grid-area: 34 / 14 / span 2 / span 2; background-color: rgb(216, 142, 224)'></div>
+<div class='gridItem' style='grid-area: 34 / 15 / span 2 / span 2; background-color: rgb(214, 84, 30)'></div>
+<div class='gridItem' style='grid-area: 34 / 16 / span 2 / span 2; background-color: rgb(47, 20, 159)'></div>
+<div class='gridItem' style='grid-area: 34 / 17 / span 2 / span 2; background-color: rgb(187, 167, 38)'></div>
+<div class='gridItem' style='grid-area: 34 / 18 / span 2 / span 2; background-color: rgb(115, 18, 6)'></div>
+<div class='gridItem' style='grid-area: 34 / 19 / span 2 / span 2; background-color: rgb(194, 189, 232)'></div>
+<div class='gridItem' style='grid-area: 34 / 20 / span 2 / span 2; background-color: rgb(59, 158, 16)'></div>
+<div class='gridItem' style='grid-area: 35 / 1 / span 2 / span 2; background-color: rgb(128, 28, 18)'></div>
+<div class='gridItem' style='grid-area: 35 / 2 / span 2 / span 2; background-color: rgb(153, 7, 88)'></div>
+<div class='gridItem' style='grid-area: 35 / 3 / span 2 / span 2; background-color: rgb(226, 89, 57)'></div>
+<div class='gridItem' style='grid-area: 35 / 4 / span 2 / span 2; background-color: rgb(5, 33, 45)'></div>
+<div class='gridItem' style='grid-area: 35 / 5 / span 2 / span 2; background-color: rgb(180, 248, 28)'></div>
+<div class='gridItem' style='grid-area: 35 / 6 / span 2 / span 2; background-color: rgb(205, 20, 14)'></div>
+<div class='gridItem' style='grid-area: 35 / 7 / span 2 / span 2; background-color: rgb(28, 200, 128)'></div>
+<div class='gridItem' style='grid-area: 35 / 8 / span 2 / span 2; background-color: rgb(127, 65, 131)'></div>
+<div class='gridItem' style='grid-area: 35 / 9 / span 2 / span 2; background-color: rgb(143, 219, 2)'></div>
+<div class='gridItem' style='grid-area: 35 / 10 / span 2 / span 2; background-color: rgb(4, 85, 162)'></div>
+<div class='gridItem' style='grid-area: 35 / 11 / span 2 / span 2; background-color: rgb(190, 113, 213)'></div>
+<div class='gridItem' style='grid-area: 35 / 12 / span 2 / span 2; background-color: rgb(172, 154, 67)'></div>
+<div class='gridItem' style='grid-area: 35 / 13 / span 2 / span 2; background-color: rgb(253, 238, 44)'></div>
+<div class='gridItem' style='grid-area: 35 / 14 / span 2 / span 2; background-color: rgb(141, 81, 197)'></div>
+<div class='gridItem' style='grid-area: 35 / 15 / span 2 / span 2; background-color: rgb(188, 206, 250)'></div>
+<div class='gridItem' style='grid-area: 35 / 16 / span 2 / span 2; background-color: rgb(149, 77, 148)'></div>
+<div class='gridItem' style='grid-area: 35 / 17 / span 2 / span 2; background-color: rgb(212, 124, 142)'></div>
+<div class='gridItem' style='grid-area: 35 / 18 / span 2 / span 2; background-color: rgb(134, 27, 125)'></div>
+<div class='gridItem' style='grid-area: 35 / 19 / span 2 / span 2; background-color: rgb(252, 114, 146)'></div>
+<div class='gridItem' style='grid-area: 35 / 20 / span 2 / span 2; background-color: rgb(240, 190, 74)'></div>
+<div class='gridItem' style='grid-area: 36 / 1 / span 2 / span 2; background-color: rgb(170, 108, 210)'></div>
+<div class='gridItem' style='grid-area: 36 / 2 / span 2 / span 2; background-color: rgb(170, 202, 216)'></div>
+<div class='gridItem' style='grid-area: 36 / 3 / span 2 / span 2; background-color: rgb(16, 58, 250)'></div>
+<div class='gridItem' style='grid-area: 36 / 4 / span 2 / span 2; background-color: rgb(124, 98, 13)'></div>
+<div class='gridItem' style='grid-area: 36 / 5 / span 2 / span 2; background-color: rgb(245, 105, 27)'></div>
+<div class='gridItem' style='grid-area: 36 / 6 / span 2 / span 2; background-color: rgb(252, 155, 98)'></div>
+<div class='gridItem' style='grid-area: 36 / 7 / span 2 / span 2; background-color: rgb(11, 39, 228)'></div>
+<div class='gridItem' style='grid-area: 36 / 8 / span 2 / span 2; background-color: rgb(175, 10, 176)'></div>
+<div class='gridItem' style='grid-area: 36 / 9 / span 2 / span 2; background-color: rgb(29, 83, 178)'></div>
+<div class='gridItem' style='grid-area: 36 / 10 / span 2 / span 2; background-color: rgb(207, 137, 12)'></div>
+<div class='gridItem' style='grid-area: 36 / 11 / span 2 / span 2; background-color: rgb(117, 208, 106)'></div>
+<div class='gridItem' style='grid-area: 36 / 12 / span 2 / span 2; background-color: rgb(164, 87, 212)'></div>
+<div class='gridItem' style='grid-area: 36 / 13 / span 2 / span 2; background-color: rgb(10, 148, 118)'></div>
+<div class='gridItem' style='grid-area: 36 / 14 / span 2 / span 2; background-color: rgb(66, 106, 126)'></div>
+<div class='gridItem' style='grid-area: 36 / 15 / span 2 / span 2; background-color: rgb(203, 80, 145)'></div>
+<div class='gridItem' style='grid-area: 36 / 16 / span 2 / span 2; background-color: rgb(141, 96, 38)'></div>
+<div class='gridItem' style='grid-area: 36 / 17 / span 2 / span 2; background-color: rgb(59, 121, 208)'></div>
+<div class='gridItem' style='grid-area: 36 / 18 / span 2 / span 2; background-color: rgb(79, 206, 112)'></div>
+<div class='gridItem' style='grid-area: 36 / 19 / span 2 / span 2; background-color: rgb(107, 66, 40)'></div>
+<div class='gridItem' style='grid-area: 36 / 20 / span 2 / span 2; background-color: rgb(162, 27, 43)'></div>
+<div class='gridItem' style='grid-area: 37 / 1 / span 2 / span 2; background-color: rgb(82, 148, 10)'></div>
+<div class='gridItem' style='grid-area: 37 / 2 / span 2 / span 2; background-color: rgb(41, 212, 93)'></div>
+<div class='gridItem' style='grid-area: 37 / 3 / span 2 / span 2; background-color: rgb(143, 37, 193)'></div>
+<div class='gridItem' style='grid-area: 37 / 4 / span 2 / span 2; background-color: rgb(193, 99, 30)'></div>
+<div class='gridItem' style='grid-area: 37 / 5 / span 2 / span 2; background-color: rgb(118, 116, 29)'></div>
+<div class='gridItem' style='grid-area: 37 / 6 / span 2 / span 2; background-color: rgb(82, 162, 49)'></div>
+<div class='gridItem' style='grid-area: 37 / 7 / span 2 / span 2; background-color: rgb(214, 215, 254)'></div>
+<div class='gridItem' style='grid-area: 37 / 8 / span 2 / span 2; background-color: rgb(96, 131, 80)'></div>
+<div class='gridItem' style='grid-area: 37 / 9 / span 2 / span 2; background-color: rgb(21, 136, 128)'></div>
+<div class='gridItem' style='grid-area: 37 / 10 / span 2 / span 2; background-color: rgb(187, 24, 202)'></div>
+<div class='gridItem' style='grid-area: 37 / 11 / span 2 / span 2; background-color: rgb(36, 232, 0)'></div>
+<div class='gridItem' style='grid-area: 37 / 12 / span 2 / span 2; background-color: rgb(26, 112, 24)'></div>
+<div class='gridItem' style='grid-area: 37 / 13 / span 2 / span 2; background-color: rgb(226, 56, 109)'></div>
+<div class='gridItem' style='grid-area: 37 / 14 / span 2 / span 2; background-color: rgb(232, 51, 38)'></div>
+<div class='gridItem' style='grid-area: 37 / 15 / span 2 / span 2; background-color: rgb(57, 151, 142)'></div>
+<div class='gridItem' style='grid-area: 37 / 16 / span 2 / span 2; background-color: rgb(124, 131, 208)'></div>
+<div class='gridItem' style='grid-area: 37 / 17 / span 2 / span 2; background-color: rgb(157, 134, 134)'></div>
+<div class='gridItem' style='grid-area: 37 / 18 / span 2 / span 2; background-color: rgb(21, 249, 95)'></div>
+<div class='gridItem' style='grid-area: 37 / 19 / span 2 / span 2; background-color: rgb(238, 23, 35)'></div>
+<div class='gridItem' style='grid-area: 37 / 20 / span 2 / span 2; background-color: rgb(69, 110, 13)'></div>
+<div class='gridItem' style='grid-area: 38 / 1 / span 2 / span 2; background-color: rgb(24, 45, 12)'></div>
+<div class='gridItem' style='grid-area: 38 / 2 / span 2 / span 2; background-color: rgb(63, 57, 139)'></div>
+<div class='gridItem' style='grid-area: 38 / 3 / span 2 / span 2; background-color: rgb(227, 24, 104)'></div>
+<div class='gridItem' style='grid-area: 38 / 4 / span 2 / span 2; background-color: rgb(63, 118, 40)'></div>
+<div class='gridItem' style='grid-area: 38 / 5 / span 2 / span 2; background-color: rgb(70, 32, 148)'></div>
+<div class='gridItem' style='grid-area: 38 / 6 / span 2 / span 2; background-color: rgb(225, 73, 205)'></div>
+<div class='gridItem' style='grid-area: 38 / 7 / span 2 / span 2; background-color: rgb(223, 30, 224)'></div>
+<div class='gridItem' style='grid-area: 38 / 8 / span 2 / span 2; background-color: rgb(193, 130, 135)'></div>
+<div class='gridItem' style='grid-area: 38 / 9 / span 2 / span 2; background-color: rgb(132, 16, 19)'></div>
+<div class='gridItem' style='grid-area: 38 / 10 / span 2 / span 2; background-color: rgb(95, 182, 8)'></div>
+<div class='gridItem' style='grid-area: 38 / 11 / span 2 / span 2; background-color: rgb(153, 14, 223)'></div>
+<div class='gridItem' style='grid-area: 38 / 12 / span 2 / span 2; background-color: rgb(199, 142, 70)'></div>
+<div class='gridItem' style='grid-area: 38 / 13 / span 2 / span 2; background-color: rgb(157, 197, 180)'></div>
+<div class='gridItem' style='grid-area: 38 / 14 / span 2 / span 2; background-color: rgb(55, 202, 70)'></div>
+<div class='gridItem' style='grid-area: 38 / 15 / span 2 / span 2; background-color: rgb(155, 126, 92)'></div>
+<div class='gridItem' style='grid-area: 38 / 16 / span 2 / span 2; background-color: rgb(85, 100, 205)'></div>
+<div class='gridItem' style='grid-area: 38 / 17 / span 2 / span 2; background-color: rgb(212, 249, 209)'></div>
+<div class='gridItem' style='grid-area: 38 / 18 / span 2 / span 2; background-color: rgb(61, 40, 75)'></div>
+<div class='gridItem' style='grid-area: 38 / 19 / span 2 / span 2; background-color: rgb(24, 67, 116)'></div>
+<div class='gridItem' style='grid-area: 38 / 20 / span 2 / span 2; background-color: rgb(157, 185, 186)'></div>
+<div class='gridItem' style='grid-area: 39 / 1 / span 2 / span 2; background-color: rgb(220, 220, 249)'></div>
+<div class='gridItem' style='grid-area: 39 / 2 / span 2 / span 2; background-color: rgb(11, 59, 72)'></div>
+<div class='gridItem' style='grid-area: 39 / 3 / span 2 / span 2; background-color: rgb(221, 75, 191)'></div>
+<div class='gridItem' style='grid-area: 39 / 4 / span 2 / span 2; background-color: rgb(71, 143, 185)'></div>
+<div class='gridItem' style='grid-area: 39 / 5 / span 2 / span 2; background-color: rgb(38, 158, 55)'></div>
+<div class='gridItem' style='grid-area: 39 / 6 / span 2 / span 2; background-color: rgb(20, 203, 200)'></div>
+<div class='gridItem' style='grid-area: 39 / 7 / span 2 / span 2; background-color: rgb(142, 209, 120)'></div>
+<div class='gridItem' style='grid-area: 39 / 8 / span 2 / span 2; background-color: rgb(17, 183, 217)'></div>
+<div class='gridItem' style='grid-area: 39 / 9 / span 2 / span 2; background-color: rgb(187, 239, 112)'></div>
+<div class='gridItem' style='grid-area: 39 / 10 / span 2 / span 2; background-color: rgb(17, 248, 175)'></div>
+<div class='gridItem' style='grid-area: 39 / 11 / span 2 / span 2; background-color: rgb(179, 234, 115)'></div>
+<div class='gridItem' style='grid-area: 39 / 12 / span 2 / span 2; background-color: rgb(176, 179, 138)'></div>
+<div class='gridItem' style='grid-area: 39 / 13 / span 2 / span 2; background-color: rgb(125, 145, 89)'></div>
+<div class='gridItem' style='grid-area: 39 / 14 / span 2 / span 2; background-color: rgb(99, 232, 61)'></div>
+<div class='gridItem' style='grid-area: 39 / 15 / span 2 / span 2; background-color: rgb(102, 2, 239)'></div>
+<div class='gridItem' style='grid-area: 39 / 16 / span 2 / span 2; background-color: rgb(59, 62, 252)'></div>
+<div class='gridItem' style='grid-area: 39 / 17 / span 2 / span 2; background-color: rgb(248, 210, 118)'></div>
+<div class='gridItem' style='grid-area: 39 / 18 / span 2 / span 2; background-color: rgb(186, 160, 222)'></div>
+<div class='gridItem' style='grid-area: 39 / 19 / span 2 / span 2; background-color: rgb(24, 32, 251)'></div>
+<div class='gridItem' style='grid-area: 39 / 20 / span 2 / span 2; background-color: rgb(38, 27, 51)'></div>
+<div class='gridItem' style='grid-area: 40 / 1 / span 2 / span 2; background-color: rgb(162, 41, 245)'></div>
+<div class='gridItem' style='grid-area: 40 / 2 / span 2 / span 2; background-color: rgb(100, 110, 113)'></div>
+<div class='gridItem' style='grid-area: 40 / 3 / span 2 / span 2; background-color: rgb(162, 102, 206)'></div>
+<div class='gridItem' style='grid-area: 40 / 4 / span 2 / span 2; background-color: rgb(160, 220, 209)'></div>
+<div class='gridItem' style='grid-area: 40 / 5 / span 2 / span 2; background-color: rgb(25, 81, 80)'></div>
+<div class='gridItem' style='grid-area: 40 / 6 / span 2 / span 2; background-color: rgb(112, 111, 240)'></div>
+<div class='gridItem' style='grid-area: 40 / 7 / span 2 / span 2; background-color: rgb(150, 252, 139)'></div>
+<div class='gridItem' style='grid-area: 40 / 8 / span 2 / span 2; background-color: rgb(214, 175, 117)'></div>
+<div class='gridItem' style='grid-area: 40 / 9 / span 2 / span 2; background-color: rgb(79, 74, 92)'></div>
+<div class='gridItem' style='grid-area: 40 / 10 / span 2 / span 2; background-color: rgb(47, 71, 82)'></div>
+<div class='gridItem' style='grid-area: 40 / 11 / span 2 / span 2; background-color: rgb(167, 150, 153)'></div>
+<div class='gridItem' style='grid-area: 40 / 12 / span 2 / span 2; background-color: rgb(58, 30, 11)'></div>
+<div class='gridItem' style='grid-area: 40 / 13 / span 2 / span 2; background-color: rgb(83, 89, 185)'></div>
+<div class='gridItem' style='grid-area: 40 / 14 / span 2 / span 2; background-color: rgb(206, 108, 48)'></div>
+<div class='gridItem' style='grid-area: 40 / 15 / span 2 / span 2; background-color: rgb(165, 85, 172)'></div>
+<div class='gridItem' style='grid-area: 40 / 16 / span 2 / span 2; background-color: rgb(116, 70, 169)'></div>
+<div class='gridItem' style='grid-area: 40 / 17 / span 2 / span 2; background-color: rgb(215, 168, 170)'></div>
+<div class='gridItem' style='grid-area: 40 / 18 / span 2 / span 2; background-color: rgb(114, 9, 18)'></div>
+<div class='gridItem' style='grid-area: 40 / 19 / span 2 / span 2; background-color: rgb(15, 181, 93)'></div>
+<div class='gridItem' style='grid-area: 40 / 20 / span 2 / span 2; background-color: rgb(79, 49, 249)'></div>
+<div class='gridItem' style='grid-area: 41 / 1 / span 2 / span 2; background-color: rgb(50, 42, 121)'></div>
+<div class='gridItem' style='grid-area: 41 / 2 / span 2 / span 2; background-color: rgb(128, 177, 128)'></div>
+<div class='gridItem' style='grid-area: 41 / 3 / span 2 / span 2; background-color: rgb(158, 166, 181)'></div>
+<div class='gridItem' style='grid-area: 41 / 4 / span 2 / span 2; background-color: rgb(43, 84, 220)'></div>
+<div class='gridItem' style='grid-area: 41 / 5 / span 2 / span 2; background-color: rgb(182, 156, 185)'></div>
+<div class='gridItem' style='grid-area: 41 / 6 / span 2 / span 2; background-color: rgb(154, 36, 127)'></div>
+<div class='gridItem' style='grid-area: 41 / 7 / span 2 / span 2; background-color: rgb(126, 172, 74)'></div>
+<div class='gridItem' style='grid-area: 41 / 8 / span 2 / span 2; background-color: rgb(183, 152, 80)'></div>
+<div class='gridItem' style='grid-area: 41 / 9 / span 2 / span 2; background-color: rgb(5, 169, 117)'></div>
+<div class='gridItem' style='grid-area: 41 / 10 / span 2 / span 2; background-color: rgb(46, 61, 80)'></div>
+<div class='gridItem' style='grid-area: 41 / 11 / span 2 / span 2; background-color: rgb(163, 175, 64)'></div>
+<div class='gridItem' style='grid-area: 41 / 12 / span 2 / span 2; background-color: rgb(145, 47, 22)'></div>
+<div class='gridItem' style='grid-area: 41 / 13 / span 2 / span 2; background-color: rgb(246, 183, 48)'></div>
+<div class='gridItem' style='grid-area: 41 / 14 / span 2 / span 2; background-color: rgb(193, 12, 80)'></div>
+<div class='gridItem' style='grid-area: 41 / 15 / span 2 / span 2; background-color: rgb(191, 250, 84)'></div>
+<div class='gridItem' style='grid-area: 41 / 16 / span 2 / span 2; background-color: rgb(231, 225, 233)'></div>
+<div class='gridItem' style='grid-area: 41 / 17 / span 2 / span 2; background-color: rgb(217, 46, 100)'></div>
+<div class='gridItem' style='grid-area: 41 / 18 / span 2 / span 2; background-color: rgb(224, 242, 78)'></div>
+<div class='gridItem' style='grid-area: 41 / 19 / span 2 / span 2; background-color: rgb(138, 33, 83)'></div>
+<div class='gridItem' style='grid-area: 41 / 20 / span 2 / span 2; background-color: rgb(58, 179, 78)'></div>
+<div class='gridItem' style='grid-area: 42 / 1 / span 2 / span 2; background-color: rgb(2, 153, 110)'></div>
+<div class='gridItem' style='grid-area: 42 / 2 / span 2 / span 2; background-color: rgb(96, 83, 158)'></div>
+<div class='gridItem' style='grid-area: 42 / 3 / span 2 / span 2; background-color: rgb(120, 155, 36)'></div>
+<div class='gridItem' style='grid-area: 42 / 4 / span 2 / span 2; background-color: rgb(231, 52, 7)'></div>
+<div class='gridItem' style='grid-area: 42 / 5 / span 2 / span 2; background-color: rgb(205, 248, 237)'></div>
+<div class='gridItem' style='grid-area: 42 / 6 / span 2 / span 2; background-color: rgb(39, 116, 114)'></div>
+<div class='gridItem' style='grid-area: 42 / 7 / span 2 / span 2; background-color: rgb(241, 23, 216)'></div>
+<div class='gridItem' style='grid-area: 42 / 8 / span 2 / span 2; background-color: rgb(249, 67, 12)'></div>
+<div class='gridItem' style='grid-area: 42 / 9 / span 2 / span 2; background-color: rgb(213, 132, 74)'></div>
+<div class='gridItem' style='grid-area: 42 / 10 / span 2 / span 2; background-color: rgb(187, 241, 11)'></div>
+<div class='gridItem' style='grid-area: 42 / 11 / span 2 / span 2; background-color: rgb(233, 111, 8)'></div>
+<div class='gridItem' style='grid-area: 42 / 12 / span 2 / span 2; background-color: rgb(25, 163, 165)'></div>
+<div class='gridItem' style='grid-area: 42 / 13 / span 2 / span 2; background-color: rgb(162, 51, 72)'></div>
+<div class='gridItem' style='grid-area: 42 / 14 / span 2 / span 2; background-color: rgb(65, 15, 161)'></div>
+<div class='gridItem' style='grid-area: 42 / 15 / span 2 / span 2; background-color: rgb(98, 251, 158)'></div>
+<div class='gridItem' style='grid-area: 42 / 16 / span 2 / span 2; background-color: rgb(124, 53, 67)'></div>
+<div class='gridItem' style='grid-area: 42 / 17 / span 2 / span 2; background-color: rgb(237, 179, 109)'></div>
+<div class='gridItem' style='grid-area: 42 / 18 / span 2 / span 2; background-color: rgb(20, 86, 128)'></div>
+<div class='gridItem' style='grid-area: 42 / 19 / span 2 / span 2; background-color: rgb(218, 104, 95)'></div>
+<div class='gridItem' style='grid-area: 42 / 20 / span 2 / span 2; background-color: rgb(62, 55, 121)'></div>
+<div class='gridItem' style='grid-area: 43 / 1 / span 2 / span 2; background-color: rgb(162, 207, 22)'></div>
+<div class='gridItem' style='grid-area: 43 / 2 / span 2 / span 2; background-color: rgb(82, 137, 132)'></div>
+<div class='gridItem' style='grid-area: 43 / 3 / span 2 / span 2; background-color: rgb(113, 15, 143)'></div>
+<div class='gridItem' style='grid-area: 43 / 4 / span 2 / span 2; background-color: rgb(27, 156, 232)'></div>
+<div class='gridItem' style='grid-area: 43 / 5 / span 2 / span 2; background-color: rgb(11, 186, 60)'></div>
+<div class='gridItem' style='grid-area: 43 / 6 / span 2 / span 2; background-color: rgb(213, 43, 55)'></div>
+<div class='gridItem' style='grid-area: 43 / 7 / span 2 / span 2; background-color: rgb(163, 26, 158)'></div>
+<div class='gridItem' style='grid-area: 43 / 8 / span 2 / span 2; background-color: rgb(122, 136, 51)'></div>
+<div class='gridItem' style='grid-area: 43 / 9 / span 2 / span 2; background-color: rgb(200, 78, 208)'></div>
+<div class='gridItem' style='grid-area: 43 / 10 / span 2 / span 2; background-color: rgb(81, 154, 188)'></div>
+<div class='gridItem' style='grid-area: 43 / 11 / span 2 / span 2; background-color: rgb(98, 83, 205)'></div>
+<div class='gridItem' style='grid-area: 43 / 12 / span 2 / span 2; background-color: rgb(227, 142, 113)'></div>
+<div class='gridItem' style='grid-area: 43 / 13 / span 2 / span 2; background-color: rgb(31, 186, 181)'></div>
+<div class='gridItem' style='grid-area: 43 / 14 / span 2 / span 2; background-color: rgb(166, 101, 92)'></div>
+<div class='gridItem' style='grid-area: 43 / 15 / span 2 / span 2; background-color: rgb(128, 25, 159)'></div>
+<div class='gridItem' style='grid-area: 43 / 16 / span 2 / span 2; background-color: rgb(119, 31, 8)'></div>
+<div class='gridItem' style='grid-area: 43 / 17 / span 2 / span 2; background-color: rgb(140, 76, 120)'></div>
+<div class='gridItem' style='grid-area: 43 / 18 / span 2 / span 2; background-color: rgb(72, 135, 49)'></div>
+<div class='gridItem' style='grid-area: 43 / 19 / span 2 / span 2; background-color: rgb(180, 252, 226)'></div>
+<div class='gridItem' style='grid-area: 43 / 20 / span 2 / span 2; background-color: rgb(171, 174, 244)'></div>
+<div class='gridItem' style='grid-area: 44 / 1 / span 2 / span 2; background-color: rgb(148, 54, 146)'></div>
+<div class='gridItem' style='grid-area: 44 / 2 / span 2 / span 2; background-color: rgb(49, 97, 44)'></div>
+<div class='gridItem' style='grid-area: 44 / 3 / span 2 / span 2; background-color: rgb(73, 64, 163)'></div>
+<div class='gridItem' style='grid-area: 44 / 4 / span 2 / span 2; background-color: rgb(8, 142, 94)'></div>
+<div class='gridItem' style='grid-area: 44 / 5 / span 2 / span 2; background-color: rgb(132, 207, 94)'></div>
+<div class='gridItem' style='grid-area: 44 / 6 / span 2 / span 2; background-color: rgb(171, 116, 252)'></div>
+<div class='gridItem' style='grid-area: 44 / 7 / span 2 / span 2; background-color: rgb(124, 237, 211)'></div>
+<div class='gridItem' style='grid-area: 44 / 8 / span 2 / span 2; background-color: rgb(118, 200, 238)'></div>
+<div class='gridItem' style='grid-area: 44 / 9 / span 2 / span 2; background-color: rgb(178, 215, 73)'></div>
+<div class='gridItem' style='grid-area: 44 / 10 / span 2 / span 2; background-color: rgb(201, 188, 160)'></div>
+<div class='gridItem' style='grid-area: 44 / 11 / span 2 / span 2; background-color: rgb(235, 9, 159)'></div>
+<div class='gridItem' style='grid-area: 44 / 12 / span 2 / span 2; background-color: rgb(230, 73, 145)'></div>
+<div class='gridItem' style='grid-area: 44 / 13 / span 2 / span 2; background-color: rgb(75, 151, 135)'></div>
+<div class='gridItem' style='grid-area: 44 / 14 / span 2 / span 2; background-color: rgb(56, 244, 38)'></div>
+<div class='gridItem' style='grid-area: 44 / 15 / span 2 / span 2; background-color: rgb(124, 120, 26)'></div>
+<div class='gridItem' style='grid-area: 44 / 16 / span 2 / span 2; background-color: rgb(102, 115, 162)'></div>
+<div class='gridItem' style='grid-area: 44 / 17 / span 2 / span 2; background-color: rgb(46, 199, 78)'></div>
+<div class='gridItem' style='grid-area: 44 / 18 / span 2 / span 2; background-color: rgb(169, 69, 248)'></div>
+<div class='gridItem' style='grid-area: 44 / 19 / span 2 / span 2; background-color: rgb(217, 188, 147)'></div>
+<div class='gridItem' style='grid-area: 44 / 20 / span 2 / span 2; background-color: rgb(224, 93, 113)'></div>
+<div class='gridItem' style='grid-area: 45 / 1 / span 2 / span 2; background-color: rgb(253, 217, 126)'></div>
+<div class='gridItem' style='grid-area: 45 / 2 / span 2 / span 2; background-color: rgb(31, 80, 213)'></div>
+<div class='gridItem' style='grid-area: 45 / 3 / span 2 / span 2; background-color: rgb(16, 239, 112)'></div>
+<div class='gridItem' style='grid-area: 45 / 4 / span 2 / span 2; background-color: rgb(7, 159, 87)'></div>
+<div class='gridItem' style='grid-area: 45 / 5 / span 2 / span 2; background-color: rgb(66, 217, 189)'></div>
+<div class='gridItem' style='grid-area: 45 / 6 / span 2 / span 2; background-color: rgb(54, 44, 150)'></div>
+<div class='gridItem' style='grid-area: 45 / 7 / span 2 / span 2; background-color: rgb(32, 45, 69)'></div>
+<div class='gridItem' style='grid-area: 45 / 8 / span 2 / span 2; background-color: rgb(81, 189, 45)'></div>
+<div class='gridItem' style='grid-area: 45 / 9 / span 2 / span 2; background-color: rgb(81, 75, 86)'></div>
+<div class='gridItem' style='grid-area: 45 / 10 / span 2 / span 2; background-color: rgb(63, 81, 61)'></div>
+<div class='gridItem' style='grid-area: 45 / 11 / span 2 / span 2; background-color: rgb(200, 97, 102)'></div>
+<div class='gridItem' style='grid-area: 45 / 12 / span 2 / span 2; background-color: rgb(222, 229, 82)'></div>
+<div class='gridItem' style='grid-area: 45 / 13 / span 2 / span 2; background-color: rgb(99, 113, 255)'></div>
+<div class='gridItem' style='grid-area: 45 / 14 / span 2 / span 2; background-color: rgb(138, 238, 11)'></div>
+<div class='gridItem' style='grid-area: 45 / 15 / span 2 / span 2; background-color: rgb(241, 221, 37)'></div>
+<div class='gridItem' style='grid-area: 45 / 16 / span 2 / span 2; background-color: rgb(46, 162, 140)'></div>
+<div class='gridItem' style='grid-area: 45 / 17 / span 2 / span 2; background-color: rgb(29, 63, 103)'></div>
+<div class='gridItem' style='grid-area: 45 / 18 / span 2 / span 2; background-color: rgb(127, 162, 135)'></div>
+<div class='gridItem' style='grid-area: 45 / 19 / span 2 / span 2; background-color: rgb(188, 89, 196)'></div>
+<div class='gridItem' style='grid-area: 45 / 20 / span 2 / span 2; background-color: rgb(103, 147, 139)'></div>
+<div class='gridItem' style='grid-area: 46 / 1 / span 2 / span 2; background-color: rgb(27, 155, 92)'></div>
+<div class='gridItem' style='grid-area: 46 / 2 / span 2 / span 2; background-color: rgb(181, 130, 123)'></div>
+<div class='gridItem' style='grid-area: 46 / 3 / span 2 / span 2; background-color: rgb(166, 223, 165)'></div>
+<div class='gridItem' style='grid-area: 46 / 4 / span 2 / span 2; background-color: rgb(221, 193, 28)'></div>
+<div class='gridItem' style='grid-area: 46 / 5 / span 2 / span 2; background-color: rgb(185, 92, 68)'></div>
+<div class='gridItem' style='grid-area: 46 / 6 / span 2 / span 2; background-color: rgb(180, 103, 243)'></div>
+<div class='gridItem' style='grid-area: 46 / 7 / span 2 / span 2; background-color: rgb(137, 30, 22)'></div>
+<div class='gridItem' style='grid-area: 46 / 8 / span 2 / span 2; background-color: rgb(131, 201, 86)'></div>
+<div class='gridItem' style='grid-area: 46 / 9 / span 2 / span 2; background-color: rgb(12, 119, 223)'></div>
+<div class='gridItem' style='grid-area: 46 / 10 / span 2 / span 2; background-color: rgb(26, 187, 90)'></div>
+<div class='gridItem' style='grid-area: 46 / 11 / span 2 / span 2; background-color: rgb(84, 52, 80)'></div>
+<div class='gridItem' style='grid-area: 46 / 12 / span 2 / span 2; background-color: rgb(158, 187, 194)'></div>
+<div class='gridItem' style='grid-area: 46 / 13 / span 2 / span 2; background-color: rgb(119, 158, 14)'></div>
+<div class='gridItem' style='grid-area: 46 / 14 / span 2 / span 2; background-color: rgb(83, 56, 96)'></div>
+<div class='gridItem' style='grid-area: 46 / 15 / span 2 / span 2; background-color: rgb(166, 123, 145)'></div>
+<div class='gridItem' style='grid-area: 46 / 16 / span 2 / span 2; background-color: rgb(77, 176, 36)'></div>
+<div class='gridItem' style='grid-area: 46 / 17 / span 2 / span 2; background-color: rgb(156, 141, 210)'></div>
+<div class='gridItem' style='grid-area: 46 / 18 / span 2 / span 2; background-color: rgb(240, 123, 132)'></div>
+<div class='gridItem' style='grid-area: 46 / 19 / span 2 / span 2; background-color: rgb(67, 43, 161)'></div>
+<div class='gridItem' style='grid-area: 46 / 20 / span 2 / span 2; background-color: rgb(37, 24, 31)'></div>
+<div class='gridItem' style='grid-area: 47 / 1 / span 2 / span 2; background-color: rgb(54, 189, 208)'></div>
+<div class='gridItem' style='grid-area: 47 / 2 / span 2 / span 2; background-color: rgb(191, 182, 183)'></div>
+<div class='gridItem' style='grid-area: 47 / 3 / span 2 / span 2; background-color: rgb(228, 58, 53)'></div>
+<div class='gridItem' style='grid-area: 47 / 4 / span 2 / span 2; background-color: rgb(250, 45, 113)'></div>
+<div class='gridItem' style='grid-area: 47 / 5 / span 2 / span 2; background-color: rgb(109, 117, 192)'></div>
+<div class='gridItem' style='grid-area: 47 / 6 / span 2 / span 2; background-color: rgb(135, 20, 198)'></div>
+<div class='gridItem' style='grid-area: 47 / 7 / span 2 / span 2; background-color: rgb(109, 113, 194)'></div>
+<div class='gridItem' style='grid-area: 47 / 8 / span 2 / span 2; background-color: rgb(57, 180, 69)'></div>
+<div class='gridItem' style='grid-area: 47 / 9 / span 2 / span 2; background-color: rgb(168, 176, 208)'></div>
+<div class='gridItem' style='grid-area: 47 / 10 / span 2 / span 2; background-color: rgb(182, 146, 119)'></div>
+<div class='gridItem' style='grid-area: 47 / 11 / span 2 / span 2; background-color: rgb(239, 2, 41)'></div>
+<div class='gridItem' style='grid-area: 47 / 12 / span 2 / span 2; background-color: rgb(51, 104, 215)'></div>
+<div class='gridItem' style='grid-area: 47 / 13 / span 2 / span 2; background-color: rgb(50, 6, 94)'></div>
+<div class='gridItem' style='grid-area: 47 / 14 / span 2 / span 2; background-color: rgb(69, 186, 205)'></div>
+<div class='gridItem' style='grid-area: 47 / 15 / span 2 / span 2; background-color: rgb(119, 80, 151)'></div>
+<div class='gridItem' style='grid-area: 47 / 16 / span 2 / span 2; background-color: rgb(214, 54, 208)'></div>
+<div class='gridItem' style='grid-area: 47 / 17 / span 2 / span 2; background-color: rgb(175, 199, 197)'></div>
+<div class='gridItem' style='grid-area: 47 / 18 / span 2 / span 2; background-color: rgb(242, 228, 176)'></div>
+<div class='gridItem' style='grid-area: 47 / 19 / span 2 / span 2; background-color: rgb(195, 33, 62)'></div>
+<div class='gridItem' style='grid-area: 47 / 20 / span 2 / span 2; background-color: rgb(41, 248, 194)'></div>
+<div class='gridItem' style='grid-area: 48 / 1 / span 2 / span 2; background-color: rgb(208, 57, 140)'></div>
+<div class='gridItem' style='grid-area: 48 / 2 / span 2 / span 2; background-color: rgb(142, 99, 95)'></div>
+<div class='gridItem' style='grid-area: 48 / 3 / span 2 / span 2; background-color: rgb(98, 120, 20)'></div>
+<div class='gridItem' style='grid-area: 48 / 4 / span 2 / span 2; background-color: rgb(49, 195, 95)'></div>
+<div class='gridItem' style='grid-area: 48 / 5 / span 2 / span 2; background-color: rgb(24, 103, 173)'></div>
+<div class='gridItem' style='grid-area: 48 / 6 / span 2 / span 2; background-color: rgb(178, 55, 170)'></div>
+<div class='gridItem' style='grid-area: 48 / 7 / span 2 / span 2; background-color: rgb(35, 244, 202)'></div>
+<div class='gridItem' style='grid-area: 48 / 8 / span 2 / span 2; background-color: rgb(186, 161, 131)'></div>
+<div class='gridItem' style='grid-area: 48 / 9 / span 2 / span 2; background-color: rgb(35, 41, 65)'></div>
+<div class='gridItem' style='grid-area: 48 / 10 / span 2 / span 2; background-color: rgb(82, 102, 233)'></div>
+<div class='gridItem' style='grid-area: 48 / 11 / span 2 / span 2; background-color: rgb(24, 245, 43)'></div>
+<div class='gridItem' style='grid-area: 48 / 12 / span 2 / span 2; background-color: rgb(8, 76, 44)'></div>
+<div class='gridItem' style='grid-area: 48 / 13 / span 2 / span 2; background-color: rgb(43, 81, 205)'></div>
+<div class='gridItem' style='grid-area: 48 / 14 / span 2 / span 2; background-color: rgb(18, 26, 118)'></div>
+<div class='gridItem' style='grid-area: 48 / 15 / span 2 / span 2; background-color: rgb(156, 186, 34)'></div>
+<div class='gridItem' style='grid-area: 48 / 16 / span 2 / span 2; background-color: rgb(178, 201, 110)'></div>
+<div class='gridItem' style='grid-area: 48 / 17 / span 2 / span 2; background-color: rgb(114, 186, 101)'></div>
+<div class='gridItem' style='grid-area: 48 / 18 / span 2 / span 2; background-color: rgb(223, 5, 82)'></div>
+<div class='gridItem' style='grid-area: 48 / 19 / span 2 / span 2; background-color: rgb(107, 128, 200)'></div>
+<div class='gridItem' style='grid-area: 48 / 20 / span 2 / span 2; background-color: rgb(90, 233, 157)'></div>
+<div class='gridItem' style='grid-area: 49 / 1 / span 2 / span 2; background-color: rgb(96, 147, 12)'></div>
+<div class='gridItem' style='grid-area: 49 / 2 / span 2 / span 2; background-color: rgb(104, 85, 35)'></div>
+<div class='gridItem' style='grid-area: 49 / 3 / span 2 / span 2; background-color: rgb(35, 86, 169)'></div>
+<div class='gridItem' style='grid-area: 49 / 4 / span 2 / span 2; background-color: rgb(182, 235, 21)'></div>
+<div class='gridItem' style='grid-area: 49 / 5 / span 2 / span 2; background-color: rgb(71, 64, 147)'></div>
+<div class='gridItem' style='grid-area: 49 / 6 / span 2 / span 2; background-color: rgb(145, 195, 184)'></div>
+<div class='gridItem' style='grid-area: 49 / 7 / span 2 / span 2; background-color: rgb(168, 229, 190)'></div>
+<div class='gridItem' style='grid-area: 49 / 8 / span 2 / span 2; background-color: rgb(181, 148, 73)'></div>
+<div class='gridItem' style='grid-area: 49 / 9 / span 2 / span 2; background-color: rgb(133, 234, 183)'></div>
+<div class='gridItem' style='grid-area: 49 / 10 / span 2 / span 2; background-color: rgb(159, 122, 111)'></div>
+<div class='gridItem' style='grid-area: 49 / 11 / span 2 / span 2; background-color: rgb(84, 156, 95)'></div>
+<div class='gridItem' style='grid-area: 49 / 12 / span 2 / span 2; background-color: rgb(165, 123, 75)'></div>
+<div class='gridItem' style='grid-area: 49 / 13 / span 2 / span 2; background-color: rgb(210, 70, 241)'></div>
+<div class='gridItem' style='grid-area: 49 / 14 / span 2 / span 2; background-color: rgb(183, 129, 16)'></div>
+<div class='gridItem' style='grid-area: 49 / 15 / span 2 / span 2; background-color: rgb(146, 48, 132)'></div>
+<div class='gridItem' style='grid-area: 49 / 16 / span 2 / span 2; background-color: rgb(206, 131, 165)'></div>
+<div class='gridItem' style='grid-area: 49 / 17 / span 2 / span 2; background-color: rgb(105, 97, 177)'></div>
+<div class='gridItem' style='grid-area: 49 / 18 / span 2 / span 2; background-color: rgb(144, 180, 22)'></div>
+<div class='gridItem' style='grid-area: 49 / 19 / span 2 / span 2; background-color: rgb(130, 218, 183)'></div>
+<div class='gridItem' style='grid-area: 49 / 20 / span 2 / span 2; background-color: rgb(25, 212, 91)'></div>
+<div class='gridItem' style='grid-area: 50 / 1 / span 2 / span 2; background-color: rgb(191, 68, 16)'></div>
+<div class='gridItem' style='grid-area: 50 / 2 / span 2 / span 2; background-color: rgb(120, 216, 177)'></div>
+<div class='gridItem' style='grid-area: 50 / 3 / span 2 / span 2; background-color: rgb(35, 148, 6)'></div>
+<div class='gridItem' style='grid-area: 50 / 4 / span 2 / span 2; background-color: rgb(237, 77, 92)'></div>
+<div class='gridItem' style='grid-area: 50 / 5 / span 2 / span 2; background-color: rgb(232, 51, 248)'></div>
+<div class='gridItem' style='grid-area: 50 / 6 / span 2 / span 2; background-color: rgb(235, 225, 151)'></div>
+<div class='gridItem' style='grid-area: 50 / 7 / span 2 / span 2; background-color: rgb(231, 108, 137)'></div>
+<div class='gridItem' style='grid-area: 50 / 8 / span 2 / span 2; background-color: rgb(226, 182, 66)'></div>
+<div class='gridItem' style='grid-area: 50 / 9 / span 2 / span 2; background-color: rgb(187, 69, 17)'></div>
+<div class='gridItem' style='grid-area: 50 / 10 / span 2 / span 2; background-color: rgb(27, 199, 62)'></div>
+<div class='gridItem' style='grid-area: 50 / 11 / span 2 / span 2; background-color: rgb(75, 24, 153)'></div>
+<div class='gridItem' style='grid-area: 50 / 12 / span 2 / span 2; background-color: rgb(160, 219, 79)'></div>
+<div class='gridItem' style='grid-area: 50 / 13 / span 2 / span 2; background-color: rgb(148, 140, 127)'></div>
+<div class='gridItem' style='grid-area: 50 / 14 / span 2 / span 2; background-color: rgb(250, 0, 28)'></div>
+<div class='gridItem' style='grid-area: 50 / 15 / span 2 / span 2; background-color: rgb(227, 5, 235)'></div>
+<div class='gridItem' style='grid-area: 50 / 16 / span 2 / span 2; background-color: rgb(98, 167, 200)'></div>
+<div class='gridItem' style='grid-area: 50 / 17 / span 2 / span 2; background-color: rgb(132, 24, 126)'></div>
+<div class='gridItem' style='grid-area: 50 / 18 / span 2 / span 2; background-color: rgb(140, 152, 192)'></div>
+<div class='gridItem' style='grid-area: 50 / 19 / span 2 / span 2; background-color: rgb(100, 220, 88)'></div>
+<div class='gridItem' style='grid-area: 50 / 20 / span 2 / span 2; background-color: rgb(100, 70, 217)'></div>
+<div class='gridItem' style='grid-area: 51 / 1 / span 2 / span 2; background-color: rgb(205, 47, 63)'></div>
+<div class='gridItem' style='grid-area: 51 / 2 / span 2 / span 2; background-color: rgb(32, 175, 106)'></div>
+<div class='gridItem' style='grid-area: 51 / 3 / span 2 / span 2; background-color: rgb(177, 144, 12)'></div>
+<div class='gridItem' style='grid-area: 51 / 4 / span 2 / span 2; background-color: rgb(6, 132, 198)'></div>
+<div class='gridItem' style='grid-area: 51 / 5 / span 2 / span 2; background-color: rgb(92, 210, 121)'></div>
+<div class='gridItem' style='grid-area: 51 / 6 / span 2 / span 2; background-color: rgb(213, 216, 101)'></div>
+<div class='gridItem' style='grid-area: 51 / 7 / span 2 / span 2; background-color: rgb(19, 47, 143)'></div>
+<div class='gridItem' style='grid-area: 51 / 8 / span 2 / span 2; background-color: rgb(188, 48, 167)'></div>
+<div class='gridItem' style='grid-area: 51 / 9 / span 2 / span 2; background-color: rgb(91, 79, 8)'></div>
+<div class='gridItem' style='grid-area: 51 / 10 / span 2 / span 2; background-color: rgb(97, 61, 137)'></div>
+<div class='gridItem' style='grid-area: 51 / 11 / span 2 / span 2; background-color: rgb(44, 143, 124)'></div>
+<div class='gridItem' style='grid-area: 51 / 12 / span 2 / span 2; background-color: rgb(49, 4, 64)'></div>
+<div class='gridItem' style='grid-area: 51 / 13 / span 2 / span 2; background-color: rgb(238, 99, 177)'></div>
+<div class='gridItem' style='grid-area: 51 / 14 / span 2 / span 2; background-color: rgb(117, 211, 124)'></div>
+<div class='gridItem' style='grid-area: 51 / 15 / span 2 / span 2; background-color: rgb(51, 38, 63)'></div>
+<div class='gridItem' style='grid-area: 51 / 16 / span 2 / span 2; background-color: rgb(26, 46, 132)'></div>
+<div class='gridItem' style='grid-area: 51 / 17 / span 2 / span 2; background-color: rgb(164, 39, 197)'></div>
+<div class='gridItem' style='grid-area: 51 / 18 / span 2 / span 2; background-color: rgb(243, 167, 48)'></div>
+<div class='gridItem' style='grid-area: 51 / 19 / span 2 / span 2; background-color: rgb(23, 97, 17)'></div>
+<div class='gridItem' style='grid-area: 51 / 20 / span 2 / span 2; background-color: rgb(35, 250, 20)'></div>
+<div class='gridItem' style='grid-area: 52 / 1 / span 2 / span 2; background-color: rgb(251, 231, 188)'></div>
+<div class='gridItem' style='grid-area: 52 / 2 / span 2 / span 2; background-color: rgb(246, 2, 188)'></div>
+<div class='gridItem' style='grid-area: 52 / 3 / span 2 / span 2; background-color: rgb(193, 111, 103)'></div>
+<div class='gridItem' style='grid-area: 52 / 4 / span 2 / span 2; background-color: rgb(23, 159, 70)'></div>
+<div class='gridItem' style='grid-area: 52 / 5 / span 2 / span 2; background-color: rgb(194, 20, 241)'></div>
+<div class='gridItem' style='grid-area: 52 / 6 / span 2 / span 2; background-color: rgb(101, 130, 107)'></div>
+<div class='gridItem' style='grid-area: 52 / 7 / span 2 / span 2; background-color: rgb(53, 120, 66)'></div>
+<div class='gridItem' style='grid-area: 52 / 8 / span 2 / span 2; background-color: rgb(138, 250, 94)'></div>
+<div class='gridItem' style='grid-area: 52 / 9 / span 2 / span 2; background-color: rgb(18, 20, 102)'></div>
+<div class='gridItem' style='grid-area: 52 / 10 / span 2 / span 2; background-color: rgb(233, 230, 103)'></div>
+<div class='gridItem' style='grid-area: 52 / 11 / span 2 / span 2; background-color: rgb(46, 155, 150)'></div>
+<div class='gridItem' style='grid-area: 52 / 12 / span 2 / span 2; background-color: rgb(102, 199, 185)'></div>
+<div class='gridItem' style='grid-area: 52 / 13 / span 2 / span 2; background-color: rgb(9, 114, 142)'></div>
+<div class='gridItem' style='grid-area: 52 / 14 / span 2 / span 2; background-color: rgb(254, 126, 164)'></div>
+<div class='gridItem' style='grid-area: 52 / 15 / span 2 / span 2; background-color: rgb(231, 100, 63)'></div>
+<div class='gridItem' style='grid-area: 52 / 16 / span 2 / span 2; background-color: rgb(206, 170, 36)'></div>
+<div class='gridItem' style='grid-area: 52 / 17 / span 2 / span 2; background-color: rgb(25, 83, 121)'></div>
+<div class='gridItem' style='grid-area: 52 / 18 / span 2 / span 2; background-color: rgb(167, 220, 75)'></div>
+<div class='gridItem' style='grid-area: 52 / 19 / span 2 / span 2; background-color: rgb(217, 133, 253)'></div>
+<div class='gridItem' style='grid-area: 52 / 20 / span 2 / span 2; background-color: rgb(48, 191, 11)'></div>
+<div class='gridItem' style='grid-area: 53 / 1 / span 2 / span 2; background-color: rgb(187, 161, 128)'></div>
+<div class='gridItem' style='grid-area: 53 / 2 / span 2 / span 2; background-color: rgb(211, 24, 26)'></div>
+<div class='gridItem' style='grid-area: 53 / 3 / span 2 / span 2; background-color: rgb(254, 103, 74)'></div>
+<div class='gridItem' style='grid-area: 53 / 4 / span 2 / span 2; background-color: rgb(252, 227, 91)'></div>
+<div class='gridItem' style='grid-area: 53 / 5 / span 2 / span 2; background-color: rgb(239, 219, 228)'></div>
+<div class='gridItem' style='grid-area: 53 / 6 / span 2 / span 2; background-color: rgb(184, 25, 107)'></div>
+<div class='gridItem' style='grid-area: 53 / 7 / span 2 / span 2; background-color: rgb(120, 230, 93)'></div>
+<div class='gridItem' style='grid-area: 53 / 8 / span 2 / span 2; background-color: rgb(0, 12, 67)'></div>
+<div class='gridItem' style='grid-area: 53 / 9 / span 2 / span 2; background-color: rgb(17, 106, 3)'></div>
+<div class='gridItem' style='grid-area: 53 / 10 / span 2 / span 2; background-color: rgb(232, 137, 249)'></div>
+<div class='gridItem' style='grid-area: 53 / 11 / span 2 / span 2; background-color: rgb(7, 118, 175)'></div>
+<div class='gridItem' style='grid-area: 53 / 12 / span 2 / span 2; background-color: rgb(221, 35, 154)'></div>
+<div class='gridItem' style='grid-area: 53 / 13 / span 2 / span 2; background-color: rgb(126, 149, 36)'></div>
+<div class='gridItem' style='grid-area: 53 / 14 / span 2 / span 2; background-color: rgb(11, 98, 202)'></div>
+<div class='gridItem' style='grid-area: 53 / 15 / span 2 / span 2; background-color: rgb(188, 102, 226)'></div>
+<div class='gridItem' style='grid-area: 53 / 16 / span 2 / span 2; background-color: rgb(2, 83, 177)'></div>
+<div class='gridItem' style='grid-area: 53 / 17 / span 2 / span 2; background-color: rgb(243, 58, 187)'></div>
+<div class='gridItem' style='grid-area: 53 / 18 / span 2 / span 2; background-color: rgb(154, 114, 36)'></div>
+<div class='gridItem' style='grid-area: 53 / 19 / span 2 / span 2; background-color: rgb(232, 230, 92)'></div>
+<div class='gridItem' style='grid-area: 53 / 20 / span 2 / span 2; background-color: rgb(206, 71, 1)'></div>
+<div class='gridItem' style='grid-area: 54 / 1 / span 2 / span 2; background-color: rgb(200, 230, 49)'></div>
+<div class='gridItem' style='grid-area: 54 / 2 / span 2 / span 2; background-color: rgb(94, 74, 213)'></div>
+<div class='gridItem' style='grid-area: 54 / 3 / span 2 / span 2; background-color: rgb(250, 16, 79)'></div>
+<div class='gridItem' style='grid-area: 54 / 4 / span 2 / span 2; background-color: rgb(157, 109, 253)'></div>
+<div class='gridItem' style='grid-area: 54 / 5 / span 2 / span 2; background-color: rgb(194, 106, 57)'></div>
+<div class='gridItem' style='grid-area: 54 / 6 / span 2 / span 2; background-color: rgb(145, 14, 91)'></div>
+<div class='gridItem' style='grid-area: 54 / 7 / span 2 / span 2; background-color: rgb(5, 23, 92)'></div>
+<div class='gridItem' style='grid-area: 54 / 8 / span 2 / span 2; background-color: rgb(152, 243, 216)'></div>
+<div class='gridItem' style='grid-area: 54 / 9 / span 2 / span 2; background-color: rgb(225, 84, 118)'></div>
+<div class='gridItem' style='grid-area: 54 / 10 / span 2 / span 2; background-color: rgb(27, 156, 228)'></div>
+<div class='gridItem' style='grid-area: 54 / 11 / span 2 / span 2; background-color: rgb(229, 173, 223)'></div>
+<div class='gridItem' style='grid-area: 54 / 12 / span 2 / span 2; background-color: rgb(201, 84, 37)'></div>
+<div class='gridItem' style='grid-area: 54 / 13 / span 2 / span 2; background-color: rgb(107, 34, 150)'></div>
+<div class='gridItem' style='grid-area: 54 / 14 / span 2 / span 2; background-color: rgb(44, 4, 124)'></div>
+<div class='gridItem' style='grid-area: 54 / 15 / span 2 / span 2; background-color: rgb(139, 150, 227)'></div>
+<div class='gridItem' style='grid-area: 54 / 16 / span 2 / span 2; background-color: rgb(230, 175, 210)'></div>
+<div class='gridItem' style='grid-area: 54 / 17 / span 2 / span 2; background-color: rgb(130, 98, 39)'></div>
+<div class='gridItem' style='grid-area: 54 / 18 / span 2 / span 2; background-color: rgb(185, 24, 146)'></div>
+<div class='gridItem' style='grid-area: 54 / 19 / span 2 / span 2; background-color: rgb(204, 205, 234)'></div>
+<div class='gridItem' style='grid-area: 54 / 20 / span 2 / span 2; background-color: rgb(224, 205, 82)'></div>
+<div class='gridItem' style='grid-area: 55 / 1 / span 2 / span 2; background-color: rgb(218, 236, 8)'></div>
+<div class='gridItem' style='grid-area: 55 / 2 / span 2 / span 2; background-color: rgb(118, 11, 82)'></div>
+<div class='gridItem' style='grid-area: 55 / 3 / span 2 / span 2; background-color: rgb(189, 121, 126)'></div>
+<div class='gridItem' style='grid-area: 55 / 4 / span 2 / span 2; background-color: rgb(107, 200, 40)'></div>
+<div class='gridItem' style='grid-area: 55 / 5 / span 2 / span 2; background-color: rgb(8, 194, 243)'></div>
+<div class='gridItem' style='grid-area: 55 / 6 / span 2 / span 2; background-color: rgb(114, 195, 232)'></div>
+<div class='gridItem' style='grid-area: 55 / 7 / span 2 / span 2; background-color: rgb(90, 52, 208)'></div>
+<div class='gridItem' style='grid-area: 55 / 8 / span 2 / span 2; background-color: rgb(115, 68, 56)'></div>
+<div class='gridItem' style='grid-area: 55 / 9 / span 2 / span 2; background-color: rgb(11, 242, 178)'></div>
+<div class='gridItem' style='grid-area: 55 / 10 / span 2 / span 2; background-color: rgb(58, 138, 161)'></div>
+<div class='gridItem' style='grid-area: 55 / 11 / span 2 / span 2; background-color: rgb(169, 22, 222)'></div>
+<div class='gridItem' style='grid-area: 55 / 12 / span 2 / span 2; background-color: rgb(62, 92, 77)'></div>
+<div class='gridItem' style='grid-area: 55 / 13 / span 2 / span 2; background-color: rgb(33, 43, 137)'></div>
+<div class='gridItem' style='grid-area: 55 / 14 / span 2 / span 2; background-color: rgb(126, 202, 48)'></div>
+<div class='gridItem' style='grid-area: 55 / 15 / span 2 / span 2; background-color: rgb(151, 5, 94)'></div>
+<div class='gridItem' style='grid-area: 55 / 16 / span 2 / span 2; background-color: rgb(49, 130, 189)'></div>
+<div class='gridItem' style='grid-area: 55 / 17 / span 2 / span 2; background-color: rgb(22, 110, 8)'></div>
+<div class='gridItem' style='grid-area: 55 / 18 / span 2 / span 2; background-color: rgb(168, 221, 227)'></div>
+<div class='gridItem' style='grid-area: 55 / 19 / span 2 / span 2; background-color: rgb(30, 36, 51)'></div>
+<div class='gridItem' style='grid-area: 55 / 20 / span 2 / span 2; background-color: rgb(63, 102, 98)'></div>
+<div class='gridItem' style='grid-area: 56 / 1 / span 2 / span 2; background-color: rgb(204, 98, 45)'></div>
+<div class='gridItem' style='grid-area: 56 / 2 / span 2 / span 2; background-color: rgb(89, 49, 170)'></div>
+<div class='gridItem' style='grid-area: 56 / 3 / span 2 / span 2; background-color: rgb(169, 169, 108)'></div>
+<div class='gridItem' style='grid-area: 56 / 4 / span 2 / span 2; background-color: rgb(212, 124, 243)'></div>
+<div class='gridItem' style='grid-area: 56 / 5 / span 2 / span 2; background-color: rgb(245, 118, 141)'></div>
+<div class='gridItem' style='grid-area: 56 / 6 / span 2 / span 2; background-color: rgb(69, 136, 3)'></div>
+<div class='gridItem' style='grid-area: 56 / 7 / span 2 / span 2; background-color: rgb(250, 99, 43)'></div>
+<div class='gridItem' style='grid-area: 56 / 8 / span 2 / span 2; background-color: rgb(154, 142, 55)'></div>
+<div class='gridItem' style='grid-area: 56 / 9 / span 2 / span 2; background-color: rgb(32, 23, 84)'></div>
+<div class='gridItem' style='grid-area: 56 / 10 / span 2 / span 2; background-color: rgb(87, 21, 233)'></div>
+<div class='gridItem' style='grid-area: 56 / 11 / span 2 / span 2; background-color: rgb(174, 145, 66)'></div>
+<div class='gridItem' style='grid-area: 56 / 12 / span 2 / span 2; background-color: rgb(153, 90, 179)'></div>
+<div class='gridItem' style='grid-area: 56 / 13 / span 2 / span 2; background-color: rgb(80, 11, 95)'></div>
+<div class='gridItem' style='grid-area: 56 / 14 / span 2 / span 2; background-color: rgb(33, 21, 47)'></div>
+<div class='gridItem' style='grid-area: 56 / 15 / span 2 / span 2; background-color: rgb(139, 233, 162)'></div>
+<div class='gridItem' style='grid-area: 56 / 16 / span 2 / span 2; background-color: rgb(150, 207, 84)'></div>
+<div class='gridItem' style='grid-area: 56 / 17 / span 2 / span 2; background-color: rgb(52, 170, 169)'></div>
+<div class='gridItem' style='grid-area: 56 / 18 / span 2 / span 2; background-color: rgb(90, 172, 97)'></div>
+<div class='gridItem' style='grid-area: 56 / 19 / span 2 / span 2; background-color: rgb(229, 18, 52)'></div>
+<div class='gridItem' style='grid-area: 56 / 20 / span 2 / span 2; background-color: rgb(155, 83, 69)'></div>
+<div class='gridItem' style='grid-area: 57 / 1 / span 2 / span 2; background-color: rgb(94, 235, 43)'></div>
+<div class='gridItem' style='grid-area: 57 / 2 / span 2 / span 2; background-color: rgb(0, 160, 157)'></div>
+<div class='gridItem' style='grid-area: 57 / 3 / span 2 / span 2; background-color: rgb(200, 98, 105)'></div>
+<div class='gridItem' style='grid-area: 57 / 4 / span 2 / span 2; background-color: rgb(47, 244, 58)'></div>
+<div class='gridItem' style='grid-area: 57 / 5 / span 2 / span 2; background-color: rgb(184, 229, 139)'></div>
+<div class='gridItem' style='grid-area: 57 / 6 / span 2 / span 2; background-color: rgb(28, 15, 138)'></div>
+<div class='gridItem' style='grid-area: 57 / 7 / span 2 / span 2; background-color: rgb(54, 243, 4)'></div>
+<div class='gridItem' style='grid-area: 57 / 8 / span 2 / span 2; background-color: rgb(105, 225, 236)'></div>
+<div class='gridItem' style='grid-area: 57 / 9 / span 2 / span 2; background-color: rgb(46, 168, 209)'></div>
+<div class='gridItem' style='grid-area: 57 / 10 / span 2 / span 2; background-color: rgb(78, 131, 196)'></div>
+<div class='gridItem' style='grid-area: 57 / 11 / span 2 / span 2; background-color: rgb(246, 200, 170)'></div>
+<div class='gridItem' style='grid-area: 57 / 12 / span 2 / span 2; background-color: rgb(252, 184, 111)'></div>
+<div class='gridItem' style='grid-area: 57 / 13 / span 2 / span 2; background-color: rgb(254, 95, 134)'></div>
+<div class='gridItem' style='grid-area: 57 / 14 / span 2 / span 2; background-color: rgb(81, 198, 197)'></div>
+<div class='gridItem' style='grid-area: 57 / 15 / span 2 / span 2; background-color: rgb(41, 37, 4)'></div>
+<div class='gridItem' style='grid-area: 57 / 16 / span 2 / span 2; background-color: rgb(205, 172, 176)'></div>
+<div class='gridItem' style='grid-area: 57 / 17 / span 2 / span 2; background-color: rgb(50, 120, 128)'></div>
+<div class='gridItem' style='grid-area: 57 / 18 / span 2 / span 2; background-color: rgb(145, 79, 91)'></div>
+<div class='gridItem' style='grid-area: 57 / 19 / span 2 / span 2; background-color: rgb(121, 90, 21)'></div>
+<div class='gridItem' style='grid-area: 57 / 20 / span 2 / span 2; background-color: rgb(155, 59, 69)'></div>
+<div class='gridItem' style='grid-area: 58 / 1 / span 2 / span 2; background-color: rgb(57, 53, 234)'></div>
+<div class='gridItem' style='grid-area: 58 / 2 / span 2 / span 2; background-color: rgb(61, 189, 135)'></div>
+<div class='gridItem' style='grid-area: 58 / 3 / span 2 / span 2; background-color: rgb(113, 254, 133)'></div>
+<div class='gridItem' style='grid-area: 58 / 4 / span 2 / span 2; background-color: rgb(133, 114, 84)'></div>
+<div class='gridItem' style='grid-area: 58 / 5 / span 2 / span 2; background-color: rgb(184, 94, 222)'></div>
+<div class='gridItem' style='grid-area: 58 / 6 / span 2 / span 2; background-color: rgb(96, 61, 187)'></div>
+<div class='gridItem' style='grid-area: 58 / 7 / span 2 / span 2; background-color: rgb(40, 231, 134)'></div>
+<div class='gridItem' style='grid-area: 58 / 8 / span 2 / span 2; background-color: rgb(193, 252, 213)'></div>
+<div class='gridItem' style='grid-area: 58 / 9 / span 2 / span 2; background-color: rgb(189, 248, 187)'></div>
+<div class='gridItem' style='grid-area: 58 / 10 / span 2 / span 2; background-color: rgb(37, 77, 172)'></div>
+<div class='gridItem' style='grid-area: 58 / 11 / span 2 / span 2; background-color: rgb(62, 129, 66)'></div>
+<div class='gridItem' style='grid-area: 58 / 12 / span 2 / span 2; background-color: rgb(120, 212, 6)'></div>
+<div class='gridItem' style='grid-area: 58 / 13 / span 2 / span 2; background-color: rgb(10, 7, 94)'></div>
+<div class='gridItem' style='grid-area: 58 / 14 / span 2 / span 2; background-color: rgb(254, 73, 170)'></div>
+<div class='gridItem' style='grid-area: 58 / 15 / span 2 / span 2; background-color: rgb(5, 87, 24)'></div>
+<div class='gridItem' style='grid-area: 58 / 16 / span 2 / span 2; background-color: rgb(235, 77, 233)'></div>
+<div class='gridItem' style='grid-area: 58 / 17 / span 2 / span 2; background-color: rgb(144, 55, 126)'></div>
+<div class='gridItem' style='grid-area: 58 / 18 / span 2 / span 2; background-color: rgb(100, 111, 62)'></div>
+<div class='gridItem' style='grid-area: 58 / 19 / span 2 / span 2; background-color: rgb(20, 77, 199)'></div>
+<div class='gridItem' style='grid-area: 58 / 20 / span 2 / span 2; background-color: rgb(91, 99, 171)'></div>
+<div class='gridItem' style='grid-area: 59 / 1 / span 2 / span 2; background-color: rgb(121, 36, 2)'></div>
+<div class='gridItem' style='grid-area: 59 / 2 / span 2 / span 2; background-color: rgb(175, 14, 211)'></div>
+<div class='gridItem' style='grid-area: 59 / 3 / span 2 / span 2; background-color: rgb(107, 149, 115)'></div>
+<div class='gridItem' style='grid-area: 59 / 4 / span 2 / span 2; background-color: rgb(247, 21, 185)'></div>
+<div class='gridItem' style='grid-area: 59 / 5 / span 2 / span 2; background-color: rgb(239, 122, 46)'></div>
+<div class='gridItem' style='grid-area: 59 / 6 / span 2 / span 2; background-color: rgb(73, 78, 120)'></div>
+<div class='gridItem' style='grid-area: 59 / 7 / span 2 / span 2; background-color: rgb(82, 7, 20)'></div>
+<div class='gridItem' style='grid-area: 59 / 8 / span 2 / span 2; background-color: rgb(242, 83, 135)'></div>
+<div class='gridItem' style='grid-area: 59 / 9 / span 2 / span 2; background-color: rgb(172, 190, 155)'></div>
+<div class='gridItem' style='grid-area: 59 / 10 / span 2 / span 2; background-color: rgb(73, 114, 223)'></div>
+<div class='gridItem' style='grid-area: 59 / 11 / span 2 / span 2; background-color: rgb(202, 181, 63)'></div>
+<div class='gridItem' style='grid-area: 59 / 12 / span 2 / span 2; background-color: rgb(199, 82, 8)'></div>
+<div class='gridItem' style='grid-area: 59 / 13 / span 2 / span 2; background-color: rgb(234, 39, 219)'></div>
+<div class='gridItem' style='grid-area: 59 / 14 / span 2 / span 2; background-color: rgb(113, 182, 225)'></div>
+<div class='gridItem' style='grid-area: 59 / 15 / span 2 / span 2; background-color: rgb(169, 201, 182)'></div>
+<div class='gridItem' style='grid-area: 59 / 16 / span 2 / span 2; background-color: rgb(236, 191, 32)'></div>
+<div class='gridItem' style='grid-area: 59 / 17 / span 2 / span 2; background-color: rgb(241, 69, 229)'></div>
+<div class='gridItem' style='grid-area: 59 / 18 / span 2 / span 2; background-color: rgb(179, 178, 242)'></div>
+<div class='gridItem' style='grid-area: 59 / 19 / span 2 / span 2; background-color: rgb(108, 239, 230)'></div>
+<div class='gridItem' style='grid-area: 59 / 20 / span 2 / span 2; background-color: rgb(204, 23, 190)'></div>
+<div class='gridItem' style='grid-area: 60 / 1 / span 2 / span 2; background-color: rgb(178, 157, 102)'></div>
+<div class='gridItem' style='grid-area: 60 / 2 / span 2 / span 2; background-color: rgb(7, 184, 214)'></div>
+<div class='gridItem' style='grid-area: 60 / 3 / span 2 / span 2; background-color: rgb(95, 151, 252)'></div>
+<div class='gridItem' style='grid-area: 60 / 4 / span 2 / span 2; background-color: rgb(46, 36, 57)'></div>
+<div class='gridItem' style='grid-area: 60 / 5 / span 2 / span 2; background-color: rgb(189, 190, 95)'></div>
+<div class='gridItem' style='grid-area: 60 / 6 / span 2 / span 2; background-color: rgb(69, 204, 143)'></div>
+<div class='gridItem' style='grid-area: 60 / 7 / span 2 / span 2; background-color: rgb(177, 126, 135)'></div>
+<div class='gridItem' style='grid-area: 60 / 8 / span 2 / span 2; background-color: rgb(18, 232, 235)'></div>
+<div class='gridItem' style='grid-area: 60 / 9 / span 2 / span 2; background-color: rgb(202, 138, 145)'></div>
+<div class='gridItem' style='grid-area: 60 / 10 / span 2 / span 2; background-color: rgb(72, 159, 139)'></div>
+<div class='gridItem' style='grid-area: 60 / 11 / span 2 / span 2; background-color: rgb(43, 76, 219)'></div>
+<div class='gridItem' style='grid-area: 60 / 12 / span 2 / span 2; background-color: rgb(99, 164, 4)'></div>
+<div class='gridItem' style='grid-area: 60 / 13 / span 2 / span 2; background-color: rgb(249, 71, 28)'></div>
+<div class='gridItem' style='grid-area: 60 / 14 / span 2 / span 2; background-color: rgb(102, 148, 196)'></div>
+<div class='gridItem' style='grid-area: 60 / 15 / span 2 / span 2; background-color: rgb(225, 209, 51)'></div>
+<div class='gridItem' style='grid-area: 60 / 16 / span 2 / span 2; background-color: rgb(43, 53, 20)'></div>
+<div class='gridItem' style='grid-area: 60 / 17 / span 2 / span 2; background-color: rgb(66, 53, 107)'></div>
+<div class='gridItem' style='grid-area: 60 / 18 / span 2 / span 2; background-color: rgb(4, 190, 236)'></div>
+<div class='gridItem' style='grid-area: 60 / 19 / span 2 / span 2; background-color: rgb(174, 176, 192)'></div>
+<div class='gridItem' style='grid-area: 60 / 20 / span 2 / span 2; background-color: rgb(103, 233, 146)'></div>
+<div class='gridItem' style='grid-area: 61 / 1 / span 2 / span 2; background-color: rgb(97, 140, 46)'></div>
+<div class='gridItem' style='grid-area: 61 / 2 / span 2 / span 2; background-color: rgb(165, 145, 62)'></div>
+<div class='gridItem' style='grid-area: 61 / 3 / span 2 / span 2; background-color: rgb(3, 60, 185)'></div>
+<div class='gridItem' style='grid-area: 61 / 4 / span 2 / span 2; background-color: rgb(236, 95, 80)'></div>
+<div class='gridItem' style='grid-area: 61 / 5 / span 2 / span 2; background-color: rgb(215, 184, 76)'></div>
+<div class='gridItem' style='grid-area: 61 / 6 / span 2 / span 2; background-color: rgb(190, 225, 196)'></div>
+<div class='gridItem' style='grid-area: 61 / 7 / span 2 / span 2; background-color: rgb(141, 128, 228)'></div>
+<div class='gridItem' style='grid-area: 61 / 8 / span 2 / span 2; background-color: rgb(137, 26, 106)'></div>
+<div class='gridItem' style='grid-area: 61 / 9 / span 2 / span 2; background-color: rgb(171, 64, 61)'></div>
+<div class='gridItem' style='grid-area: 61 / 10 / span 2 / span 2; background-color: rgb(219, 153, 220)'></div>
+<div class='gridItem' style='grid-area: 61 / 11 / span 2 / span 2; background-color: rgb(174, 144, 165)'></div>
+<div class='gridItem' style='grid-area: 61 / 12 / span 2 / span 2; background-color: rgb(123, 222, 21)'></div>
+<div class='gridItem' style='grid-area: 61 / 13 / span 2 / span 2; background-color: rgb(120, 251, 64)'></div>
+<div class='gridItem' style='grid-area: 61 / 14 / span 2 / span 2; background-color: rgb(62, 135, 242)'></div>
+<div class='gridItem' style='grid-area: 61 / 15 / span 2 / span 2; background-color: rgb(138, 208, 122)'></div>
+<div class='gridItem' style='grid-area: 61 / 16 / span 2 / span 2; background-color: rgb(186, 199, 215)'></div>
+<div class='gridItem' style='grid-area: 61 / 17 / span 2 / span 2; background-color: rgb(127, 95, 122)'></div>
+<div class='gridItem' style='grid-area: 61 / 18 / span 2 / span 2; background-color: rgb(222, 193, 176)'></div>
+<div class='gridItem' style='grid-area: 61 / 19 / span 2 / span 2; background-color: rgb(47, 63, 177)'></div>
+<div class='gridItem' style='grid-area: 61 / 20 / span 2 / span 2; background-color: rgb(221, 237, 51)'></div>
+<div class='gridItem' style='grid-area: 62 / 1 / span 2 / span 2; background-color: rgb(148, 12, 94)'></div>
+<div class='gridItem' style='grid-area: 62 / 2 / span 2 / span 2; background-color: rgb(173, 147, 40)'></div>
+<div class='gridItem' style='grid-area: 62 / 3 / span 2 / span 2; background-color: rgb(222, 135, 218)'></div>
+<div class='gridItem' style='grid-area: 62 / 4 / span 2 / span 2; background-color: rgb(73, 91, 119)'></div>
+<div class='gridItem' style='grid-area: 62 / 5 / span 2 / span 2; background-color: rgb(14, 86, 12)'></div>
+<div class='gridItem' style='grid-area: 62 / 6 / span 2 / span 2; background-color: rgb(46, 35, 58)'></div>
+<div class='gridItem' style='grid-area: 62 / 7 / span 2 / span 2; background-color: rgb(52, 109, 55)'></div>
+<div class='gridItem' style='grid-area: 62 / 8 / span 2 / span 2; background-color: rgb(92, 88, 11)'></div>
+<div class='gridItem' style='grid-area: 62 / 9 / span 2 / span 2; background-color: rgb(152, 94, 234)'></div>
+<div class='gridItem' style='grid-area: 62 / 10 / span 2 / span 2; background-color: rgb(148, 148, 245)'></div>
+<div class='gridItem' style='grid-area: 62 / 11 / span 2 / span 2; background-color: rgb(3, 166, 119)'></div>
+<div class='gridItem' style='grid-area: 62 / 12 / span 2 / span 2; background-color: rgb(215, 54, 181)'></div>
+<div class='gridItem' style='grid-area: 62 / 13 / span 2 / span 2; background-color: rgb(231, 90, 112)'></div>
+<div class='gridItem' style='grid-area: 62 / 14 / span 2 / span 2; background-color: rgb(54, 87, 128)'></div>
+<div class='gridItem' style='grid-area: 62 / 15 / span 2 / span 2; background-color: rgb(113, 129, 190)'></div>
+<div class='gridItem' style='grid-area: 62 / 16 / span 2 / span 2; background-color: rgb(165, 195, 79)'></div>
+<div class='gridItem' style='grid-area: 62 / 17 / span 2 / span 2; background-color: rgb(223, 84, 225)'></div>
+<div class='gridItem' style='grid-area: 62 / 18 / span 2 / span 2; background-color: rgb(205, 190, 220)'></div>
+<div class='gridItem' style='grid-area: 62 / 19 / span 2 / span 2; background-color: rgb(164, 178, 228)'></div>
+<div class='gridItem' style='grid-area: 62 / 20 / span 2 / span 2; background-color: rgb(243, 39, 48)'></div>
+<div class='gridItem' style='grid-area: 63 / 1 / span 2 / span 2; background-color: rgb(6, 11, 59)'></div>
+<div class='gridItem' style='grid-area: 63 / 2 / span 2 / span 2; background-color: rgb(48, 226, 215)'></div>
+<div class='gridItem' style='grid-area: 63 / 3 / span 2 / span 2; background-color: rgb(19, 34, 152)'></div>
+<div class='gridItem' style='grid-area: 63 / 4 / span 2 / span 2; background-color: rgb(179, 216, 20)'></div>
+<div class='gridItem' style='grid-area: 63 / 5 / span 2 / span 2; background-color: rgb(83, 239, 234)'></div>
+<div class='gridItem' style='grid-area: 63 / 6 / span 2 / span 2; background-color: rgb(1, 75, 128)'></div>
+<div class='gridItem' style='grid-area: 63 / 7 / span 2 / span 2; background-color: rgb(214, 215, 11)'></div>
+<div class='gridItem' style='grid-area: 63 / 8 / span 2 / span 2; background-color: rgb(178, 239, 240)'></div>
+<div class='gridItem' style='grid-area: 63 / 9 / span 2 / span 2; background-color: rgb(177, 156, 6)'></div>
+<div class='gridItem' style='grid-area: 63 / 10 / span 2 / span 2; background-color: rgb(114, 4, 159)'></div>
+<div class='gridItem' style='grid-area: 63 / 11 / span 2 / span 2; background-color: rgb(235, 5, 133)'></div>
+<div class='gridItem' style='grid-area: 63 / 12 / span 2 / span 2; background-color: rgb(127, 62, 9)'></div>
+<div class='gridItem' style='grid-area: 63 / 13 / span 2 / span 2; background-color: rgb(78, 126, 30)'></div>
+<div class='gridItem' style='grid-area: 63 / 14 / span 2 / span 2; background-color: rgb(239, 141, 47)'></div>
+<div class='gridItem' style='grid-area: 63 / 15 / span 2 / span 2; background-color: rgb(13, 73, 190)'></div>
+<div class='gridItem' style='grid-area: 63 / 16 / span 2 / span 2; background-color: rgb(197, 148, 213)'></div>
+<div class='gridItem' style='grid-area: 63 / 17 / span 2 / span 2; background-color: rgb(135, 90, 206)'></div>
+<div class='gridItem' style='grid-area: 63 / 18 / span 2 / span 2; background-color: rgb(100, 80, 217)'></div>
+<div class='gridItem' style='grid-area: 63 / 19 / span 2 / span 2; background-color: rgb(4, 202, 170)'></div>
+<div class='gridItem' style='grid-area: 63 / 20 / span 2 / span 2; background-color: rgb(239, 249, 110)'></div>
+<div class='gridItem' style='grid-area: 64 / 1 / span 2 / span 2; background-color: rgb(75, 11, 145)'></div>
+<div class='gridItem' style='grid-area: 64 / 2 / span 2 / span 2; background-color: rgb(75, 140, 214)'></div>
+<div class='gridItem' style='grid-area: 64 / 3 / span 2 / span 2; background-color: rgb(116, 238, 169)'></div>
+<div class='gridItem' style='grid-area: 64 / 4 / span 2 / span 2; background-color: rgb(106, 48, 76)'></div>
+<div class='gridItem' style='grid-area: 64 / 5 / span 2 / span 2; background-color: rgb(10, 178, 124)'></div>
+<div class='gridItem' style='grid-area: 64 / 6 / span 2 / span 2; background-color: rgb(76, 251, 54)'></div>
+<div class='gridItem' style='grid-area: 64 / 7 / span 2 / span 2; background-color: rgb(222, 188, 185)'></div>
+<div class='gridItem' style='grid-area: 64 / 8 / span 2 / span 2; background-color: rgb(81, 125, 224)'></div>
+<div class='gridItem' style='grid-area: 64 / 9 / span 2 / span 2; background-color: rgb(142, 82, 181)'></div>
+<div class='gridItem' style='grid-area: 64 / 10 / span 2 / span 2; background-color: rgb(74, 56, 26)'></div>
+<div class='gridItem' style='grid-area: 64 / 11 / span 2 / span 2; background-color: rgb(119, 56, 71)'></div>
+<div class='gridItem' style='grid-area: 64 / 12 / span 2 / span 2; background-color: rgb(97, 210, 197)'></div>
+<div class='gridItem' style='grid-area: 64 / 13 / span 2 / span 2; background-color: rgb(130, 168, 223)'></div>
+<div class='gridItem' style='grid-area: 64 / 14 / span 2 / span 2; background-color: rgb(183, 150, 45)'></div>
+<div class='gridItem' style='grid-area: 64 / 15 / span 2 / span 2; background-color: rgb(54, 253, 5)'></div>
+<div class='gridItem' style='grid-area: 64 / 16 / span 2 / span 2; background-color: rgb(1, 190, 170)'></div>
+<div class='gridItem' style='grid-area: 64 / 17 / span 2 / span 2; background-color: rgb(190, 3, 100)'></div>
+<div class='gridItem' style='grid-area: 64 / 18 / span 2 / span 2; background-color: rgb(92, 6, 74)'></div>
+<div class='gridItem' style='grid-area: 64 / 19 / span 2 / span 2; background-color: rgb(250, 132, 239)'></div>
+<div class='gridItem' style='grid-area: 64 / 20 / span 2 / span 2; background-color: rgb(17, 14, 106)'></div>
+<div class='gridItem' style='grid-area: 65 / 1 / span 2 / span 2; background-color: rgb(31, 89, 114)'></div>
+<div class='gridItem' style='grid-area: 65 / 2 / span 2 / span 2; background-color: rgb(69, 12, 16)'></div>
+<div class='gridItem' style='grid-area: 65 / 3 / span 2 / span 2; background-color: rgb(39, 21, 105)'></div>
+<div class='gridItem' style='grid-area: 65 / 4 / span 2 / span 2; background-color: rgb(81, 230, 200)'></div>
+<div class='gridItem' style='grid-area: 65 / 5 / span 2 / span 2; background-color: rgb(168, 156, 174)'></div>
+<div class='gridItem' style='grid-area: 65 / 6 / span 2 / span 2; background-color: rgb(161, 248, 1)'></div>
+<div class='gridItem' style='grid-area: 65 / 7 / span 2 / span 2; background-color: rgb(54, 110, 128)'></div>
+<div class='gridItem' style='grid-area: 65 / 8 / span 2 / span 2; background-color: rgb(231, 14, 75)'></div>
+<div class='gridItem' style='grid-area: 65 / 9 / span 2 / span 2; background-color: rgb(16, 77, 44)'></div>
+<div class='gridItem' style='grid-area: 65 / 10 / span 2 / span 2; background-color: rgb(88, 74, 125)'></div>
+<div class='gridItem' style='grid-area: 65 / 11 / span 2 / span 2; background-color: rgb(136, 33, 156)'></div>
+<div class='gridItem' style='grid-area: 65 / 12 / span 2 / span 2; background-color: rgb(46, 36, 0)'></div>
+<div class='gridItem' style='grid-area: 65 / 13 / span 2 / span 2; background-color: rgb(239, 77, 254)'></div>
+<div class='gridItem' style='grid-area: 65 / 14 / span 2 / span 2; background-color: rgb(183, 94, 246)'></div>
+<div class='gridItem' style='grid-area: 65 / 15 / span 2 / span 2; background-color: rgb(67, 122, 7)'></div>
+<div class='gridItem' style='grid-area: 65 / 16 / span 2 / span 2; background-color: rgb(182, 28, 14)'></div>
+<div class='gridItem' style='grid-area: 65 / 17 / span 2 / span 2; background-color: rgb(12, 119, 69)'></div>
+<div class='gridItem' style='grid-area: 65 / 18 / span 2 / span 2; background-color: rgb(108, 143, 20)'></div>
+<div class='gridItem' style='grid-area: 65 / 19 / span 2 / span 2; background-color: rgb(68, 141, 250)'></div>
+<div class='gridItem' style='grid-area: 65 / 20 / span 2 / span 2; background-color: rgb(188, 204, 215)'></div>
+<div class='gridItem' style='grid-area: 66 / 1 / span 2 / span 2; background-color: rgb(227, 104, 53)'></div>
+<div class='gridItem' style='grid-area: 66 / 2 / span 2 / span 2; background-color: rgb(235, 248, 115)'></div>
+<div class='gridItem' style='grid-area: 66 / 3 / span 2 / span 2; background-color: rgb(200, 178, 232)'></div>
+<div class='gridItem' style='grid-area: 66 / 4 / span 2 / span 2; background-color: rgb(177, 177, 145)'></div>
+<div class='gridItem' style='grid-area: 66 / 5 / span 2 / span 2; background-color: rgb(115, 23, 243)'></div>
+<div class='gridItem' style='grid-area: 66 / 6 / span 2 / span 2; background-color: rgb(175, 226, 91)'></div>
+<div class='gridItem' style='grid-area: 66 / 7 / span 2 / span 2; background-color: rgb(185, 207, 170)'></div>
+<div class='gridItem' style='grid-area: 66 / 8 / span 2 / span 2; background-color: rgb(205, 101, 12)'></div>
+<div class='gridItem' style='grid-area: 66 / 9 / span 2 / span 2; background-color: rgb(58, 212, 177)'></div>
+<div class='gridItem' style='grid-area: 66 / 10 / span 2 / span 2; background-color: rgb(207, 145, 201)'></div>
+<div class='gridItem' style='grid-area: 66 / 11 / span 2 / span 2; background-color: rgb(243, 236, 89)'></div>
+<div class='gridItem' style='grid-area: 66 / 12 / span 2 / span 2; background-color: rgb(146, 13, 151)'></div>
+<div class='gridItem' style='grid-area: 66 / 13 / span 2 / span 2; background-color: rgb(63, 248, 0)'></div>
+<div class='gridItem' style='grid-area: 66 / 14 / span 2 / span 2; background-color: rgb(199, 141, 8)'></div>
+<div class='gridItem' style='grid-area: 66 / 15 / span 2 / span 2; background-color: rgb(89, 22, 183)'></div>
+<div class='gridItem' style='grid-area: 66 / 16 / span 2 / span 2; background-color: rgb(135, 156, 110)'></div>
+<div class='gridItem' style='grid-area: 66 / 17 / span 2 / span 2; background-color: rgb(250, 243, 234)'></div>
+<div class='gridItem' style='grid-area: 66 / 18 / span 2 / span 2; background-color: rgb(20, 94, 181)'></div>
+<div class='gridItem' style='grid-area: 66 / 19 / span 2 / span 2; background-color: rgb(55, 172, 58)'></div>
+<div class='gridItem' style='grid-area: 66 / 20 / span 2 / span 2; background-color: rgb(234, 30, 214)'></div>
+<div class='gridItem' style='grid-area: 67 / 1 / span 2 / span 2; background-color: rgb(201, 210, 184)'></div>
+<div class='gridItem' style='grid-area: 67 / 2 / span 2 / span 2; background-color: rgb(208, 72, 24)'></div>
+<div class='gridItem' style='grid-area: 67 / 3 / span 2 / span 2; background-color: rgb(172, 116, 182)'></div>
+<div class='gridItem' style='grid-area: 67 / 4 / span 2 / span 2; background-color: rgb(19, 197, 57)'></div>
+<div class='gridItem' style='grid-area: 67 / 5 / span 2 / span 2; background-color: rgb(73, 208, 145)'></div>
+<div class='gridItem' style='grid-area: 67 / 6 / span 2 / span 2; background-color: rgb(165, 244, 186)'></div>
+<div class='gridItem' style='grid-area: 67 / 7 / span 2 / span 2; background-color: rgb(215, 66, 110)'></div>
+<div class='gridItem' style='grid-area: 67 / 8 / span 2 / span 2; background-color: rgb(178, 194, 64)'></div>
+<div class='gridItem' style='grid-area: 67 / 9 / span 2 / span 2; background-color: rgb(6, 195, 71)'></div>
+<div class='gridItem' style='grid-area: 67 / 10 / span 2 / span 2; background-color: rgb(3, 76, 189)'></div>
+<div class='gridItem' style='grid-area: 67 / 11 / span 2 / span 2; background-color: rgb(71, 92, 85)'></div>
+<div class='gridItem' style='grid-area: 67 / 12 / span 2 / span 2; background-color: rgb(209, 230, 204)'></div>
+<div class='gridItem' style='grid-area: 67 / 13 / span 2 / span 2; background-color: rgb(105, 103, 207)'></div>
+<div class='gridItem' style='grid-area: 67 / 14 / span 2 / span 2; background-color: rgb(160, 200, 109)'></div>
+<div class='gridItem' style='grid-area: 67 / 15 / span 2 / span 2; background-color: rgb(178, 92, 209)'></div>
+<div class='gridItem' style='grid-area: 67 / 16 / span 2 / span 2; background-color: rgb(232, 151, 147)'></div>
+<div class='gridItem' style='grid-area: 67 / 17 / span 2 / span 2; background-color: rgb(124, 35, 11)'></div>
+<div class='gridItem' style='grid-area: 67 / 18 / span 2 / span 2; background-color: rgb(118, 227, 213)'></div>
+<div class='gridItem' style='grid-area: 67 / 19 / span 2 / span 2; background-color: rgb(219, 224, 250)'></div>
+<div class='gridItem' style='grid-area: 67 / 20 / span 2 / span 2; background-color: rgb(211, 168, 245)'></div>
+<div class='gridItem' style='grid-area: 68 / 1 / span 2 / span 2; background-color: rgb(1, 41, 196)'></div>
+<div class='gridItem' style='grid-area: 68 / 2 / span 2 / span 2; background-color: rgb(45, 184, 46)'></div>
+<div class='gridItem' style='grid-area: 68 / 3 / span 2 / span 2; background-color: rgb(67, 228, 128)'></div>
+<div class='gridItem' style='grid-area: 68 / 4 / span 2 / span 2; background-color: rgb(100, 78, 147)'></div>
+<div class='gridItem' style='grid-area: 68 / 5 / span 2 / span 2; background-color: rgb(148, 170, 218)'></div>
+<div class='gridItem' style='grid-area: 68 / 6 / span 2 / span 2; background-color: rgb(31, 25, 35)'></div>
+<div class='gridItem' style='grid-area: 68 / 7 / span 2 / span 2; background-color: rgb(68, 240, 171)'></div>
+<div class='gridItem' style='grid-area: 68 / 8 / span 2 / span 2; background-color: rgb(19, 42, 57)'></div>
+<div class='gridItem' style='grid-area: 68 / 9 / span 2 / span 2; background-color: rgb(60, 100, 75)'></div>
+<div class='gridItem' style='grid-area: 68 / 10 / span 2 / span 2; background-color: rgb(22, 149, 7)'></div>
+<div class='gridItem' style='grid-area: 68 / 11 / span 2 / span 2; background-color: rgb(100, 14, 5)'></div>
+<div class='gridItem' style='grid-area: 68 / 12 / span 2 / span 2; background-color: rgb(51, 24, 159)'></div>
+<div class='gridItem' style='grid-area: 68 / 13 / span 2 / span 2; background-color: rgb(180, 146, 15)'></div>
+<div class='gridItem' style='grid-area: 68 / 14 / span 2 / span 2; background-color: rgb(55, 243, 197)'></div>
+<div class='gridItem' style='grid-area: 68 / 15 / span 2 / span 2; background-color: rgb(239, 239, 27)'></div>
+<div class='gridItem' style='grid-area: 68 / 16 / span 2 / span 2; background-color: rgb(115, 201, 151)'></div>
+<div class='gridItem' style='grid-area: 68 / 17 / span 2 / span 2; background-color: rgb(240, 221, 142)'></div>
+<div class='gridItem' style='grid-area: 68 / 18 / span 2 / span 2; background-color: rgb(179, 162, 43)'></div>
+<div class='gridItem' style='grid-area: 68 / 19 / span 2 / span 2; background-color: rgb(123, 253, 149)'></div>
+<div class='gridItem' style='grid-area: 68 / 20 / span 2 / span 2; background-color: rgb(223, 149, 194)'></div>
+<div class='gridItem' style='grid-area: 69 / 1 / span 2 / span 2; background-color: rgb(164, 167, 170)'></div>
+<div class='gridItem' style='grid-area: 69 / 2 / span 2 / span 2; background-color: rgb(6, 65, 15)'></div>
+<div class='gridItem' style='grid-area: 69 / 3 / span 2 / span 2; background-color: rgb(188, 174, 131)'></div>
+<div class='gridItem' style='grid-area: 69 / 4 / span 2 / span 2; background-color: rgb(168, 84, 74)'></div>
+<div class='gridItem' style='grid-area: 69 / 5 / span 2 / span 2; background-color: rgb(239, 20, 176)'></div>
+<div class='gridItem' style='grid-area: 69 / 6 / span 2 / span 2; background-color: rgb(199, 19, 244)'></div>
+<div class='gridItem' style='grid-area: 69 / 7 / span 2 / span 2; background-color: rgb(206, 51, 134)'></div>
+<div class='gridItem' style='grid-area: 69 / 8 / span 2 / span 2; background-color: rgb(109, 184, 150)'></div>
+<div class='gridItem' style='grid-area: 69 / 9 / span 2 / span 2; background-color: rgb(217, 59, 253)'></div>
+<div class='gridItem' style='grid-area: 69 / 10 / span 2 / span 2; background-color: rgb(172, 225, 16)'></div>
+<div class='gridItem' style='grid-area: 69 / 11 / span 2 / span 2; background-color: rgb(142, 89, 186)'></div>
+<div class='gridItem' style='grid-area: 69 / 12 / span 2 / span 2; background-color: rgb(135, 195, 104)'></div>
+<div class='gridItem' style='grid-area: 69 / 13 / span 2 / span 2; background-color: rgb(239, 128, 183)'></div>
+<div class='gridItem' style='grid-area: 69 / 14 / span 2 / span 2; background-color: rgb(191, 180, 145)'></div>
+<div class='gridItem' style='grid-area: 69 / 15 / span 2 / span 2; background-color: rgb(18, 130, 16)'></div>
+<div class='gridItem' style='grid-area: 69 / 16 / span 2 / span 2; background-color: rgb(83, 131, 251)'></div>
+<div class='gridItem' style='grid-area: 69 / 17 / span 2 / span 2; background-color: rgb(142, 176, 239)'></div>
+<div class='gridItem' style='grid-area: 69 / 18 / span 2 / span 2; background-color: rgb(26, 228, 229)'></div>
+<div class='gridItem' style='grid-area: 69 / 19 / span 2 / span 2; background-color: rgb(138, 250, 181)'></div>
+<div class='gridItem' style='grid-area: 69 / 20 / span 2 / span 2; background-color: rgb(51, 227, 238)'></div>
+<div class='gridItem' style='grid-area: 70 / 1 / span 2 / span 2; background-color: rgb(61, 155, 246)'></div>
+<div class='gridItem' style='grid-area: 70 / 2 / span 2 / span 2; background-color: rgb(123, 95, 242)'></div>
+<div class='gridItem' style='grid-area: 70 / 3 / span 2 / span 2; background-color: rgb(41, 198, 214)'></div>
+<div class='gridItem' style='grid-area: 70 / 4 / span 2 / span 2; background-color: rgb(210, 63, 108)'></div>
+<div class='gridItem' style='grid-area: 70 / 5 / span 2 / span 2; background-color: rgb(129, 191, 198)'></div>
+<div class='gridItem' style='grid-area: 70 / 6 / span 2 / span 2; background-color: rgb(26, 198, 188)'></div>
+<div class='gridItem' style='grid-area: 70 / 7 / span 2 / span 2; background-color: rgb(222, 210, 237)'></div>
+<div class='gridItem' style='grid-area: 70 / 8 / span 2 / span 2; background-color: rgb(94, 245, 228)'></div>
+<div class='gridItem' style='grid-area: 70 / 9 / span 2 / span 2; background-color: rgb(52, 208, 167)'></div>
+<div class='gridItem' style='grid-area: 70 / 10 / span 2 / span 2; background-color: rgb(197, 143, 52)'></div>
+<div class='gridItem' style='grid-area: 70 / 11 / span 2 / span 2; background-color: rgb(199, 66, 212)'></div>
+<div class='gridItem' style='grid-area: 70 / 12 / span 2 / span 2; background-color: rgb(137, 44, 72)'></div>
+<div class='gridItem' style='grid-area: 70 / 13 / span 2 / span 2; background-color: rgb(209, 148, 200)'></div>
+<div class='gridItem' style='grid-area: 70 / 14 / span 2 / span 2; background-color: rgb(109, 87, 175)'></div>
+<div class='gridItem' style='grid-area: 70 / 15 / span 2 / span 2; background-color: rgb(177, 150, 137)'></div>
+<div class='gridItem' style='grid-area: 70 / 16 / span 2 / span 2; background-color: rgb(27, 127, 243)'></div>
+<div class='gridItem' style='grid-area: 70 / 17 / span 2 / span 2; background-color: rgb(27, 70, 42)'></div>
+<div class='gridItem' style='grid-area: 70 / 18 / span 2 / span 2; background-color: rgb(6, 163, 26)'></div>
+<div class='gridItem' style='grid-area: 70 / 19 / span 2 / span 2; background-color: rgb(212, 217, 131)'></div>
+<div class='gridItem' style='grid-area: 70 / 20 / span 2 / span 2; background-color: rgb(227, 68, 193)'></div>
+<div class='gridItem' style='grid-area: 71 / 1 / span 2 / span 2; background-color: rgb(194, 1, 87)'></div>
+<div class='gridItem' style='grid-area: 71 / 2 / span 2 / span 2; background-color: rgb(27, 144, 35)'></div>
+<div class='gridItem' style='grid-area: 71 / 3 / span 2 / span 2; background-color: rgb(138, 104, 120)'></div>
+<div class='gridItem' style='grid-area: 71 / 4 / span 2 / span 2; background-color: rgb(32, 64, 162)'></div>
+<div class='gridItem' style='grid-area: 71 / 5 / span 2 / span 2; background-color: rgb(110, 96, 21)'></div>
+<div class='gridItem' style='grid-area: 71 / 6 / span 2 / span 2; background-color: rgb(25, 69, 62)'></div>
+<div class='gridItem' style='grid-area: 71 / 7 / span 2 / span 2; background-color: rgb(242, 223, 119)'></div>
+<div class='gridItem' style='grid-area: 71 / 8 / span 2 / span 2; background-color: rgb(67, 114, 173)'></div>
+<div class='gridItem' style='grid-area: 71 / 9 / span 2 / span 2; background-color: rgb(198, 147, 242)'></div>
+<div class='gridItem' style='grid-area: 71 / 10 / span 2 / span 2; background-color: rgb(52, 35, 238)'></div>
+<div class='gridItem' style='grid-area: 71 / 11 / span 2 / span 2; background-color: rgb(9, 169, 244)'></div>
+<div class='gridItem' style='grid-area: 71 / 12 / span 2 / span 2; background-color: rgb(250, 98, 169)'></div>
+<div class='gridItem' style='grid-area: 71 / 13 / span 2 / span 2; background-color: rgb(112, 57, 70)'></div>
+<div class='gridItem' style='grid-area: 71 / 14 / span 2 / span 2; background-color: rgb(248, 181, 56)'></div>
+<div class='gridItem' style='grid-area: 71 / 15 / span 2 / span 2; background-color: rgb(233, 167, 200)'></div>
+<div class='gridItem' style='grid-area: 71 / 16 / span 2 / span 2; background-color: rgb(113, 70, 116)'></div>
+<div class='gridItem' style='grid-area: 71 / 17 / span 2 / span 2; background-color: rgb(154, 52, 168)'></div>
+<div class='gridItem' style='grid-area: 71 / 18 / span 2 / span 2; background-color: rgb(8, 224, 48)'></div>
+<div class='gridItem' style='grid-area: 71 / 19 / span 2 / span 2; background-color: rgb(93, 32, 91)'></div>
+<div class='gridItem' style='grid-area: 71 / 20 / span 2 / span 2; background-color: rgb(120, 233, 252)'></div>
+<div class='gridItem' style='grid-area: 72 / 1 / span 2 / span 2; background-color: rgb(57, 201, 57)'></div>
+<div class='gridItem' style='grid-area: 72 / 2 / span 2 / span 2; background-color: rgb(16, 248, 84)'></div>
+<div class='gridItem' style='grid-area: 72 / 3 / span 2 / span 2; background-color: rgb(91, 123, 129)'></div>
+<div class='gridItem' style='grid-area: 72 / 4 / span 2 / span 2; background-color: rgb(22, 60, 122)'></div>
+<div class='gridItem' style='grid-area: 72 / 5 / span 2 / span 2; background-color: rgb(55, 121, 206)'></div>
+<div class='gridItem' style='grid-area: 72 / 6 / span 2 / span 2; background-color: rgb(87, 190, 70)'></div>
+<div class='gridItem' style='grid-area: 72 / 7 / span 2 / span 2; background-color: rgb(52, 15, 86)'></div>
+<div class='gridItem' style='grid-area: 72 / 8 / span 2 / span 2; background-color: rgb(94, 45, 27)'></div>
+<div class='gridItem' style='grid-area: 72 / 9 / span 2 / span 2; background-color: rgb(135, 212, 254)'></div>
+<div class='gridItem' style='grid-area: 72 / 10 / span 2 / span 2; background-color: rgb(106, 247, 94)'></div>
+<div class='gridItem' style='grid-area: 72 / 11 / span 2 / span 2; background-color: rgb(71, 173, 2)'></div>
+<div class='gridItem' style='grid-area: 72 / 12 / span 2 / span 2; background-color: rgb(175, 33, 66)'></div>
+<div class='gridItem' style='grid-area: 72 / 13 / span 2 / span 2; background-color: rgb(96, 62, 166)'></div>
+<div class='gridItem' style='grid-area: 72 / 14 / span 2 / span 2; background-color: rgb(134, 122, 254)'></div>
+<div class='gridItem' style='grid-area: 72 / 15 / span 2 / span 2; background-color: rgb(58, 145, 198)'></div>
+<div class='gridItem' style='grid-area: 72 / 16 / span 2 / span 2; background-color: rgb(109, 247, 248)'></div>
+<div class='gridItem' style='grid-area: 72 / 17 / span 2 / span 2; background-color: rgb(9, 105, 166)'></div>
+<div class='gridItem' style='grid-area: 72 / 18 / span 2 / span 2; background-color: rgb(24, 144, 114)'></div>
+<div class='gridItem' style='grid-area: 72 / 19 / span 2 / span 2; background-color: rgb(146, 195, 118)'></div>
+<div class='gridItem' style='grid-area: 72 / 20 / span 2 / span 2; background-color: rgb(155, 128, 166)'></div>
+<div class='gridItem' style='grid-area: 73 / 1 / span 2 / span 2; background-color: rgb(88, 9, 248)'></div>
+<div class='gridItem' style='grid-area: 73 / 2 / span 2 / span 2; background-color: rgb(171, 6, 203)'></div>
+<div class='gridItem' style='grid-area: 73 / 3 / span 2 / span 2; background-color: rgb(249, 203, 214)'></div>
+<div class='gridItem' style='grid-area: 73 / 4 / span 2 / span 2; background-color: rgb(79, 218, 70)'></div>
+<div class='gridItem' style='grid-area: 73 / 5 / span 2 / span 2; background-color: rgb(79, 15, 42)'></div>
+<div class='gridItem' style='grid-area: 73 / 6 / span 2 / span 2; background-color: rgb(191, 127, 6)'></div>
+<div class='gridItem' style='grid-area: 73 / 7 / span 2 / span 2; background-color: rgb(39, 104, 189)'></div>
+<div class='gridItem' style='grid-area: 73 / 8 / span 2 / span 2; background-color: rgb(119, 104, 20)'></div>
+<div class='gridItem' style='grid-area: 73 / 9 / span 2 / span 2; background-color: rgb(190, 60, 54)'></div>
+<div class='gridItem' style='grid-area: 73 / 10 / span 2 / span 2; background-color: rgb(169, 104, 143)'></div>
+<div class='gridItem' style='grid-area: 73 / 11 / span 2 / span 2; background-color: rgb(223, 253, 132)'></div>
+<div class='gridItem' style='grid-area: 73 / 12 / span 2 / span 2; background-color: rgb(90, 232, 145)'></div>
+<div class='gridItem' style='grid-area: 73 / 13 / span 2 / span 2; background-color: rgb(225, 155, 195)'></div>
+<div class='gridItem' style='grid-area: 73 / 14 / span 2 / span 2; background-color: rgb(207, 107, 69)'></div>
+<div class='gridItem' style='grid-area: 73 / 15 / span 2 / span 2; background-color: rgb(3, 117, 181)'></div>
+<div class='gridItem' style='grid-area: 73 / 16 / span 2 / span 2; background-color: rgb(254, 78, 155)'></div>
+<div class='gridItem' style='grid-area: 73 / 17 / span 2 / span 2; background-color: rgb(120, 127, 135)'></div>
+<div class='gridItem' style='grid-area: 73 / 18 / span 2 / span 2; background-color: rgb(21, 73, 93)'></div>
+<div class='gridItem' style='grid-area: 73 / 19 / span 2 / span 2; background-color: rgb(11, 18, 187)'></div>
+<div class='gridItem' style='grid-area: 73 / 20 / span 2 / span 2; background-color: rgb(193, 87, 106)'></div>
+<div class='gridItem' style='grid-area: 74 / 1 / span 2 / span 2; background-color: rgb(44, 250, 1)'></div>
+<div class='gridItem' style='grid-area: 74 / 2 / span 2 / span 2; background-color: rgb(95, 62, 41)'></div>
+<div class='gridItem' style='grid-area: 74 / 3 / span 2 / span 2; background-color: rgb(179, 123, 94)'></div>
+<div class='gridItem' style='grid-area: 74 / 4 / span 2 / span 2; background-color: rgb(101, 159, 51)'></div>
+<div class='gridItem' style='grid-area: 74 / 5 / span 2 / span 2; background-color: rgb(219, 189, 177)'></div>
+<div class='gridItem' style='grid-area: 74 / 6 / span 2 / span 2; background-color: rgb(57, 188, 62)'></div>
+<div class='gridItem' style='grid-area: 74 / 7 / span 2 / span 2; background-color: rgb(4, 74, 111)'></div>
+<div class='gridItem' style='grid-area: 74 / 8 / span 2 / span 2; background-color: rgb(203, 51, 123)'></div>
+<div class='gridItem' style='grid-area: 74 / 9 / span 2 / span 2; background-color: rgb(165, 116, 117)'></div>
+<div class='gridItem' style='grid-area: 74 / 10 / span 2 / span 2; background-color: rgb(121, 163, 157)'></div>
+<div class='gridItem' style='grid-area: 74 / 11 / span 2 / span 2; background-color: rgb(223, 35, 49)'></div>
+<div class='gridItem' style='grid-area: 74 / 12 / span 2 / span 2; background-color: rgb(151, 47, 162)'></div>
+<div class='gridItem' style='grid-area: 74 / 13 / span 2 / span 2; background-color: rgb(117, 21, 246)'></div>
+<div class='gridItem' style='grid-area: 74 / 14 / span 2 / span 2; background-color: rgb(165, 36, 249)'></div>
+<div class='gridItem' style='grid-area: 74 / 15 / span 2 / span 2; background-color: rgb(243, 249, 243)'></div>
+<div class='gridItem' style='grid-area: 74 / 16 / span 2 / span 2; background-color: rgb(159, 155, 172)'></div>
+<div class='gridItem' style='grid-area: 74 / 17 / span 2 / span 2; background-color: rgb(146, 233, 143)'></div>
+<div class='gridItem' style='grid-area: 74 / 18 / span 2 / span 2; background-color: rgb(250, 179, 95)'></div>
+<div class='gridItem' style='grid-area: 74 / 19 / span 2 / span 2; background-color: rgb(29, 53, 16)'></div>
+<div class='gridItem' style='grid-area: 74 / 20 / span 2 / span 2; background-color: rgb(167, 225, 2)'></div>
+<div class='gridItem' style='grid-area: 75 / 1 / span 2 / span 2; background-color: rgb(236, 142, 247)'></div>
+<div class='gridItem' style='grid-area: 75 / 2 / span 2 / span 2; background-color: rgb(176, 122, 49)'></div>
+<div class='gridItem' style='grid-area: 75 / 3 / span 2 / span 2; background-color: rgb(123, 200, 217)'></div>
+<div class='gridItem' style='grid-area: 75 / 4 / span 2 / span 2; background-color: rgb(65, 26, 165)'></div>
+<div class='gridItem' style='grid-area: 75 / 5 / span 2 / span 2; background-color: rgb(238, 150, 192)'></div>
+<div class='gridItem' style='grid-area: 75 / 6 / span 2 / span 2; background-color: rgb(41, 188, 114)'></div>
+<div class='gridItem' style='grid-area: 75 / 7 / span 2 / span 2; background-color: rgb(229, 86, 237)'></div>
+<div class='gridItem' style='grid-area: 75 / 8 / span 2 / span 2; background-color: rgb(39, 23, 234)'></div>
+<div class='gridItem' style='grid-area: 75 / 9 / span 2 / span 2; background-color: rgb(206, 19, 186)'></div>
+<div class='gridItem' style='grid-area: 75 / 10 / span 2 / span 2; background-color: rgb(246, 251, 116)'></div>
+<div class='gridItem' style='grid-area: 75 / 11 / span 2 / span 2; background-color: rgb(219, 89, 92)'></div>
+<div class='gridItem' style='grid-area: 75 / 12 / span 2 / span 2; background-color: rgb(150, 166, 250)'></div>
+<div class='gridItem' style='grid-area: 75 / 13 / span 2 / span 2; background-color: rgb(87, 201, 199)'></div>
+<div class='gridItem' style='grid-area: 75 / 14 / span 2 / span 2; background-color: rgb(158, 43, 155)'></div>
+<div class='gridItem' style='grid-area: 75 / 15 / span 2 / span 2; background-color: rgb(178, 214, 84)'></div>
+<div class='gridItem' style='grid-area: 75 / 16 / span 2 / span 2; background-color: rgb(159, 46, 154)'></div>
+<div class='gridItem' style='grid-area: 75 / 17 / span 2 / span 2; background-color: rgb(174, 142, 99)'></div>
+<div class='gridItem' style='grid-area: 75 / 18 / span 2 / span 2; background-color: rgb(69, 77, 55)'></div>
+<div class='gridItem' style='grid-area: 75 / 19 / span 2 / span 2; background-color: rgb(100, 164, 115)'></div>
+<div class='gridItem' style='grid-area: 75 / 20 / span 2 / span 2; background-color: rgb(211, 1, 249)'></div>
+<div class='gridItem' style='grid-area: 76 / 1 / span 2 / span 2; background-color: rgb(72, 242, 176)'></div>
+<div class='gridItem' style='grid-area: 76 / 2 / span 2 / span 2; background-color: rgb(2, 246, 36)'></div>
+<div class='gridItem' style='grid-area: 76 / 3 / span 2 / span 2; background-color: rgb(151, 118, 139)'></div>
+<div class='gridItem' style='grid-area: 76 / 4 / span 2 / span 2; background-color: rgb(216, 161, 250)'></div>
+<div class='gridItem' style='grid-area: 76 / 5 / span 2 / span 2; background-color: rgb(173, 240, 90)'></div>
+<div class='gridItem' style='grid-area: 76 / 6 / span 2 / span 2; background-color: rgb(59, 124, 223)'></div>
+<div class='gridItem' style='grid-area: 76 / 7 / span 2 / span 2; background-color: rgb(187, 44, 196)'></div>
+<div class='gridItem' style='grid-area: 76 / 8 / span 2 / span 2; background-color: rgb(172, 59, 49)'></div>
+<div class='gridItem' style='grid-area: 76 / 9 / span 2 / span 2; background-color: rgb(125, 20, 104)'></div>
+<div class='gridItem' style='grid-area: 76 / 10 / span 2 / span 2; background-color: rgb(130, 251, 143)'></div>
+<div class='gridItem' style='grid-area: 76 / 11 / span 2 / span 2; background-color: rgb(60, 9, 13)'></div>
+<div class='gridItem' style='grid-area: 76 / 12 / span 2 / span 2; background-color: rgb(29, 157, 107)'></div>
+<div class='gridItem' style='grid-area: 76 / 13 / span 2 / span 2; background-color: rgb(109, 66, 148)'></div>
+<div class='gridItem' style='grid-area: 76 / 14 / span 2 / span 2; background-color: rgb(157, 62, 81)'></div>
+<div class='gridItem' style='grid-area: 76 / 15 / span 2 / span 2; background-color: rgb(9, 177, 121)'></div>
+<div class='gridItem' style='grid-area: 76 / 16 / span 2 / span 2; background-color: rgb(67, 75, 130)'></div>
+<div class='gridItem' style='grid-area: 76 / 17 / span 2 / span 2; background-color: rgb(114, 49, 11)'></div>
+<div class='gridItem' style='grid-area: 76 / 18 / span 2 / span 2; background-color: rgb(24, 118, 105)'></div>
+<div class='gridItem' style='grid-area: 76 / 19 / span 2 / span 2; background-color: rgb(243, 66, 233)'></div>
+<div class='gridItem' style='grid-area: 76 / 20 / span 2 / span 2; background-color: rgb(100, 81, 223)'></div>
+<div class='gridItem' style='grid-area: 77 / 1 / span 2 / span 2; background-color: rgb(226, 179, 197)'></div>
+<div class='gridItem' style='grid-area: 77 / 2 / span 2 / span 2; background-color: rgb(11, 200, 236)'></div>
+<div class='gridItem' style='grid-area: 77 / 3 / span 2 / span 2; background-color: rgb(223, 96, 10)'></div>
+<div class='gridItem' style='grid-area: 77 / 4 / span 2 / span 2; background-color: rgb(140, 168, 109)'></div>
+<div class='gridItem' style='grid-area: 77 / 5 / span 2 / span 2; background-color: rgb(228, 58, 118)'></div>
+<div class='gridItem' style='grid-area: 77 / 6 / span 2 / span 2; background-color: rgb(66, 196, 194)'></div>
+<div class='gridItem' style='grid-area: 77 / 7 / span 2 / span 2; background-color: rgb(118, 185, 240)'></div>
+<div class='gridItem' style='grid-area: 77 / 8 / span 2 / span 2; background-color: rgb(25, 224, 218)'></div>
+<div class='gridItem' style='grid-area: 77 / 9 / span 2 / span 2; background-color: rgb(187, 170, 178)'></div>
+<div class='gridItem' style='grid-area: 77 / 10 / span 2 / span 2; background-color: rgb(80, 211, 29)'></div>
+<div class='gridItem' style='grid-area: 77 / 11 / span 2 / span 2; background-color: rgb(78, 94, 125)'></div>
+<div class='gridItem' style='grid-area: 77 / 12 / span 2 / span 2; background-color: rgb(24, 36, 133)'></div>
+<div class='gridItem' style='grid-area: 77 / 13 / span 2 / span 2; background-color: rgb(241, 73, 140)'></div>
+<div class='gridItem' style='grid-area: 77 / 14 / span 2 / span 2; background-color: rgb(126, 59, 171)'></div>
+<div class='gridItem' style='grid-area: 77 / 15 / span 2 / span 2; background-color: rgb(46, 101, 143)'></div>
+<div class='gridItem' style='grid-area: 77 / 16 / span 2 / span 2; background-color: rgb(59, 111, 123)'></div>
+<div class='gridItem' style='grid-area: 77 / 17 / span 2 / span 2; background-color: rgb(58, 29, 249)'></div>
+<div class='gridItem' style='grid-area: 77 / 18 / span 2 / span 2; background-color: rgb(144, 79, 87)'></div>
+<div class='gridItem' style='grid-area: 77 / 19 / span 2 / span 2; background-color: rgb(65, 233, 121)'></div>
+<div class='gridItem' style='grid-area: 77 / 20 / span 2 / span 2; background-color: rgb(208, 28, 248)'></div>
+<div class='gridItem' style='grid-area: 78 / 1 / span 2 / span 2; background-color: rgb(221, 165, 174)'></div>
+<div class='gridItem' style='grid-area: 78 / 2 / span 2 / span 2; background-color: rgb(6, 244, 214)'></div>
+<div class='gridItem' style='grid-area: 78 / 3 / span 2 / span 2; background-color: rgb(95, 122, 14)'></div>
+<div class='gridItem' style='grid-area: 78 / 4 / span 2 / span 2; background-color: rgb(82, 36, 91)'></div>
+<div class='gridItem' style='grid-area: 78 / 5 / span 2 / span 2; background-color: rgb(139, 111, 123)'></div>
+<div class='gridItem' style='grid-area: 78 / 6 / span 2 / span 2; background-color: rgb(140, 189, 210)'></div>
+<div class='gridItem' style='grid-area: 78 / 7 / span 2 / span 2; background-color: rgb(159, 225, 194)'></div>
+<div class='gridItem' style='grid-area: 78 / 8 / span 2 / span 2; background-color: rgb(216, 90, 168)'></div>
+<div class='gridItem' style='grid-area: 78 / 9 / span 2 / span 2; background-color: rgb(117, 248, 6)'></div>
+<div class='gridItem' style='grid-area: 78 / 10 / span 2 / span 2; background-color: rgb(19, 168, 167)'></div>
+<div class='gridItem' style='grid-area: 78 / 11 / span 2 / span 2; background-color: rgb(11, 56, 198)'></div>
+<div class='gridItem' style='grid-area: 78 / 12 / span 2 / span 2; background-color: rgb(21, 176, 5)'></div>
+<div class='gridItem' style='grid-area: 78 / 13 / span 2 / span 2; background-color: rgb(159, 240, 24)'></div>
+<div class='gridItem' style='grid-area: 78 / 14 / span 2 / span 2; background-color: rgb(112, 16, 190)'></div>
+<div class='gridItem' style='grid-area: 78 / 15 / span 2 / span 2; background-color: rgb(229, 65, 101)'></div>
+<div class='gridItem' style='grid-area: 78 / 16 / span 2 / span 2; background-color: rgb(13, 58, 145)'></div>
+<div class='gridItem' style='grid-area: 78 / 17 / span 2 / span 2; background-color: rgb(56, 99, 38)'></div>
+<div class='gridItem' style='grid-area: 78 / 18 / span 2 / span 2; background-color: rgb(97, 197, 123)'></div>
+<div class='gridItem' style='grid-area: 78 / 19 / span 2 / span 2; background-color: rgb(93, 116, 244)'></div>
+<div class='gridItem' style='grid-area: 78 / 20 / span 2 / span 2; background-color: rgb(199, 47, 249)'></div>
+<div class='gridItem' style='grid-area: 79 / 1 / span 2 / span 2; background-color: rgb(105, 25, 92)'></div>
+<div class='gridItem' style='grid-area: 79 / 2 / span 2 / span 2; background-color: rgb(164, 141, 147)'></div>
+<div class='gridItem' style='grid-area: 79 / 3 / span 2 / span 2; background-color: rgb(224, 18, 251)'></div>
+<div class='gridItem' style='grid-area: 79 / 4 / span 2 / span 2; background-color: rgb(212, 19, 138)'></div>
+<div class='gridItem' style='grid-area: 79 / 5 / span 2 / span 2; background-color: rgb(106, 164, 93)'></div>
+<div class='gridItem' style='grid-area: 79 / 6 / span 2 / span 2; background-color: rgb(221, 7, 172)'></div>
+<div class='gridItem' style='grid-area: 79 / 7 / span 2 / span 2; background-color: rgb(52, 96, 198)'></div>
+<div class='gridItem' style='grid-area: 79 / 8 / span 2 / span 2; background-color: rgb(219, 96, 72)'></div>
+<div class='gridItem' style='grid-area: 79 / 9 / span 2 / span 2; background-color: rgb(253, 20, 162)'></div>
+<div class='gridItem' style='grid-area: 79 / 10 / span 2 / span 2; background-color: rgb(49, 237, 191)'></div>
+<div class='gridItem' style='grid-area: 79 / 11 / span 2 / span 2; background-color: rgb(208, 23, 172)'></div>
+<div class='gridItem' style='grid-area: 79 / 12 / span 2 / span 2; background-color: rgb(242, 231, 223)'></div>
+<div class='gridItem' style='grid-area: 79 / 13 / span 2 / span 2; background-color: rgb(13, 221, 117)'></div>
+<div class='gridItem' style='grid-area: 79 / 14 / span 2 / span 2; background-color: rgb(188, 87, 134)'></div>
+<div class='gridItem' style='grid-area: 79 / 15 / span 2 / span 2; background-color: rgb(134, 224, 202)'></div>
+<div class='gridItem' style='grid-area: 79 / 16 / span 2 / span 2; background-color: rgb(181, 80, 52)'></div>
+<div class='gridItem' style='grid-area: 79 / 17 / span 2 / span 2; background-color: rgb(34, 59, 58)'></div>
+<div class='gridItem' style='grid-area: 79 / 18 / span 2 / span 2; background-color: rgb(162, 223, 52)'></div>
+<div class='gridItem' style='grid-area: 79 / 19 / span 2 / span 2; background-color: rgb(151, 65, 41)'></div>
+<div class='gridItem' style='grid-area: 79 / 20 / span 2 / span 2; background-color: rgb(145, 65, 38)'></div>
+<div class='gridItem' style='grid-area: 80 / 1 / span 2 / span 2; background-color: rgb(122, 230, 236)'></div>
+<div class='gridItem' style='grid-area: 80 / 2 / span 2 / span 2; background-color: rgb(215, 205, 171)'></div>
+<div class='gridItem' style='grid-area: 80 / 3 / span 2 / span 2; background-color: rgb(124, 165, 34)'></div>
+<div class='gridItem' style='grid-area: 80 / 4 / span 2 / span 2; background-color: rgb(238, 14, 118)'></div>
+<div class='gridItem' style='grid-area: 80 / 5 / span 2 / span 2; background-color: rgb(217, 143, 77)'></div>
+<div class='gridItem' style='grid-area: 80 / 6 / span 2 / span 2; background-color: rgb(137, 53, 68)'></div>
+<div class='gridItem' style='grid-area: 80 / 7 / span 2 / span 2; background-color: rgb(161, 5, 106)'></div>
+<div class='gridItem' style='grid-area: 80 / 8 / span 2 / span 2; background-color: rgb(26, 143, 254)'></div>
+<div class='gridItem' style='grid-area: 80 / 9 / span 2 / span 2; background-color: rgb(208, 132, 183)'></div>
+<div class='gridItem' style='grid-area: 80 / 10 / span 2 / span 2; background-color: rgb(143, 184, 236)'></div>
+<div class='gridItem' style='grid-area: 80 / 11 / span 2 / span 2; background-color: rgb(159, 155, 158)'></div>
+<div class='gridItem' style='grid-area: 80 / 12 / span 2 / span 2; background-color: rgb(60, 149, 64)'></div>
+<div class='gridItem' style='grid-area: 80 / 13 / span 2 / span 2; background-color: rgb(164, 63, 86)'></div>
+<div class='gridItem' style='grid-area: 80 / 14 / span 2 / span 2; background-color: rgb(133, 41, 153)'></div>
+<div class='gridItem' style='grid-area: 80 / 15 / span 2 / span 2; background-color: rgb(28, 6, 73)'></div>
+<div class='gridItem' style='grid-area: 80 / 16 / span 2 / span 2; background-color: rgb(159, 122, 70)'></div>
+<div class='gridItem' style='grid-area: 80 / 17 / span 2 / span 2; background-color: rgb(156, 13, 46)'></div>
+<div class='gridItem' style='grid-area: 80 / 18 / span 2 / span 2; background-color: rgb(109, 241, 239)'></div>
+<div class='gridItem' style='grid-area: 80 / 19 / span 2 / span 2; background-color: rgb(43, 160, 116)'></div>
+<div class='gridItem' style='grid-area: 80 / 20 / span 2 / span 2; background-color: rgb(6, 253, 131)'></div>
+<div class='gridItem' style='grid-area: 81 / 1 / span 2 / span 2; background-color: rgb(214, 100, 53)'></div>
+<div class='gridItem' style='grid-area: 81 / 2 / span 2 / span 2; background-color: rgb(41, 29, 88)'></div>
+<div class='gridItem' style='grid-area: 81 / 3 / span 2 / span 2; background-color: rgb(166, 79, 39)'></div>
+<div class='gridItem' style='grid-area: 81 / 4 / span 2 / span 2; background-color: rgb(217, 180, 40)'></div>
+<div class='gridItem' style='grid-area: 81 / 5 / span 2 / span 2; background-color: rgb(189, 242, 133)'></div>
+<div class='gridItem' style='grid-area: 81 / 6 / span 2 / span 2; background-color: rgb(4, 79, 199)'></div>
+<div class='gridItem' style='grid-area: 81 / 7 / span 2 / span 2; background-color: rgb(58, 171, 127)'></div>
+<div class='gridItem' style='grid-area: 81 / 8 / span 2 / span 2; background-color: rgb(110, 210, 23)'></div>
+<div class='gridItem' style='grid-area: 81 / 9 / span 2 / span 2; background-color: rgb(177, 78, 163)'></div>
+<div class='gridItem' style='grid-area: 81 / 10 / span 2 / span 2; background-color: rgb(72, 249, 202)'></div>
+<div class='gridItem' style='grid-area: 81 / 11 / span 2 / span 2; background-color: rgb(64, 169, 21)'></div>
+<div class='gridItem' style='grid-area: 81 / 12 / span 2 / span 2; background-color: rgb(60, 253, 92)'></div>
+<div class='gridItem' style='grid-area: 81 / 13 / span 2 / span 2; background-color: rgb(155, 49, 201)'></div>
+<div class='gridItem' style='grid-area: 81 / 14 / span 2 / span 2; background-color: rgb(97, 56, 166)'></div>
+<div class='gridItem' style='grid-area: 81 / 15 / span 2 / span 2; background-color: rgb(219, 189, 17)'></div>
+<div class='gridItem' style='grid-area: 81 / 16 / span 2 / span 2; background-color: rgb(70, 247, 245)'></div>
+<div class='gridItem' style='grid-area: 81 / 17 / span 2 / span 2; background-color: rgb(221, 64, 126)'></div>
+<div class='gridItem' style='grid-area: 81 / 18 / span 2 / span 2; background-color: rgb(50, 46, 226)'></div>
+<div class='gridItem' style='grid-area: 81 / 19 / span 2 / span 2; background-color: rgb(246, 109, 119)'></div>
+<div class='gridItem' style='grid-area: 81 / 20 / span 2 / span 2; background-color: rgb(37, 254, 160)'></div>
+<div class='gridItem' style='grid-area: 82 / 1 / span 2 / span 2; background-color: rgb(168, 205, 140)'></div>
+<div class='gridItem' style='grid-area: 82 / 2 / span 2 / span 2; background-color: rgb(180, 43, 198)'></div>
+<div class='gridItem' style='grid-area: 82 / 3 / span 2 / span 2; background-color: rgb(212, 203, 234)'></div>
+<div class='gridItem' style='grid-area: 82 / 4 / span 2 / span 2; background-color: rgb(45, 53, 164)'></div>
+<div class='gridItem' style='grid-area: 82 / 5 / span 2 / span 2; background-color: rgb(187, 16, 195)'></div>
+<div class='gridItem' style='grid-area: 82 / 6 / span 2 / span 2; background-color: rgb(242, 33, 199)'></div>
+<div class='gridItem' style='grid-area: 82 / 7 / span 2 / span 2; background-color: rgb(48, 254, 25)'></div>
+<div class='gridItem' style='grid-area: 82 / 8 / span 2 / span 2; background-color: rgb(129, 180, 5)'></div>
+<div class='gridItem' style='grid-area: 82 / 9 / span 2 / span 2; background-color: rgb(70, 64, 182)'></div>
+<div class='gridItem' style='grid-area: 82 / 10 / span 2 / span 2; background-color: rgb(67, 142, 35)'></div>
+<div class='gridItem' style='grid-area: 82 / 11 / span 2 / span 2; background-color: rgb(225, 57, 26)'></div>
+<div class='gridItem' style='grid-area: 82 / 12 / span 2 / span 2; background-color: rgb(225, 30, 222)'></div>
+<div class='gridItem' style='grid-area: 82 / 13 / span 2 / span 2; background-color: rgb(118, 47, 173)'></div>
+<div class='gridItem' style='grid-area: 82 / 14 / span 2 / span 2; background-color: rgb(203, 203, 202)'></div>
+<div class='gridItem' style='grid-area: 82 / 15 / span 2 / span 2; background-color: rgb(76, 187, 43)'></div>
+<div class='gridItem' style='grid-area: 82 / 16 / span 2 / span 2; background-color: rgb(231, 243, 243)'></div>
+<div class='gridItem' style='grid-area: 82 / 17 / span 2 / span 2; background-color: rgb(236, 74, 14)'></div>
+<div class='gridItem' style='grid-area: 82 / 18 / span 2 / span 2; background-color: rgb(196, 176, 75)'></div>
+<div class='gridItem' style='grid-area: 82 / 19 / span 2 / span 2; background-color: rgb(59, 223, 50)'></div>
+<div class='gridItem' style='grid-area: 82 / 20 / span 2 / span 2; background-color: rgb(247, 175, 158)'></div>
+<div class='gridItem' style='grid-area: 83 / 1 / span 2 / span 2; background-color: rgb(54, 7, 18)'></div>
+<div class='gridItem' style='grid-area: 83 / 2 / span 2 / span 2; background-color: rgb(166, 99, 62)'></div>
+<div class='gridItem' style='grid-area: 83 / 3 / span 2 / span 2; background-color: rgb(62, 200, 40)'></div>
+<div class='gridItem' style='grid-area: 83 / 4 / span 2 / span 2; background-color: rgb(128, 13, 248)'></div>
+<div class='gridItem' style='grid-area: 83 / 5 / span 2 / span 2; background-color: rgb(99, 43, 73)'></div>
+<div class='gridItem' style='grid-area: 83 / 6 / span 2 / span 2; background-color: rgb(226, 213, 27)'></div>
+<div class='gridItem' style='grid-area: 83 / 7 / span 2 / span 2; background-color: rgb(221, 157, 109)'></div>
+<div class='gridItem' style='grid-area: 83 / 8 / span 2 / span 2; background-color: rgb(179, 156, 130)'></div>
+<div class='gridItem' style='grid-area: 83 / 9 / span 2 / span 2; background-color: rgb(23, 38, 26)'></div>
+<div class='gridItem' style='grid-area: 83 / 10 / span 2 / span 2; background-color: rgb(76, 231, 235)'></div>
+<div class='gridItem' style='grid-area: 83 / 11 / span 2 / span 2; background-color: rgb(68, 94, 39)'></div>
+<div class='gridItem' style='grid-area: 83 / 12 / span 2 / span 2; background-color: rgb(219, 3, 91)'></div>
+<div class='gridItem' style='grid-area: 83 / 13 / span 2 / span 2; background-color: rgb(168, 69, 224)'></div>
+<div class='gridItem' style='grid-area: 83 / 14 / span 2 / span 2; background-color: rgb(93, 63, 176)'></div>
+<div class='gridItem' style='grid-area: 83 / 15 / span 2 / span 2; background-color: rgb(106, 0, 69)'></div>
+<div class='gridItem' style='grid-area: 83 / 16 / span 2 / span 2; background-color: rgb(102, 178, 174)'></div>
+<div class='gridItem' style='grid-area: 83 / 17 / span 2 / span 2; background-color: rgb(94, 138, 72)'></div>
+<div class='gridItem' style='grid-area: 83 / 18 / span 2 / span 2; background-color: rgb(75, 76, 147)'></div>
+<div class='gridItem' style='grid-area: 83 / 19 / span 2 / span 2; background-color: rgb(162, 81, 245)'></div>
+<div class='gridItem' style='grid-area: 83 / 20 / span 2 / span 2; background-color: rgb(104, 98, 21)'></div>
+<div class='gridItem' style='grid-area: 84 / 1 / span 2 / span 2; background-color: rgb(180, 68, 209)'></div>
+<div class='gridItem' style='grid-area: 84 / 2 / span 2 / span 2; background-color: rgb(201, 242, 243)'></div>
+<div class='gridItem' style='grid-area: 84 / 3 / span 2 / span 2; background-color: rgb(185, 236, 114)'></div>
+<div class='gridItem' style='grid-area: 84 / 4 / span 2 / span 2; background-color: rgb(215, 8, 76)'></div>
+<div class='gridItem' style='grid-area: 84 / 5 / span 2 / span 2; background-color: rgb(248, 148, 144)'></div>
+<div class='gridItem' style='grid-area: 84 / 6 / span 2 / span 2; background-color: rgb(148, 140, 45)'></div>
+<div class='gridItem' style='grid-area: 84 / 7 / span 2 / span 2; background-color: rgb(210, 26, 158)'></div>
+<div class='gridItem' style='grid-area: 84 / 8 / span 2 / span 2; background-color: rgb(189, 127, 85)'></div>
+<div class='gridItem' style='grid-area: 84 / 9 / span 2 / span 2; background-color: rgb(105, 145, 44)'></div>
+<div class='gridItem' style='grid-area: 84 / 10 / span 2 / span 2; background-color: rgb(163, 251, 154)'></div>
+<div class='gridItem' style='grid-area: 84 / 11 / span 2 / span 2; background-color: rgb(78, 107, 160)'></div>
+<div class='gridItem' style='grid-area: 84 / 12 / span 2 / span 2; background-color: rgb(52, 40, 34)'></div>
+<div class='gridItem' style='grid-area: 84 / 13 / span 2 / span 2; background-color: rgb(255, 233, 108)'></div>
+<div class='gridItem' style='grid-area: 84 / 14 / span 2 / span 2; background-color: rgb(217, 202, 122)'></div>
+<div class='gridItem' style='grid-area: 84 / 15 / span 2 / span 2; background-color: rgb(12, 24, 169)'></div>
+<div class='gridItem' style='grid-area: 84 / 16 / span 2 / span 2; background-color: rgb(191, 7, 134)'></div>
+<div class='gridItem' style='grid-area: 84 / 17 / span 2 / span 2; background-color: rgb(208, 108, 7)'></div>
+<div class='gridItem' style='grid-area: 84 / 18 / span 2 / span 2; background-color: rgb(172, 195, 12)'></div>
+<div class='gridItem' style='grid-area: 84 / 19 / span 2 / span 2; background-color: rgb(244, 82, 88)'></div>
+<div class='gridItem' style='grid-area: 84 / 20 / span 2 / span 2; background-color: rgb(163, 211, 167)'></div>
+<div class='gridItem' style='grid-area: 85 / 1 / span 2 / span 2; background-color: rgb(146, 37, 221)'></div>
+<div class='gridItem' style='grid-area: 85 / 2 / span 2 / span 2; background-color: rgb(103, 13, 171)'></div>
+<div class='gridItem' style='grid-area: 85 / 3 / span 2 / span 2; background-color: rgb(43, 226, 192)'></div>
+<div class='gridItem' style='grid-area: 85 / 4 / span 2 / span 2; background-color: rgb(252, 32, 8)'></div>
+<div class='gridItem' style='grid-area: 85 / 5 / span 2 / span 2; background-color: rgb(170, 84, 181)'></div>
+<div class='gridItem' style='grid-area: 85 / 6 / span 2 / span 2; background-color: rgb(74, 7, 79)'></div>
+<div class='gridItem' style='grid-area: 85 / 7 / span 2 / span 2; background-color: rgb(62, 78, 69)'></div>
+<div class='gridItem' style='grid-area: 85 / 8 / span 2 / span 2; background-color: rgb(163, 161, 64)'></div>
+<div class='gridItem' style='grid-area: 85 / 9 / span 2 / span 2; background-color: rgb(127, 112, 95)'></div>
+<div class='gridItem' style='grid-area: 85 / 10 / span 2 / span 2; background-color: rgb(157, 76, 92)'></div>
+<div class='gridItem' style='grid-area: 85 / 11 / span 2 / span 2; background-color: rgb(208, 43, 106)'></div>
+<div class='gridItem' style='grid-area: 85 / 12 / span 2 / span 2; background-color: rgb(255, 186, 134)'></div>
+<div class='gridItem' style='grid-area: 85 / 13 / span 2 / span 2; background-color: rgb(121, 43, 246)'></div>
+<div class='gridItem' style='grid-area: 85 / 14 / span 2 / span 2; background-color: rgb(167, 125, 209)'></div>
+<div class='gridItem' style='grid-area: 85 / 15 / span 2 / span 2; background-color: rgb(8, 28, 122)'></div>
+<div class='gridItem' style='grid-area: 85 / 16 / span 2 / span 2; background-color: rgb(149, 36, 47)'></div>
+<div class='gridItem' style='grid-area: 85 / 17 / span 2 / span 2; background-color: rgb(190, 222, 212)'></div>
+<div class='gridItem' style='grid-area: 85 / 18 / span 2 / span 2; background-color: rgb(82, 110, 16)'></div>
+<div class='gridItem' style='grid-area: 85 / 19 / span 2 / span 2; background-color: rgb(245, 236, 163)'></div>
+<div class='gridItem' style='grid-area: 85 / 20 / span 2 / span 2; background-color: rgb(108, 168, 88)'></div>
+<div class='gridItem' style='grid-area: 86 / 1 / span 2 / span 2; background-color: rgb(65, 195, 118)'></div>
+<div class='gridItem' style='grid-area: 86 / 2 / span 2 / span 2; background-color: rgb(177, 225, 208)'></div>
+<div class='gridItem' style='grid-area: 86 / 3 / span 2 / span 2; background-color: rgb(84, 179, 249)'></div>
+<div class='gridItem' style='grid-area: 86 / 4 / span 2 / span 2; background-color: rgb(244, 107, 191)'></div>
+<div class='gridItem' style='grid-area: 86 / 5 / span 2 / span 2; background-color: rgb(145, 241, 158)'></div>
+<div class='gridItem' style='grid-area: 86 / 6 / span 2 / span 2; background-color: rgb(184, 94, 12)'></div>
+<div class='gridItem' style='grid-area: 86 / 7 / span 2 / span 2; background-color: rgb(167, 104, 204)'></div>
+<div class='gridItem' style='grid-area: 86 / 8 / span 2 / span 2; background-color: rgb(8, 42, 73)'></div>
+<div class='gridItem' style='grid-area: 86 / 9 / span 2 / span 2; background-color: rgb(207, 32, 180)'></div>
+<div class='gridItem' style='grid-area: 86 / 10 / span 2 / span 2; background-color: rgb(54, 212, 119)'></div>
+<div class='gridItem' style='grid-area: 86 / 11 / span 2 / span 2; background-color: rgb(95, 32, 116)'></div>
+<div class='gridItem' style='grid-area: 86 / 12 / span 2 / span 2; background-color: rgb(157, 207, 169)'></div>
+<div class='gridItem' style='grid-area: 86 / 13 / span 2 / span 2; background-color: rgb(62, 107, 200)'></div>
+<div class='gridItem' style='grid-area: 86 / 14 / span 2 / span 2; background-color: rgb(35, 71, 179)'></div>
+<div class='gridItem' style='grid-area: 86 / 15 / span 2 / span 2; background-color: rgb(55, 173, 81)'></div>
+<div class='gridItem' style='grid-area: 86 / 16 / span 2 / span 2; background-color: rgb(162, 130, 245)'></div>
+<div class='gridItem' style='grid-area: 86 / 17 / span 2 / span 2; background-color: rgb(43, 182, 4)'></div>
+<div class='gridItem' style='grid-area: 86 / 18 / span 2 / span 2; background-color: rgb(57, 159, 121)'></div>
+<div class='gridItem' style='grid-area: 86 / 19 / span 2 / span 2; background-color: rgb(101, 70, 225)'></div>
+<div class='gridItem' style='grid-area: 86 / 20 / span 2 / span 2; background-color: rgb(58, 160, 142)'></div>
+<div class='gridItem' style='grid-area: 87 / 1 / span 2 / span 2; background-color: rgb(233, 136, 184)'></div>
+<div class='gridItem' style='grid-area: 87 / 2 / span 2 / span 2; background-color: rgb(248, 22, 65)'></div>
+<div class='gridItem' style='grid-area: 87 / 3 / span 2 / span 2; background-color: rgb(92, 251, 149)'></div>
+<div class='gridItem' style='grid-area: 87 / 4 / span 2 / span 2; background-color: rgb(156, 142, 96)'></div>
+<div class='gridItem' style='grid-area: 87 / 5 / span 2 / span 2; background-color: rgb(113, 145, 20)'></div>
+<div class='gridItem' style='grid-area: 87 / 6 / span 2 / span 2; background-color: rgb(249, 183, 94)'></div>
+<div class='gridItem' style='grid-area: 87 / 7 / span 2 / span 2; background-color: rgb(12, 213, 22)'></div>
+<div class='gridItem' style='grid-area: 87 / 8 / span 2 / span 2; background-color: rgb(83, 133, 152)'></div>
+<div class='gridItem' style='grid-area: 87 / 9 / span 2 / span 2; background-color: rgb(34, 19, 169)'></div>
+<div class='gridItem' style='grid-area: 87 / 10 / span 2 / span 2; background-color: rgb(126, 133, 97)'></div>
+<div class='gridItem' style='grid-area: 87 / 11 / span 2 / span 2; background-color: rgb(39, 5, 61)'></div>
+<div class='gridItem' style='grid-area: 87 / 12 / span 2 / span 2; background-color: rgb(115, 149, 91)'></div>
+<div class='gridItem' style='grid-area: 87 / 13 / span 2 / span 2; background-color: rgb(95, 204, 251)'></div>
+<div class='gridItem' style='grid-area: 87 / 14 / span 2 / span 2; background-color: rgb(157, 143, 99)'></div>
+<div class='gridItem' style='grid-area: 87 / 15 / span 2 / span 2; background-color: rgb(2, 117, 170)'></div>
+<div class='gridItem' style='grid-area: 87 / 16 / span 2 / span 2; background-color: rgb(108, 60, 90)'></div>
+<div class='gridItem' style='grid-area: 87 / 17 / span 2 / span 2; background-color: rgb(166, 178, 165)'></div>
+<div class='gridItem' style='grid-area: 87 / 18 / span 2 / span 2; background-color: rgb(86, 208, 13)'></div>
+<div class='gridItem' style='grid-area: 87 / 19 / span 2 / span 2; background-color: rgb(9, 149, 54)'></div>
+<div class='gridItem' style='grid-area: 87 / 20 / span 2 / span 2; background-color: rgb(41, 223, 131)'></div>
+<div class='gridItem' style='grid-area: 88 / 1 / span 2 / span 2; background-color: rgb(217, 32, 77)'></div>
+<div class='gridItem' style='grid-area: 88 / 2 / span 2 / span 2; background-color: rgb(231, 165, 131)'></div>
+<div class='gridItem' style='grid-area: 88 / 3 / span 2 / span 2; background-color: rgb(249, 87, 107)'></div>
+<div class='gridItem' style='grid-area: 88 / 4 / span 2 / span 2; background-color: rgb(226, 185, 248)'></div>
+<div class='gridItem' style='grid-area: 88 / 5 / span 2 / span 2; background-color: rgb(70, 124, 34)'></div>
+<div class='gridItem' style='grid-area: 88 / 6 / span 2 / span 2; background-color: rgb(230, 104, 152)'></div>
+<div class='gridItem' style='grid-area: 88 / 7 / span 2 / span 2; background-color: rgb(75, 68, 90)'></div>
+<div class='gridItem' style='grid-area: 88 / 8 / span 2 / span 2; background-color: rgb(246, 16, 110)'></div>
+<div class='gridItem' style='grid-area: 88 / 9 / span 2 / span 2; background-color: rgb(16, 226, 97)'></div>
+<div class='gridItem' style='grid-area: 88 / 10 / span 2 / span 2; background-color: rgb(216, 89, 70)'></div>
+<div class='gridItem' style='grid-area: 88 / 11 / span 2 / span 2; background-color: rgb(178, 127, 169)'></div>
+<div class='gridItem' style='grid-area: 88 / 12 / span 2 / span 2; background-color: rgb(225, 217, 82)'></div>
+<div class='gridItem' style='grid-area: 88 / 13 / span 2 / span 2; background-color: rgb(74, 135, 174)'></div>
+<div class='gridItem' style='grid-area: 88 / 14 / span 2 / span 2; background-color: rgb(163, 189, 24)'></div>
+<div class='gridItem' style='grid-area: 88 / 15 / span 2 / span 2; background-color: rgb(54, 78, 232)'></div>
+<div class='gridItem' style='grid-area: 88 / 16 / span 2 / span 2; background-color: rgb(136, 93, 152)'></div>
+<div class='gridItem' style='grid-area: 88 / 17 / span 2 / span 2; background-color: rgb(100, 25, 169)'></div>
+<div class='gridItem' style='grid-area: 88 / 18 / span 2 / span 2; background-color: rgb(196, 166, 157)'></div>
+<div class='gridItem' style='grid-area: 88 / 19 / span 2 / span 2; background-color: rgb(150, 104, 155)'></div>
+<div class='gridItem' style='grid-area: 88 / 20 / span 2 / span 2; background-color: rgb(170, 67, 152)'></div>
+<div class='gridItem' style='grid-area: 89 / 1 / span 2 / span 2; background-color: rgb(244, 76, 54)'></div>
+<div class='gridItem' style='grid-area: 89 / 2 / span 2 / span 2; background-color: rgb(110, 78, 165)'></div>
+<div class='gridItem' style='grid-area: 89 / 3 / span 2 / span 2; background-color: rgb(185, 12, 202)'></div>
+<div class='gridItem' style='grid-area: 89 / 4 / span 2 / span 2; background-color: rgb(96, 199, 134)'></div>
+<div class='gridItem' style='grid-area: 89 / 5 / span 2 / span 2; background-color: rgb(180, 34, 138)'></div>
+<div class='gridItem' style='grid-area: 89 / 6 / span 2 / span 2; background-color: rgb(143, 196, 58)'></div>
+<div class='gridItem' style='grid-area: 89 / 7 / span 2 / span 2; background-color: rgb(236, 187, 180)'></div>
+<div class='gridItem' style='grid-area: 89 / 8 / span 2 / span 2; background-color: rgb(35, 51, 37)'></div>
+<div class='gridItem' style='grid-area: 89 / 9 / span 2 / span 2; background-color: rgb(54, 157, 251)'></div>
+<div class='gridItem' style='grid-area: 89 / 10 / span 2 / span 2; background-color: rgb(3, 253, 253)'></div>
+<div class='gridItem' style='grid-area: 89 / 11 / span 2 / span 2; background-color: rgb(209, 31, 91)'></div>
+<div class='gridItem' style='grid-area: 89 / 12 / span 2 / span 2; background-color: rgb(114, 62, 194)'></div>
+<div class='gridItem' style='grid-area: 89 / 13 / span 2 / span 2; background-color: rgb(7, 209, 235)'></div>
+<div class='gridItem' style='grid-area: 89 / 14 / span 2 / span 2; background-color: rgb(18, 59, 2)'></div>
+<div class='gridItem' style='grid-area: 89 / 15 / span 2 / span 2; background-color: rgb(248, 140, 217)'></div>
+<div class='gridItem' style='grid-area: 89 / 16 / span 2 / span 2; background-color: rgb(118, 65, 206)'></div>
+<div class='gridItem' style='grid-area: 89 / 17 / span 2 / span 2; background-color: rgb(142, 123, 106)'></div>
+<div class='gridItem' style='grid-area: 89 / 18 / span 2 / span 2; background-color: rgb(178, 234, 159)'></div>
+<div class='gridItem' style='grid-area: 89 / 19 / span 2 / span 2; background-color: rgb(65, 133, 25)'></div>
+<div class='gridItem' style='grid-area: 89 / 20 / span 2 / span 2; background-color: rgb(10, 55, 148)'></div>
+<div class='gridItem' style='grid-area: 90 / 1 / span 2 / span 2; background-color: rgb(63, 55, 29)'></div>
+<div class='gridItem' style='grid-area: 90 / 2 / span 2 / span 2; background-color: rgb(115, 177, 187)'></div>
+<div class='gridItem' style='grid-area: 90 / 3 / span 2 / span 2; background-color: rgb(67, 96, 122)'></div>
+<div class='gridItem' style='grid-area: 90 / 4 / span 2 / span 2; background-color: rgb(221, 20, 106)'></div>
+<div class='gridItem' style='grid-area: 90 / 5 / span 2 / span 2; background-color: rgb(218, 64, 80)'></div>
+<div class='gridItem' style='grid-area: 90 / 6 / span 2 / span 2; background-color: rgb(87, 157, 112)'></div>
+<div class='gridItem' style='grid-area: 90 / 7 / span 2 / span 2; background-color: rgb(213, 182, 247)'></div>
+<div class='gridItem' style='grid-area: 90 / 8 / span 2 / span 2; background-color: rgb(86, 145, 114)'></div>
+<div class='gridItem' style='grid-area: 90 / 9 / span 2 / span 2; background-color: rgb(175, 107, 144)'></div>
+<div class='gridItem' style='grid-area: 90 / 10 / span 2 / span 2; background-color: rgb(149, 152, 171)'></div>
+<div class='gridItem' style='grid-area: 90 / 11 / span 2 / span 2; background-color: rgb(2, 148, 13)'></div>
+<div class='gridItem' style='grid-area: 90 / 12 / span 2 / span 2; background-color: rgb(131, 120, 220)'></div>
+<div class='gridItem' style='grid-area: 90 / 13 / span 2 / span 2; background-color: rgb(106, 202, 56)'></div>
+<div class='gridItem' style='grid-area: 90 / 14 / span 2 / span 2; background-color: rgb(167, 242, 72)'></div>
+<div class='gridItem' style='grid-area: 90 / 15 / span 2 / span 2; background-color: rgb(0, 97, 123)'></div>
+<div class='gridItem' style='grid-area: 90 / 16 / span 2 / span 2; background-color: rgb(97, 125, 202)'></div>
+<div class='gridItem' style='grid-area: 90 / 17 / span 2 / span 2; background-color: rgb(91, 116, 187)'></div>
+<div class='gridItem' style='grid-area: 90 / 18 / span 2 / span 2; background-color: rgb(205, 33, 6)'></div>
+<div class='gridItem' style='grid-area: 90 / 19 / span 2 / span 2; background-color: rgb(117, 144, 214)'></div>
+<div class='gridItem' style='grid-area: 90 / 20 / span 2 / span 2; background-color: rgb(149, 23, 222)'></div>
+<div class='gridItem' style='grid-area: 91 / 1 / span 2 / span 2; background-color: rgb(223, 94, 207)'></div>
+<div class='gridItem' style='grid-area: 91 / 2 / span 2 / span 2; background-color: rgb(143, 178, 166)'></div>
+<div class='gridItem' style='grid-area: 91 / 3 / span 2 / span 2; background-color: rgb(163, 49, 90)'></div>
+<div class='gridItem' style='grid-area: 91 / 4 / span 2 / span 2; background-color: rgb(11, 98, 247)'></div>
+<div class='gridItem' style='grid-area: 91 / 5 / span 2 / span 2; background-color: rgb(93, 206, 214)'></div>
+<div class='gridItem' style='grid-area: 91 / 6 / span 2 / span 2; background-color: rgb(38, 198, 136)'></div>
+<div class='gridItem' style='grid-area: 91 / 7 / span 2 / span 2; background-color: rgb(20, 109, 155)'></div>
+<div class='gridItem' style='grid-area: 91 / 8 / span 2 / span 2; background-color: rgb(104, 69, 61)'></div>
+<div class='gridItem' style='grid-area: 91 / 9 / span 2 / span 2; background-color: rgb(207, 254, 108)'></div>
+<div class='gridItem' style='grid-area: 91 / 10 / span 2 / span 2; background-color: rgb(3, 104, 199)'></div>
+<div class='gridItem' style='grid-area: 91 / 11 / span 2 / span 2; background-color: rgb(133, 91, 129)'></div>
+<div class='gridItem' style='grid-area: 91 / 12 / span 2 / span 2; background-color: rgb(243, 195, 111)'></div>
+<div class='gridItem' style='grid-area: 91 / 13 / span 2 / span 2; background-color: rgb(33, 66, 70)'></div>
+<div class='gridItem' style='grid-area: 91 / 14 / span 2 / span 2; background-color: rgb(67, 75, 118)'></div>
+<div class='gridItem' style='grid-area: 91 / 15 / span 2 / span 2; background-color: rgb(224, 171, 131)'></div>
+<div class='gridItem' style='grid-area: 91 / 16 / span 2 / span 2; background-color: rgb(94, 244, 196)'></div>
+<div class='gridItem' style='grid-area: 91 / 17 / span 2 / span 2; background-color: rgb(100, 51, 30)'></div>
+<div class='gridItem' style='grid-area: 91 / 18 / span 2 / span 2; background-color: rgb(70, 243, 46)'></div>
+<div class='gridItem' style='grid-area: 91 / 19 / span 2 / span 2; background-color: rgb(156, 21, 170)'></div>
+<div class='gridItem' style='grid-area: 91 / 20 / span 2 / span 2; background-color: rgb(76, 97, 153)'></div>
+<div class='gridItem' style='grid-area: 92 / 1 / span 2 / span 2; background-color: rgb(225, 95, 129)'></div>
+<div class='gridItem' style='grid-area: 92 / 2 / span 2 / span 2; background-color: rgb(191, 14, 181)'></div>
+<div class='gridItem' style='grid-area: 92 / 3 / span 2 / span 2; background-color: rgb(119, 75, 174)'></div>
+<div class='gridItem' style='grid-area: 92 / 4 / span 2 / span 2; background-color: rgb(91, 58, 180)'></div>
+<div class='gridItem' style='grid-area: 92 / 5 / span 2 / span 2; background-color: rgb(232, 78, 4)'></div>
+<div class='gridItem' style='grid-area: 92 / 6 / span 2 / span 2; background-color: rgb(54, 137, 47)'></div>
+<div class='gridItem' style='grid-area: 92 / 7 / span 2 / span 2; background-color: rgb(107, 170, 9)'></div>
+<div class='gridItem' style='grid-area: 92 / 8 / span 2 / span 2; background-color: rgb(170, 121, 48)'></div>
+<div class='gridItem' style='grid-area: 92 / 9 / span 2 / span 2; background-color: rgb(14, 122, 17)'></div>
+<div class='gridItem' style='grid-area: 92 / 10 / span 2 / span 2; background-color: rgb(91, 123, 149)'></div>
+<div class='gridItem' style='grid-area: 92 / 11 / span 2 / span 2; background-color: rgb(196, 226, 60)'></div>
+<div class='gridItem' style='grid-area: 92 / 12 / span 2 / span 2; background-color: rgb(6, 98, 192)'></div>
+<div class='gridItem' style='grid-area: 92 / 13 / span 2 / span 2; background-color: rgb(31, 46, 84)'></div>
+<div class='gridItem' style='grid-area: 92 / 14 / span 2 / span 2; background-color: rgb(6, 200, 136)'></div>
+<div class='gridItem' style='grid-area: 92 / 15 / span 2 / span 2; background-color: rgb(5, 136, 251)'></div>
+<div class='gridItem' style='grid-area: 92 / 16 / span 2 / span 2; background-color: rgb(3, 64, 223)'></div>
+<div class='gridItem' style='grid-area: 92 / 17 / span 2 / span 2; background-color: rgb(130, 32, 211)'></div>
+<div class='gridItem' style='grid-area: 92 / 18 / span 2 / span 2; background-color: rgb(144, 14, 1)'></div>
+<div class='gridItem' style='grid-area: 92 / 19 / span 2 / span 2; background-color: rgb(91, 231, 187)'></div>
+<div class='gridItem' style='grid-area: 92 / 20 / span 2 / span 2; background-color: rgb(167, 175, 3)'></div>
+<div class='gridItem' style='grid-area: 93 / 1 / span 2 / span 2; background-color: rgb(182, 75, 231)'></div>
+<div class='gridItem' style='grid-area: 93 / 2 / span 2 / span 2; background-color: rgb(175, 35, 3)'></div>
+<div class='gridItem' style='grid-area: 93 / 3 / span 2 / span 2; background-color: rgb(72, 72, 44)'></div>
+<div class='gridItem' style='grid-area: 93 / 4 / span 2 / span 2; background-color: rgb(74, 159, 85)'></div>
+<div class='gridItem' style='grid-area: 93 / 5 / span 2 / span 2; background-color: rgb(108, 21, 196)'></div>
+<div class='gridItem' style='grid-area: 93 / 6 / span 2 / span 2; background-color: rgb(130, 21, 73)'></div>
+<div class='gridItem' style='grid-area: 93 / 7 / span 2 / span 2; background-color: rgb(98, 152, 53)'></div>
+<div class='gridItem' style='grid-area: 93 / 8 / span 2 / span 2; background-color: rgb(247, 175, 23)'></div>
+<div class='gridItem' style='grid-area: 93 / 9 / span 2 / span 2; background-color: rgb(140, 170, 9)'></div>
+<div class='gridItem' style='grid-area: 93 / 10 / span 2 / span 2; background-color: rgb(50, 178, 81)'></div>
+<div class='gridItem' style='grid-area: 93 / 11 / span 2 / span 2; background-color: rgb(22, 162, 229)'></div>
+<div class='gridItem' style='grid-area: 93 / 12 / span 2 / span 2; background-color: rgb(235, 238, 67)'></div>
+<div class='gridItem' style='grid-area: 93 / 13 / span 2 / span 2; background-color: rgb(81, 205, 100)'></div>
+<div class='gridItem' style='grid-area: 93 / 14 / span 2 / span 2; background-color: rgb(170, 101, 67)'></div>
+<div class='gridItem' style='grid-area: 93 / 15 / span 2 / span 2; background-color: rgb(197, 4, 242)'></div>
+<div class='gridItem' style='grid-area: 93 / 16 / span 2 / span 2; background-color: rgb(221, 248, 147)'></div>
+<div class='gridItem' style='grid-area: 93 / 17 / span 2 / span 2; background-color: rgb(133, 99, 147)'></div>
+<div class='gridItem' style='grid-area: 93 / 18 / span 2 / span 2; background-color: rgb(194, 144, 174)'></div>
+<div class='gridItem' style='grid-area: 93 / 19 / span 2 / span 2; background-color: rgb(159, 104, 115)'></div>
+<div class='gridItem' style='grid-area: 93 / 20 / span 2 / span 2; background-color: rgb(94, 166, 60)'></div>
+<div class='gridItem' style='grid-area: 94 / 1 / span 2 / span 2; background-color: rgb(54, 15, 214)'></div>
+<div class='gridItem' style='grid-area: 94 / 2 / span 2 / span 2; background-color: rgb(46, 199, 63)'></div>
+<div class='gridItem' style='grid-area: 94 / 3 / span 2 / span 2; background-color: rgb(182, 99, 121)'></div>
+<div class='gridItem' style='grid-area: 94 / 4 / span 2 / span 2; background-color: rgb(239, 53, 202)'></div>
+<div class='gridItem' style='grid-area: 94 / 5 / span 2 / span 2; background-color: rgb(172, 17, 64)'></div>
+<div class='gridItem' style='grid-area: 94 / 6 / span 2 / span 2; background-color: rgb(89, 85, 8)'></div>
+<div class='gridItem' style='grid-area: 94 / 7 / span 2 / span 2; background-color: rgb(38, 75, 144)'></div>
+<div class='gridItem' style='grid-area: 94 / 8 / span 2 / span 2; background-color: rgb(188, 242, 60)'></div>
+<div class='gridItem' style='grid-area: 94 / 9 / span 2 / span 2; background-color: rgb(249, 108, 203)'></div>
+<div class='gridItem' style='grid-area: 94 / 10 / span 2 / span 2; background-color: rgb(12, 27, 14)'></div>
+<div class='gridItem' style='grid-area: 94 / 11 / span 2 / span 2; background-color: rgb(225, 199, 149)'></div>
+<div class='gridItem' style='grid-area: 94 / 12 / span 2 / span 2; background-color: rgb(13, 55, 140)'></div>
+<div class='gridItem' style='grid-area: 94 / 13 / span 2 / span 2; background-color: rgb(13, 81, 159)'></div>
+<div class='gridItem' style='grid-area: 94 / 14 / span 2 / span 2; background-color: rgb(119, 227, 227)'></div>
+<div class='gridItem' style='grid-area: 94 / 15 / span 2 / span 2; background-color: rgb(110, 131, 236)'></div>
+<div class='gridItem' style='grid-area: 94 / 16 / span 2 / span 2; background-color: rgb(138, 158, 179)'></div>
+<div class='gridItem' style='grid-area: 94 / 17 / span 2 / span 2; background-color: rgb(97, 66, 46)'></div>
+<div class='gridItem' style='grid-area: 94 / 18 / span 2 / span 2; background-color: rgb(2, 246, 224)'></div>
+<div class='gridItem' style='grid-area: 94 / 19 / span 2 / span 2; background-color: rgb(176, 67, 142)'></div>
+<div class='gridItem' style='grid-area: 94 / 20 / span 2 / span 2; background-color: rgb(174, 0, 106)'></div>
+<div class='gridItem' style='grid-area: 95 / 1 / span 2 / span 2; background-color: rgb(244, 53, 43)'></div>
+<div class='gridItem' style='grid-area: 95 / 2 / span 2 / span 2; background-color: rgb(244, 193, 215)'></div>
+<div class='gridItem' style='grid-area: 95 / 3 / span 2 / span 2; background-color: rgb(200, 21, 50)'></div>
+<div class='gridItem' style='grid-area: 95 / 4 / span 2 / span 2; background-color: rgb(118, 10, 12)'></div>
+<div class='gridItem' style='grid-area: 95 / 5 / span 2 / span 2; background-color: rgb(140, 10, 36)'></div>
+<div class='gridItem' style='grid-area: 95 / 6 / span 2 / span 2; background-color: rgb(40, 123, 83)'></div>
+<div class='gridItem' style='grid-area: 95 / 7 / span 2 / span 2; background-color: rgb(204, 136, 58)'></div>
+<div class='gridItem' style='grid-area: 95 / 8 / span 2 / span 2; background-color: rgb(238, 8, 159)'></div>
+<div class='gridItem' style='grid-area: 95 / 9 / span 2 / span 2; background-color: rgb(234, 210, 188)'></div>
+<div class='gridItem' style='grid-area: 95 / 10 / span 2 / span 2; background-color: rgb(2, 245, 22)'></div>
+<div class='gridItem' style='grid-area: 95 / 11 / span 2 / span 2; background-color: rgb(28, 105, 183)'></div>
+<div class='gridItem' style='grid-area: 95 / 12 / span 2 / span 2; background-color: rgb(69, 117, 53)'></div>
+<div class='gridItem' style='grid-area: 95 / 13 / span 2 / span 2; background-color: rgb(86, 155, 203)'></div>
+<div class='gridItem' style='grid-area: 95 / 14 / span 2 / span 2; background-color: rgb(121, 90, 40)'></div>
+<div class='gridItem' style='grid-area: 95 / 15 / span 2 / span 2; background-color: rgb(40, 75, 26)'></div>
+<div class='gridItem' style='grid-area: 95 / 16 / span 2 / span 2; background-color: rgb(189, 191, 71)'></div>
+<div class='gridItem' style='grid-area: 95 / 17 / span 2 / span 2; background-color: rgb(124, 90, 158)'></div>
+<div class='gridItem' style='grid-area: 95 / 18 / span 2 / span 2; background-color: rgb(108, 253, 40)'></div>
+<div class='gridItem' style='grid-area: 95 / 19 / span 2 / span 2; background-color: rgb(79, 218, 35)'></div>
+<div class='gridItem' style='grid-area: 95 / 20 / span 2 / span 2; background-color: rgb(44, 163, 235)'></div>
+<div class='gridItem' style='grid-area: 96 / 1 / span 2 / span 2; background-color: rgb(95, 104, 3)'></div>
+<div class='gridItem' style='grid-area: 96 / 2 / span 2 / span 2; background-color: rgb(17, 175, 206)'></div>
+<div class='gridItem' style='grid-area: 96 / 3 / span 2 / span 2; background-color: rgb(86, 115, 217)'></div>
+<div class='gridItem' style='grid-area: 96 / 4 / span 2 / span 2; background-color: rgb(163, 136, 132)'></div>
+<div class='gridItem' style='grid-area: 96 / 5 / span 2 / span 2; background-color: rgb(67, 84, 81)'></div>
+<div class='gridItem' style='grid-area: 96 / 6 / span 2 / span 2; background-color: rgb(15, 185, 7)'></div>
+<div class='gridItem' style='grid-area: 96 / 7 / span 2 / span 2; background-color: rgb(100, 64, 79)'></div>
+<div class='gridItem' style='grid-area: 96 / 8 / span 2 / span 2; background-color: rgb(4, 173, 172)'></div>
+<div class='gridItem' style='grid-area: 96 / 9 / span 2 / span 2; background-color: rgb(236, 245, 79)'></div>
+<div class='gridItem' style='grid-area: 96 / 10 / span 2 / span 2; background-color: rgb(55, 250, 29)'></div>
+<div class='gridItem' style='grid-area: 96 / 11 / span 2 / span 2; background-color: rgb(18, 188, 11)'></div>
+<div class='gridItem' style='grid-area: 96 / 12 / span 2 / span 2; background-color: rgb(26, 35, 112)'></div>
+<div class='gridItem' style='grid-area: 96 / 13 / span 2 / span 2; background-color: rgb(106, 80, 118)'></div>
+<div class='gridItem' style='grid-area: 96 / 14 / span 2 / span 2; background-color: rgb(63, 41, 247)'></div>
+<div class='gridItem' style='grid-area: 96 / 15 / span 2 / span 2; background-color: rgb(25, 26, 217)'></div>
+<div class='gridItem' style='grid-area: 96 / 16 / span 2 / span 2; background-color: rgb(76, 57, 243)'></div>
+<div class='gridItem' style='grid-area: 96 / 17 / span 2 / span 2; background-color: rgb(97, 105, 139)'></div>
+<div class='gridItem' style='grid-area: 96 / 18 / span 2 / span 2; background-color: rgb(229, 87, 234)'></div>
+<div class='gridItem' style='grid-area: 96 / 19 / span 2 / span 2; background-color: rgb(77, 41, 5)'></div>
+<div class='gridItem' style='grid-area: 96 / 20 / span 2 / span 2; background-color: rgb(5, 89, 84)'></div>
+<div class='gridItem' style='grid-area: 97 / 1 / span 2 / span 2; background-color: rgb(53, 56, 83)'></div>
+<div class='gridItem' style='grid-area: 97 / 2 / span 2 / span 2; background-color: rgb(253, 210, 29)'></div>
+<div class='gridItem' style='grid-area: 97 / 3 / span 2 / span 2; background-color: rgb(30, 189, 98)'></div>
+<div class='gridItem' style='grid-area: 97 / 4 / span 2 / span 2; background-color: rgb(197, 57, 114)'></div>
+<div class='gridItem' style='grid-area: 97 / 5 / span 2 / span 2; background-color: rgb(150, 93, 0)'></div>
+<div class='gridItem' style='grid-area: 97 / 6 / span 2 / span 2; background-color: rgb(179, 210, 204)'></div>
+<div class='gridItem' style='grid-area: 97 / 7 / span 2 / span 2; background-color: rgb(113, 129, 242)'></div>
+<div class='gridItem' style='grid-area: 97 / 8 / span 2 / span 2; background-color: rgb(181, 240, 62)'></div>
+<div class='gridItem' style='grid-area: 97 / 9 / span 2 / span 2; background-color: rgb(158, 156, 137)'></div>
+<div class='gridItem' style='grid-area: 97 / 10 / span 2 / span 2; background-color: rgb(102, 60, 78)'></div>
+<div class='gridItem' style='grid-area: 97 / 11 / span 2 / span 2; background-color: rgb(106, 109, 25)'></div>
+<div class='gridItem' style='grid-area: 97 / 12 / span 2 / span 2; background-color: rgb(69, 140, 45)'></div>
+<div class='gridItem' style='grid-area: 97 / 13 / span 2 / span 2; background-color: rgb(26, 105, 232)'></div>
+<div class='gridItem' style='grid-area: 97 / 14 / span 2 / span 2; background-color: rgb(130, 120, 16)'></div>
+<div class='gridItem' style='grid-area: 97 / 15 / span 2 / span 2; background-color: rgb(213, 46, 136)'></div>
+<div class='gridItem' style='grid-area: 97 / 16 / span 2 / span 2; background-color: rgb(88, 183, 18)'></div>
+<div class='gridItem' style='grid-area: 97 / 17 / span 2 / span 2; background-color: rgb(57, 111, 181)'></div>
+<div class='gridItem' style='grid-area: 97 / 18 / span 2 / span 2; background-color: rgb(43, 73, 255)'></div>
+<div class='gridItem' style='grid-area: 97 / 19 / span 2 / span 2; background-color: rgb(80, 86, 250)'></div>
+<div class='gridItem' style='grid-area: 97 / 20 / span 2 / span 2; background-color: rgb(27, 230, 167)'></div>
+<div class='gridItem' style='grid-area: 98 / 1 / span 2 / span 2; background-color: rgb(241, 61, 150)'></div>
+<div class='gridItem' style='grid-area: 98 / 2 / span 2 / span 2; background-color: rgb(217, 102, 96)'></div>
+<div class='gridItem' style='grid-area: 98 / 3 / span 2 / span 2; background-color: rgb(224, 54, 93)'></div>
+<div class='gridItem' style='grid-area: 98 / 4 / span 2 / span 2; background-color: rgb(56, 67, 246)'></div>
+<div class='gridItem' style='grid-area: 98 / 5 / span 2 / span 2; background-color: rgb(132, 146, 176)'></div>
+<div class='gridItem' style='grid-area: 98 / 6 / span 2 / span 2; background-color: rgb(132, 48, 214)'></div>
+<div class='gridItem' style='grid-area: 98 / 7 / span 2 / span 2; background-color: rgb(116, 222, 16)'></div>
+<div class='gridItem' style='grid-area: 98 / 8 / span 2 / span 2; background-color: rgb(208, 76, 62)'></div>
+<div class='gridItem' style='grid-area: 98 / 9 / span 2 / span 2; background-color: rgb(170, 254, 61)'></div>
+<div class='gridItem' style='grid-area: 98 / 10 / span 2 / span 2; background-color: rgb(141, 48, 244)'></div>
+<div class='gridItem' style='grid-area: 98 / 11 / span 2 / span 2; background-color: rgb(75, 215, 241)'></div>
+<div class='gridItem' style='grid-area: 98 / 12 / span 2 / span 2; background-color: rgb(58, 139, 64)'></div>
+<div class='gridItem' style='grid-area: 98 / 13 / span 2 / span 2; background-color: rgb(146, 190, 29)'></div>
+<div class='gridItem' style='grid-area: 98 / 14 / span 2 / span 2; background-color: rgb(236, 169, 6)'></div>
+<div class='gridItem' style='grid-area: 98 / 15 / span 2 / span 2; background-color: rgb(79, 148, 38)'></div>
+<div class='gridItem' style='grid-area: 98 / 16 / span 2 / span 2; background-color: rgb(2, 243, 100)'></div>
+<div class='gridItem' style='grid-area: 98 / 17 / span 2 / span 2; background-color: rgb(154, 246, 145)'></div>
+<div class='gridItem' style='grid-area: 98 / 18 / span 2 / span 2; background-color: rgb(134, 181, 223)'></div>
+<div class='gridItem' style='grid-area: 98 / 19 / span 2 / span 2; background-color: rgb(58, 61, 83)'></div>
+<div class='gridItem' style='grid-area: 98 / 20 / span 2 / span 2; background-color: rgb(47, 44, 204)'></div>
+<div class='gridItem' style='grid-area: 99 / 1 / span 2 / span 2; background-color: rgb(144, 120, 53)'></div>
+<div class='gridItem' style='grid-area: 99 / 2 / span 2 / span 2; background-color: rgb(242, 55, 117)'></div>
+<div class='gridItem' style='grid-area: 99 / 3 / span 2 / span 2; background-color: rgb(160, 17, 202)'></div>
+<div class='gridItem' style='grid-area: 99 / 4 / span 2 / span 2; background-color: rgb(41, 140, 194)'></div>
+<div class='gridItem' style='grid-area: 99 / 5 / span 2 / span 2; background-color: rgb(74, 121, 186)'></div>
+<div class='gridItem' style='grid-area: 99 / 6 / span 2 / span 2; background-color: rgb(73, 82, 200)'></div>
+<div class='gridItem' style='grid-area: 99 / 7 / span 2 / span 2; background-color: rgb(191, 7, 173)'></div>
+<div class='gridItem' style='grid-area: 99 / 8 / span 2 / span 2; background-color: rgb(82, 84, 157)'></div>
+<div class='gridItem' style='grid-area: 99 / 9 / span 2 / span 2; background-color: rgb(29, 8, 201)'></div>
+<div class='gridItem' style='grid-area: 99 / 10 / span 2 / span 2; background-color: rgb(156, 100, 151)'></div>
+<div class='gridItem' style='grid-area: 99 / 11 / span 2 / span 2; background-color: rgb(188, 226, 106)'></div>
+<div class='gridItem' style='grid-area: 99 / 12 / span 2 / span 2; background-color: rgb(78, 37, 230)'></div>
+<div class='gridItem' style='grid-area: 99 / 13 / span 2 / span 2; background-color: rgb(39, 73, 164)'></div>
+<div class='gridItem' style='grid-area: 99 / 14 / span 2 / span 2; background-color: rgb(151, 94, 234)'></div>
+<div class='gridItem' style='grid-area: 99 / 15 / span 2 / span 2; background-color: rgb(21, 252, 64)'></div>
+<div class='gridItem' style='grid-area: 99 / 16 / span 2 / span 2; background-color: rgb(130, 166, 70)'></div>
+<div class='gridItem' style='grid-area: 99 / 17 / span 2 / span 2; background-color: rgb(8, 18, 158)'></div>
+<div class='gridItem' style='grid-area: 99 / 18 / span 2 / span 2; background-color: rgb(229, 140, 188)'></div>
+<div class='gridItem' style='grid-area: 99 / 19 / span 2 / span 2; background-color: rgb(189, 233, 39)'></div>
+<div class='gridItem' style='grid-area: 99 / 20 / span 2 / span 2; background-color: rgb(122, 67, 71)'></div>
+<div class='gridItem' style='grid-area: 100 / 1 / span 2 / span 2; background-color: rgb(255, 226, 5)'></div>
+<div class='gridItem' style='grid-area: 100 / 2 / span 2 / span 2; background-color: rgb(209, 174, 187)'></div>
+<div class='gridItem' style='grid-area: 100 / 3 / span 2 / span 2; background-color: rgb(192, 103, 87)'></div>
+<div class='gridItem' style='grid-area: 100 / 4 / span 2 / span 2; background-color: rgb(181, 167, 167)'></div>
+<div class='gridItem' style='grid-area: 100 / 5 / span 2 / span 2; background-color: rgb(61, 132, 250)'></div>
+<div class='gridItem' style='grid-area: 100 / 6 / span 2 / span 2; background-color: rgb(182, 125, 88)'></div>
+<div class='gridItem' style='grid-area: 100 / 7 / span 2 / span 2; background-color: rgb(20, 147, 234)'></div>
+<div class='gridItem' style='grid-area: 100 / 8 / span 2 / span 2; background-color: rgb(68, 233, 40)'></div>
+<div class='gridItem' style='grid-area: 100 / 9 / span 2 / span 2; background-color: rgb(216, 234, 128)'></div>
+<div class='gridItem' style='grid-area: 100 / 10 / span 2 / span 2; background-color: rgb(43, 10, 17)'></div>
+<div class='gridItem' style='grid-area: 100 / 11 / span 2 / span 2; background-color: rgb(206, 102, 156)'></div>
+<div class='gridItem' style='grid-area: 100 / 12 / span 2 / span 2; background-color: rgb(184, 210, 49)'></div>
+<div class='gridItem' style='grid-area: 100 / 13 / span 2 / span 2; background-color: rgb(214, 203, 53)'></div>
+<div class='gridItem' style='grid-area: 100 / 14 / span 2 / span 2; background-color: rgb(239, 54, 215)'></div>
+<div class='gridItem' style='grid-area: 100 / 15 / span 2 / span 2; background-color: rgb(86, 163, 33)'></div>
+<div class='gridItem' style='grid-area: 100 / 16 / span 2 / span 2; background-color: rgb(154, 6, 174)'></div>
+<div class='gridItem' style='grid-area: 100 / 17 / span 2 / span 2; background-color: rgb(191, 232, 100)'></div>
+<div class='gridItem' style='grid-area: 100 / 18 / span 2 / span 2; background-color: rgb(127, 179, 214)'></div>
+<div class='gridItem' style='grid-area: 100 / 19 / span 2 / span 2; background-color: rgb(45, 43, 72)'></div>
+<div class='gridItem' style='grid-area: 100 / 20 / span 2 / span 2; background-color: rgb(178, 180, 196)'></div>
+</body>
+</head>
+</html>
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 47d71cb..9b5692d2 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -52,8 +52,10 @@
     "fetch/fetch_api_response.mojom",
     "file/file_utilities.mojom",
     "filesystem/file_system.mojom",
+    "frame/document_interface_broker.mojom",
     "frame/find_in_page.mojom",
     "frame/frame.mojom",
+    "frame/frame_host_test_interface.mojom",
     "frame/fullscreen.mojom",
     "frame/lifecycle.mojom",
     "frame/navigation_initiator.mojom",
diff --git a/third_party/blink/public/mojom/frame/document_interface_broker.mojom b/third_party/blink/public/mojom/frame/document_interface_broker.mojom
new file mode 100644
index 0000000..c036ff4
--- /dev/null
+++ b/third_party/blink/public/mojom/frame/document_interface_broker.mojom
@@ -0,0 +1,18 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module blink.mojom;
+
+import "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom";
+
+// An interface through which the renderer may request document-scoped
+// interfaces from the browser.
+interface DocumentInterfaceBroker {
+  // Binds the blink.mojom.FrameHostTestInterface pending receiver to its
+  // remote implementation in the browser process, to allow using this test
+  // interface to exercise requesting document-scoped interfaces from the
+  // RenderFrameHost through the DocumentInterfaceBroker interface.
+  GetFrameHostTestInterface(
+      pending_receiver<blink.mojom.FrameHostTestInterface> receiver);
+};
diff --git a/third_party/blink/public/mojom/frame/frame_host_test_interface.mojom b/third_party/blink/public/mojom/frame/frame_host_test_interface.mojom
new file mode 100644
index 0000000..fdfcf38
--- /dev/null
+++ b/third_party/blink/public/mojom/frame/frame_host_test_interface.mojom
@@ -0,0 +1,26 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module blink.mojom;
+
+import "url/mojom/url.mojom";
+
+// TODO(crbug.com/718652) This is a copy of
+// content/test/frame_host_test_interface.mojom to be used in parallel while
+// InterfaceProvider->DocumentInterfaceBroker conversion is taking place.
+
+// Test interface used in RenderFrame and RenderFrameHost tests to exercise
+// requesting document-scoped interfaces from the RenderFrameHost through
+// the DocumentInterfaceBroker interface.
+//
+// The `Ping` method is invoked by clients immediately after making the
+// FrameHostTestInterfaceRequest, so as to annotate where the request
+// originates from. This allows verification that the request was delivered /
+// not delivered to a certain DocumentInterfaceBroker implementation.
+interface FrameHostTestInterface {
+  Ping(url.mojom.Url source_url, string source_event);
+  // Used in tests to distinguish between the different implementations
+  // and verify that interface requests are routed to the proper override.
+  GetName() => (string name);
+};
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h
index ebf2ca99..1357eb3 100644
--- a/third_party/blink/public/web/web_local_frame.h
+++ b/third_party/blink/public/web/web_local_frame.h
@@ -84,6 +84,7 @@
       WebView*,
       WebLocalFrameClient*,
       blink::InterfaceRegistry*,
+      mojo::ScopedMessagePipeHandle,
       WebFrame* opener = nullptr,
       const WebString& name = WebString(),
       WebSandboxFlags = WebSandboxFlags::kNone,
@@ -111,6 +112,7 @@
   BLINK_EXPORT static WebLocalFrame* CreateProvisional(
       WebLocalFrameClient*,
       blink::InterfaceRegistry*,
+      mojo::ScopedMessagePipeHandle,
       WebFrame* previous_web_frame,
       const FramePolicy&);
 
@@ -119,7 +121,8 @@
   // it's no longer needed.
   virtual WebLocalFrame* CreateLocalChild(WebTreeScopeType,
                                           WebLocalFrameClient*,
-                                          blink::InterfaceRegistry*) = 0;
+                                          blink::InterfaceRegistry*,
+                                          mojo::ScopedMessagePipeHandle) = 0;
 
   // Returns the WebFrame associated with the current V8 context. This
   // function can return 0 if the context is associated with a Document that
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index a8cf9f6..f4566aa 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -399,6 +399,14 @@
   // The provisional datasource is now committed.  The first part of the
   // response body has been received, and the encoding of the response
   // body is known.
+  // The mojo::ScopedMessagePipeHandle is a DocumentInterfaceBroker handle. When
+  // a load commits and a new Document is created, Blink creates a new
+  // DocumentInterfaceBroker endpoint to ensure that interface requests in the
+  // newly committed Document are associated with the correct origin (even if
+  // the origin of the old and the new Document are the same). The one
+  // exception is if the Window object is reused; in that case, the old
+  // DocumentInterfaceBroker handle will be reused, and the endpoint won't be
+  // bound to any requests.
   // When a load commits and a new Document is created, WebLocalFrameClient
   // creates a new BrowserInterfaceBroker endpoint to ensure that interface
   // receivers in the newly committed Document are associated with the correct
@@ -409,6 +417,7 @@
   virtual void DidCommitProvisionalLoad(
       const WebHistoryItem&,
       WebHistoryCommitType,
+      mojo::ScopedMessagePipeHandle,
       bool should_reset_browser_interface_broker) {}
 
   // The frame's document has just been initialized.
diff --git a/third_party/blink/public/web/web_remote_frame.h b/third_party/blink/public/web/web_remote_frame.h
index f7da7a8..d924afe8 100644
--- a/third_party/blink/public/web/web_remote_frame.h
+++ b/third_party/blink/public/web/web_remote_frame.h
@@ -73,6 +73,7 @@
                                           const FramePolicy&,
                                           WebLocalFrameClient*,
                                           blink::InterfaceRegistry*,
+                                          mojo::ScopedMessagePipeHandle,
                                           WebFrame* previous_sibling,
                                           const WebFrameOwnerProperties&,
                                           FrameOwnerElementType,
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
index 5b0d8b8..ced1a1b 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
@@ -114,11 +114,24 @@
 
         case MOJO_RESULT_SHOULD_WAIT: {
           {
+            TRACE_EVENT_END0(
+                "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+                "v8.parseOnBackgroundParsing");
+            TRACE_EVENT_BEGIN0(
+                "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+                "v8.parseOnBackgroundWaiting");
             base::ScopedAllowBaseSyncPrimitives
                 scoped_allow_base_sync_primitives;
             base::ScopedBlockingCall scoped_blocking_call(
                 FROM_HERE, base::BlockingType::WILL_BLOCK);
+
             result = mojo::Wait(data_pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE);
+            TRACE_EVENT_END0(
+                "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+                "v8.parseOnBackgroundWaiting");
+            TRACE_EVENT_BEGIN0(
+                "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+                "v8.parseOnBackgroundParsing");
           }
 
           if (result != MOJO_RESULT_OK) {
@@ -333,12 +346,16 @@
     std::unique_ptr<v8::ScriptCompiler::ScriptStreamingTask> task,
     ScriptStreamer* streamer,
     SourceStream* stream) {
-  TRACE_EVENT_WITH_FLOW1(
+  // TODO(leszeks): Add flow event data again
+  TRACE_EVENT_BEGIN1(
       "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
-      "v8.parseOnBackground", streamer,
-      TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "data",
+      "v8.parseOnBackground", "data",
       inspector_parse_script_event::Data(streamer->ScriptResourceIdentifier(),
                                          streamer->ScriptURLString()));
+
+  TRACE_EVENT_BEGIN0(
+      "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+      "v8.parseOnBackgroundParsing");
   // Running the task can and will block: SourceStream::GetSomeData will get
   // called and it will block and wait for data from the network.
   task->Run();
@@ -348,7 +365,21 @@
   // TODO(leszeks): This could be done asynchronously, using a mojo watcher.
   stream->DrainRemainingDataWithoutStreaming();
 
+  TRACE_EVENT_END0(
+      "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+      "v8.parseOnBackgroundParsing");
+
   streamer->StreamingCompleteOnBackgroundThread();
+
+  TRACE_EVENT_END0(
+      "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+      "v8.parseOnBackground");
+
+  // TODO(crbug.com/1021571); Remove this once the last event stops being
+  // dropped.
+  TRACE_EVENT_END0(
+      "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+      "v8.parseOnBackground2");
 }
 
 }  // namespace
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
index 75ea8b1..d0a44a7 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
@@ -200,7 +200,7 @@
                  WeakCallback callback) final {}
   void VisitBackingStoreOnly(void*, void**) final {}
   void RegisterBackingStoreCallback(void*, MovingObjectCallback) final {}
-  void RegisterWeakCallback(void*, WeakCallback) final {}
+  void RegisterWeakCallback(WeakCallback, void*) final {}
 
  private:
   class ParentScope {
diff --git a/third_party/blink/renderer/bindings/modules/v8/custom/v8_extendable_message_event_custom.cc b/third_party/blink/renderer/bindings/modules/v8/custom/v8_extendable_message_event_custom.cc
index ca6940f..43f2908 100644
--- a/third_party/blink/renderer/bindings/modules/v8/custom/v8_extendable_message_event_custom.cc
+++ b/third_party/blink/renderer/bindings/modules/v8/custom/v8_extendable_message_event_custom.cc
@@ -5,8 +5,8 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_extendable_message_event.h"
 
 #include "third_party/blink/renderer/bindings/modules/v8/v8_extendable_message_event_init.h"
+#include "third_party/blink/renderer/core/events/message_event.h"
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
-#include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
 
 namespace blink {
 
@@ -49,7 +49,9 @@
   // |data| as a private value to avoid cyclic references.
   if (event_init_dict->hasData()) {
     v8::Local<v8::Value> v8_data = event_init_dict->data().V8Value();
-    V8PrivateProperty::GetMessageEventCachedData(isolate).Set(wrapper, v8_data);
+    V8PrivateProperty::GetSymbol(isolate,
+                                 kPrivatePropertyMessageEventCachedData)
+        .Set(wrapper, v8_data);
     if (DOMWrapperWorld::Current(isolate).IsIsolatedWorld()) {
       impl->SetSerializedData(
           SerializedScriptValue::SerializeAndSwallowExceptions(isolate,
@@ -64,8 +66,8 @@
   ExtendableMessageEvent* event =
       V8ExtendableMessageEvent::ToImpl(info.Holder());
   v8::Isolate* isolate = info.GetIsolate();
-  auto private_cached_data =
-      V8PrivateProperty::GetMessageEventCachedData(isolate);
+  auto private_cached_data = V8PrivateProperty::GetSymbol(
+      isolate, kPrivatePropertyMessageEventCachedData);
   v8::Local<v8::Value> result;
   if (private_cached_data.GetOrUndefined(info.Holder()).ToLocal(&result) &&
       !result->IsUndefined()) {
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/__init__.py b/third_party/blink/renderer/bindings/scripts/bind_gen/__init__.py
index bcc7dab..8109fdb8 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/__init__.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/__init__.py
@@ -51,8 +51,3 @@
 
 from .example import run_example
 from .interface import generate_interfaces
-
-__all__ = [
-    "generate_interfaces",
-    "run_example",
-]
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/__init__.py b/third_party/blink/renderer/bindings/scripts/web_idl/__init__.py
index c3bc24a..a36af10 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/__init__.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/__init__.py
@@ -52,20 +52,3 @@
             runtime-enabled features ("runtime_enabled_features.json5").
     """
     RuntimeEnabledFeatures.init(filepaths=runtime_enabled_features_paths)
-
-
-__all__ = [
-    "AstGroup",
-    "CallbackFunction",
-    "CallbackInterface",
-    "Component",
-    "Database",
-    "Dictionary",
-    "Enumeration",
-    "IdlType",
-    "Interface",
-    "Namespace",
-    "Typedef",
-    "Union",
-    "build_database",
-]
diff --git a/third_party/blink/renderer/bindings/templates/interface.cc.tmpl b/third_party/blink/renderer/bindings/templates/interface.cc.tmpl
index 2dbb6ea..a0d2dc5f 100644
--- a/third_party/blink/renderer/bindings/templates/interface.cc.tmpl
+++ b/third_party/blink/renderer/bindings/templates/interface.cc.tmpl
@@ -1100,6 +1100,9 @@
 {{cpp_class}}* V8{{interface_name}}::ToImpl(v8::Local<v8::Object> object) {
   DCHECK(object->Is{{interface_name}}());
   v8::Local<v8::{{interface_name}}> v8buffer = object.As<v8::{{interface_name}}>();
+  // TODO(ahaas): The use of IsExternal is wrong here. Instead we should call
+  // ToScriptWrappable(object)->ToImpl<ArrayBuffer>() and check for nullptr.
+  // We can then also avoid the call to Externalize below.
   if (v8buffer->IsExternal()) {
     const WrapperTypeInfo* wrapper_type = ToWrapperTypeInfo(object);
     CHECK(wrapper_type);
@@ -1109,12 +1112,9 @@
 
   // Transfer the ownership of the allocated memory to an {{interface_name}} without
   // copying.
-  v8::{{interface_name}}::Contents v8_contents = v8buffer->Externalize();
-  ArrayBufferContents::DataHandle data(v8_contents.Data(),
-                                       v8_contents.ByteLength(),
-                                       v8_contents.Deleter(),
-                                       v8_contents.DeleterData());
-  ArrayBufferContents contents(std::move(data), ArrayBufferContents::k{% if interface_name == 'ArrayBuffer' %}Not{% endif %}Shared);
+  auto backing_store = v8buffer->GetBackingStore();
+  v8buffer->Externalize(backing_store);
+  ArrayBufferContents contents(std::move(backing_store));
   {{cpp_class}}* buffer = {{cpp_class}}::Create(contents);
   v8::Local<v8::Object> associatedWrapper = buffer->AssociateWithWrapper(v8::Isolate::GetCurrent(), buffer->GetWrapperTypeInfo(), object);
   DCHECK(associatedWrapper == object);
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_array_buffer.cc b/third_party/blink/renderer/bindings/tests/results/core/v8_array_buffer.cc
index 37b88a1..60814a5 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_array_buffer.cc
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_array_buffer.cc
@@ -69,6 +69,9 @@
 TestArrayBuffer* V8ArrayBuffer::ToImpl(v8::Local<v8::Object> object) {
   DCHECK(object->IsArrayBuffer());
   v8::Local<v8::ArrayBuffer> v8buffer = object.As<v8::ArrayBuffer>();
+  // TODO(ahaas): The use of IsExternal is wrong here. Instead we should call
+  // ToScriptWrappable(object)->ToImpl<ArrayBuffer>() and check for nullptr.
+  // We can then also avoid the call to Externalize below.
   if (v8buffer->IsExternal()) {
     const WrapperTypeInfo* wrapper_type = ToWrapperTypeInfo(object);
     CHECK(wrapper_type);
@@ -78,12 +81,9 @@
 
   // Transfer the ownership of the allocated memory to an ArrayBuffer without
   // copying.
-  v8::ArrayBuffer::Contents v8_contents = v8buffer->Externalize();
-  ArrayBufferContents::DataHandle data(v8_contents.Data(),
-                                       v8_contents.ByteLength(),
-                                       v8_contents.Deleter(),
-                                       v8_contents.DeleterData());
-  ArrayBufferContents contents(std::move(data), ArrayBufferContents::kNotShared);
+  auto backing_store = v8buffer->GetBackingStore();
+  v8buffer->Externalize(backing_store);
+  ArrayBufferContents contents(std::move(backing_store));
   TestArrayBuffer* buffer = TestArrayBuffer::Create(contents);
   v8::Local<v8::Object> associatedWrapper = buffer->AssociateWithWrapper(v8::Isolate::GetCurrent(), buffer->GetWrapperTypeInfo(), object);
   DCHECK(associatedWrapper == object);
diff --git a/third_party/blink/renderer/build/scripts/core/OWNERS b/third_party/blink/renderer/build/scripts/core/OWNERS
deleted file mode 100644
index fd832b8..0000000
--- a/third_party/blink/renderer/build/scripts/core/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-set noparent
-file://third_party/blink/renderer/core/OWNERS
-
-# TEAM: blink-dev@chromium.org
-# COMPONENT: Blink
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index ee34acc9..19572ce 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -273,6 +273,8 @@
     "testing/death_aware_script_wrappable.h",
     "testing/dictionary_test.cc",
     "testing/dictionary_test.h",
+    "testing/document_interface_broker_test_helpers.cc",
+    "testing/document_interface_broker_test_helpers.h",
     "testing/dummy_modulator.cc",
     "testing/dummy_modulator.h",
     "testing/dummy_page_holder.cc",
@@ -305,6 +307,8 @@
     "testing/sequence_test.h",
     "testing/static_selection.cc",
     "testing/static_selection.h",
+    "testing/test_document_interface_broker.cc",
+    "testing/test_document_interface_broker.h",
     "testing/type_conversions.h",
     "testing/union_types_test.cc",
     "testing/union_types_test.h",
diff --git a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc
index 599de21..a253d59 100644
--- a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc
+++ b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc
@@ -180,14 +180,14 @@
 
 void MatchedPropertiesCache::Trace(blink::Visitor* visitor) {
   visitor->Trace(cache_);
-  visitor->RegisterWeakMembers<
+  visitor->RegisterWeakCallbackMethod<
       MatchedPropertiesCache,
       &MatchedPropertiesCache::RemoveCachedMatchedPropertiesWithDeadEntries>(
       this);
 }
 
 void MatchedPropertiesCache::RemoveCachedMatchedPropertiesWithDeadEntries(
-    Visitor* visitor) {
+    const WeakCallbackInfo& broker) {
   Vector<unsigned> to_remove;
   for (const auto& entry_pair : cache_) {
     // A nullptr value indicates that the entry is currently being created; see
@@ -196,7 +196,7 @@
       continue;
     for (const auto& matched_properties :
          entry_pair.value->matched_properties) {
-      if (!ThreadHeap::IsHeapObjectAlive(matched_properties)) {
+      if (!broker.IsHeapObjectAlive(matched_properties)) {
         to_remove.push_back(entry_pair.key);
         break;
       }
diff --git a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.h b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.h
index b0d91b2..261a4501 100644
--- a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.h
+++ b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.h
@@ -91,7 +91,7 @@
                             DefaultHash<unsigned>::Hash,
                             HashTraits<unsigned>>;
 
-  void RemoveCachedMatchedPropertiesWithDeadEntries(Visitor*);
+  void RemoveCachedMatchedPropertiesWithDeadEntries(const WeakCallbackInfo&);
 
   Cache cache_;
   DISALLOW_COPY_AND_ASSIGN(MatchedPropertiesCache);
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index 183d03d5..c424eee 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -220,7 +220,7 @@
     return;
   }
 
-  if (IsHTMLTableElement(element)) {
+  if (IsA<HTMLTableElement>(element)) {
     // Tables never support the -webkit-* values for text-align and will reset
     // back to the default.
     if (style.GetTextAlign() == ETextAlign::kWebkitLeft ||
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 3d5a605..76128b7 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -51,6 +51,7 @@
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom-blink.h"
 #include "third_party/blink/public/mojom/ukm/ukm.mojom-blink.h"
 #include "third_party/blink/public/platform/interface_provider.h"
@@ -8038,6 +8039,13 @@
   return is_secure;
 }
 
+mojo::ScopedMessagePipeHandle Document::SetDocumentInterfaceBrokerForTesting(
+    mojo::ScopedMessagePipeHandle blink_handle) {
+  DCHECK(GetFrame());
+  return GetFrame()->SetDocumentInterfaceBrokerForTesting(
+      std::move(blink_handle));
+}
+
 void Document::DidEnforceInsecureRequestPolicy() {
   if (!GetFrame())
     return;
@@ -8134,6 +8142,13 @@
   return &GetFrame()->GetInterfaceProvider();
 }
 
+mojom::blink::DocumentInterfaceBroker* Document::GetDocumentInterfaceBroker() {
+  if (!GetFrame())
+    return nullptr;
+
+  return &GetFrame()->GetDocumentInterfaceBroker();
+}
+
 BrowserInterfaceBrokerProxy& Document::GetBrowserInterfaceBroker() {
   if (!GetFrame())
     return GetEmptyBrowserInterfaceBroker();
@@ -8152,6 +8167,13 @@
   return resource_coordinator_.get();
 }
 
+void Document::BindDocumentInterfaceBroker(
+    mojo::ScopedMessagePipeHandle js_handle) {
+  if (!GetFrame())
+    return;
+  GetFrame()->BindDocumentInterfaceBroker(std::move(js_handle));
+}
+
 FrameOrWorkerScheduler* Document::GetScheduler() {
   DCHECK(IsMainThread());
 
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 8261c70a..d84d6f6 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -1359,6 +1359,11 @@
     secure_context_state_ = state;
   }
 
+  void BindDocumentInterfaceBroker(mojo::ScopedMessagePipeHandle js_handle);
+
+  mojo::ScopedMessagePipeHandle SetDocumentInterfaceBrokerForTesting(
+      mojo::ScopedMessagePipeHandle blink_handle);
+
   CanvasFontCache* GetCanvasFontCache();
 
   // Used by unit tests so that all parsing will be main thread for
@@ -1425,6 +1430,7 @@
 
   CoreProbeSink* GetProbeSink() final;
   service_manager::InterfaceProvider* GetInterfaceProvider() final;
+  mojom::blink::DocumentInterfaceBroker* GetDocumentInterfaceBroker() final;
 
   BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() final;
 
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 861fbe66..a7a291b 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -425,6 +425,11 @@
 bool ElementIsDescendantOfShadowIncludingAncestor(
     const Element& attribute_element,
     const Element& candidate) {
+  // TODO(meredithl): Update this to allow setting relationships for elements
+  // outside of the DOM once the spec is finalized. For consistency and
+  // simplicity, for now it is disallowed.
+  if (!attribute_element.IsInTreeScope() || !candidate.IsInTreeScope())
+    return false;
   ShadowRoot* nearest_root = attribute_element.ContainingShadowRoot();
   const Element* shadow_host = &attribute_element;
   while (nearest_root) {
@@ -757,20 +762,35 @@
   SpaceSplitString value;
 
   for (auto element : given_elements) {
+    // Elements that are not descendants of this element's shadow including
+    // ancestors are dropped.
     if (!ElementIsDescendantOfShadowIncludingAncestor(*this, *element))
       continue;
+
+    // If |value| is null, this means a previous element must have been invalid,
+    // and the content attribute should reflect the empty string, so we don't
+    // continue trying to compute it.
     if (value.IsNull() && !elements->IsEmpty()) {
       elements->push_back(element);
       continue;
     }
+
     elements->push_back(element);
     const AtomicString given_element_id = element->GetIdAttribute();
+
+    // We compute the content attribute string as a space separated string of
+    // the given |element| ids. Every |element| in |given_elements| must have an
+    // id, must be in the same tree scope and must be the first id in tree order
+    // with that id, otherwise the content attribute should reflect the empty
+    // string.
     if (given_element_id.IsNull() ||
         GetTreeScope() != element->GetTreeScope() ||
         GetTreeScope().getElementById(given_element_id) != element) {
       value.Clear();
       continue;
     }
+
+    // Whitespace between elements is added when the string is serialized.
     value.Add(given_element_id);
   }
 
diff --git a/third_party/blink/renderer/core/dom/live_node_list_registry.cc b/third_party/blink/renderer/core/dom/live_node_list_registry.cc
index bb032edd..a0599e9 100644
--- a/third_party/blink/renderer/core/dom/live_node_list_registry.cc
+++ b/third_party/blink/renderer/core/dom/live_node_list_registry.cc
@@ -31,8 +31,8 @@
 }
 
 void LiveNodeListRegistry::Trace(Visitor* visitor) {
-  visitor->RegisterWeakMembers<LiveNodeListRegistry,
-                               &LiveNodeListRegistry::ClearWeakMembers>(this);
+  visitor->RegisterWeakCallbackMethod<
+      LiveNodeListRegistry, &LiveNodeListRegistry::ProcessCustomWeakness>(this);
 }
 
 void LiveNodeListRegistry::RecomputeMask() {
@@ -42,9 +42,10 @@
   mask_ = mask;
 }
 
-void LiveNodeListRegistry::ClearWeakMembers(Visitor*) {
-  auto* it = std::remove_if(data_.begin(), data_.end(), [](Entry entry) {
-    return !ThreadHeap::IsHeapObjectAlive(entry.first);
+void LiveNodeListRegistry::ProcessCustomWeakness(
+    const WeakCallbackInfo& broker) {
+  auto* it = std::remove_if(data_.begin(), data_.end(), [broker](Entry entry) {
+    return !broker.IsHeapObjectAlive(entry.first);
   });
   if (it == data_.end())
     return;
diff --git a/third_party/blink/renderer/core/dom/live_node_list_registry.h b/third_party/blink/renderer/core/dom/live_node_list_registry.h
index b208eaa..8299c9d 100644
--- a/third_party/blink/renderer/core/dom/live_node_list_registry.h
+++ b/third_party/blink/renderer/core/dom/live_node_list_registry.h
@@ -57,7 +57,7 @@
 
   // Removes any entries corresponding to node lists which have been collected
   // by the GC, and updates the mask accordingly.
-  void ClearWeakMembers(Visitor*);
+  void ProcessCustomWeakness(const WeakCallbackInfo&);
 
   Vector<Entry> data_;
   unsigned mask_ = 0;
diff --git a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
index 8d57a445..75aae10b 100644
--- a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
@@ -598,7 +598,7 @@
   // merge content in.
   if (start_node == start_block_.Get() && !start_offset &&
       CanHaveChildrenForEditing(start_node) &&
-      !IsHTMLTableElement(*start_node)) {
+      !IsA<HTMLTableElement>(*start_node)) {
     start_offset = 0;
     start_node = NodeTraversal::Next(*start_node);
     if (!start_node)
diff --git a/third_party/blink/renderer/core/editing/commands/insert_line_break_command.cc b/third_party/blink/renderer/core/editing/commands/insert_line_break_command.cc
index af34ccc..40f823a5 100644
--- a/third_party/blink/renderer/core/editing/commands/insert_line_break_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/insert_line_break_command.cc
@@ -105,7 +105,7 @@
   if (IsEndOfParagraph(CreateVisiblePosition(caret.ToPositionWithAffinity())) &&
       !LineBreakExistsAtVisiblePosition(caret)) {
     bool need_extra_line_break = !IsA<HTMLHRElement>(*pos.AnchorNode()) &&
-                                 !IsHTMLTableElement(*pos.AnchorNode());
+                                 !IsA<HTMLTableElement>(*pos.AnchorNode());
 
     InsertNodeAt(node_to_insert, pos, editing_state);
     if (editing_state->IsAborted())
diff --git a/third_party/blink/renderer/core/editing/editing_utilities.cc b/third_party/blink/renderer/core/editing/editing_utilities.cc
index 6d26b8b1..8ad6eb1 100644
--- a/third_party/blink/renderer/core/editing/editing_utilities.cc
+++ b/third_party/blink/renderer/core/editing/editing_utilities.cc
@@ -1240,7 +1240,7 @@
 }
 
 bool IsDisplayInsideTable(const Node* node) {
-  return node && node->GetLayoutObject() && IsHTMLTableElement(node);
+  return node && node->GetLayoutObject() && IsA<HTMLTableElement>(node);
 }
 
 bool IsTableCell(const Node* node) {
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
index ca64509..5df64a5 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -755,7 +755,7 @@
   }
 }
 
-void DocumentMarkerController::DidProcessMarkerMap(Visitor* visitor) {
+void DocumentMarkerController::DidProcessMarkerMap(const WeakCallbackInfo&) {
   if (markers_.IsEmpty())
     Clear();
 }
@@ -763,7 +763,7 @@
 void DocumentMarkerController::Trace(Visitor* visitor) {
   // Note: To make |DidProcessMarkerMap()| called after weak members callback
   // of |markers_|, we should register it before tracing |markers_|.
-  visitor->template RegisterWeakMembers<
+  visitor->template RegisterWeakCallbackMethod<
       DocumentMarkerController, &DocumentMarkerController::DidProcessMarkerMap>(
       this);
   visitor->Trace(markers_);
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
index db46c46..64274cd6 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
@@ -184,7 +184,7 @@
                              DocumentMarker::MarkerTypes);
 
   // Called after weak processing of |markers_| is done.
-  void DidProcessMarkerMap(Visitor* visitor);
+  void DidProcessMarkerMap(const WeakCallbackInfo&);
 
   MarkerMap markers_;
   // Provide a quick way to determine whether a particular marker type is absent
diff --git a/third_party/blink/renderer/core/editing/visible_units.cc b/third_party/blink/renderer/core/editing/visible_units.cc
index ce38def..d66462c 100644
--- a/third_party/blink/renderer/core/editing/visible_units.cc
+++ b/third_party/blink/renderer/core/editing/visible_units.cc
@@ -555,7 +555,7 @@
     return true;
 
   // Don't include inline tables.
-  if (IsHTMLTableElement(*node))
+  if (IsA<HTMLTableElement>(*node))
     return false;
 
   // A Marquee elements are moving so we should assume their ends are always
diff --git a/third_party/blink/renderer/core/events/message_event.cc b/third_party/blink/renderer/core/events/message_event.cc
index e4a11f1..5632f221 100644
--- a/third_party/blink/renderer/core/events/message_event.cc
+++ b/third_party/blink/renderer/core/events/message_event.cc
@@ -34,10 +34,12 @@
 #include "third_party/blink/renderer/core/frame/user_activation.h"
 #include "third_party/blink/renderer/core/html/portal/html_portal_element.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
 
 namespace blink {
 
+// extern
+const V8PrivateProperty::SymbolKey kPrivatePropertyMessageEventCachedData;
+
 static inline bool IsValidSource(EventTarget* source) {
   return !source || source->ToDOMWindow() || source->ToMessagePort() ||
          source->ToServiceWorker() || source->ToPortalHost() ||
@@ -358,14 +360,16 @@
     case kDataTypeSerializedScriptValue:
       break;
     case kDataTypeString:
-      V8PrivateProperty::GetMessageEventCachedData(isolate).Set(
-          wrapper, V8String(isolate, data_as_string_.data()));
+      V8PrivateProperty::GetSymbol(isolate,
+                                   kPrivatePropertyMessageEventCachedData)
+          .Set(wrapper, V8String(isolate, data_as_string_.data()));
       break;
     case kDataTypeBlob:
       break;
     case kDataTypeArrayBuffer:
-      V8PrivateProperty::GetMessageEventCachedData(isolate).Set(
-          wrapper, ToV8(data_as_array_buffer_, wrapper, isolate));
+      V8PrivateProperty::GetSymbol(isolate,
+                                   kPrivatePropertyMessageEventCachedData)
+          .Set(wrapper, ToV8(data_as_array_buffer_, wrapper, isolate));
       break;
   }
 
diff --git a/third_party/blink/renderer/core/events/message_event.h b/third_party/blink/renderer/core/events/message_event.h
index c89ad7b..748c600 100644
--- a/third_party/blink/renderer/core/events/message_event.h
+++ b/third_party/blink/renderer/core/events/message_event.h
@@ -41,6 +41,7 @@
 #include "third_party/blink/renderer/core/fileapi/blob.h"
 #include "third_party/blink/renderer/core/messaging/message_port.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
+#include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
 namespace blink {
@@ -243,6 +244,9 @@
   bool allow_autoplay_ = false;
 };
 
+extern CORE_EXPORT const V8PrivateProperty::SymbolKey
+    kPrivatePropertyMessageEventCachedData;
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_EVENTS_MESSAGE_EVENT_H_
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h
index 7ead7f12..727817f 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.h
+++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -36,6 +36,7 @@
 #include "base/optional.h"
 #include "base/unguessable_token.h"
 #include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/frame/lifecycle.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/sanitize_script_errors.h"
 #include "third_party/blink/renderer/core/core_export.h"
@@ -275,6 +276,10 @@
     return nullptr;
   }
 
+  virtual mojom::blink::DocumentInterfaceBroker* GetDocumentInterfaceBroker() {
+    return nullptr;
+  }
+
   virtual BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() = 0;
 
   virtual FrameOrWorkerScheduler* GetScheduler() = 0;
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
index 3e6a2487..3f3401ed 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
@@ -161,8 +161,16 @@
 
 }  // namespace
 
-LocalFrameClientImpl::LocalFrameClientImpl(WebLocalFrameImpl* frame)
-    : web_frame_(frame) {}
+LocalFrameClientImpl::LocalFrameClientImpl(
+    WebLocalFrameImpl* frame,
+    mojo::ScopedMessagePipeHandle document_interface_broker_handle)
+    : web_frame_(frame) {
+  DCHECK(document_interface_broker_handle.is_valid());
+  document_interface_broker_.Bind(
+      mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker>(
+          std::move(document_interface_broker_handle),
+          mojom::blink::DocumentInterfaceBroker::Version_));
+}
 
 LocalFrameClientImpl::~LocalFrameClientImpl() = default;
 
@@ -435,8 +443,17 @@
   }
 
   if (web_frame_->Client()) {
+    mojo::PendingReceiver<mojom::blink::DocumentInterfaceBroker>
+        document_interface_broker_receiver;
+    if (global_object_reuse_policy != GlobalObjectReusePolicy::kUseExisting) {
+      document_interface_broker_.reset();
+      document_interface_broker_receiver =
+          document_interface_broker_.BindNewPipeAndPassReceiver();
+    }
+
     web_frame_->Client()->DidCommitProvisionalLoad(
         WebHistoryItem(item), commit_type,
+        document_interface_broker_receiver.PassPipe(),
         global_object_reuse_policy == GlobalObjectReusePolicy::kCreateNew);
     if (web_frame_->GetFrame()->IsLocalRoot()) {
       // This update should be sent as soon as loading the new document begins
@@ -1044,11 +1061,40 @@
   return web_frame_->Client()->GetInterfaceProvider();
 }
 
+mojom::blink::DocumentInterfaceBroker*
+LocalFrameClientImpl::GetDocumentInterfaceBroker() {
+  DCHECK(document_interface_broker_.is_bound());
+  return document_interface_broker_.get();
+}
+
 blink::BrowserInterfaceBrokerProxy&
 LocalFrameClientImpl::GetBrowserInterfaceBroker() {
   return *web_frame_->Client()->GetBrowserInterfaceBroker();
 }
 
+void LocalFrameClientImpl::BindDocumentInterfaceBroker(
+    mojo::ScopedMessagePipeHandle js_handle) {
+  document_interface_broker_receivers_.Add(
+      this, mojo::PendingReceiver<mojom::blink::DocumentInterfaceBroker>(
+                std::move(js_handle)));
+}
+
+mojo::ScopedMessagePipeHandle
+LocalFrameClientImpl::SetDocumentInterfaceBrokerForTesting(
+    mojo::ScopedMessagePipeHandle blink_handle) {
+  // Ensure all pending calls get dispatched before the implementation swap
+  document_interface_broker_receivers_.FlushForTesting();
+
+  mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker> test_broker(
+      std::move(blink_handle), mojom::blink::DocumentInterfaceBroker::Version_);
+
+  mojo::ScopedMessagePipeHandle real_handle =
+      document_interface_broker_.Unbind().PassPipe();
+  document_interface_broker_.Bind(std::move(test_broker));
+
+  return real_handle;
+}
+
 AssociatedInterfaceProvider*
 LocalFrameClientImpl::GetRemoteNavigationAssociatedInterfaces() {
   return web_frame_->Client()->GetRemoteNavigationAssociatedInterfaces();
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.h b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
index 51822fd3..38f5e390 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl.h
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
@@ -41,6 +41,7 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
@@ -58,7 +59,7 @@
 
 class LocalFrameClientImpl final : public LocalFrameClient {
  public:
-  explicit LocalFrameClientImpl(WebLocalFrameImpl*);
+  LocalFrameClientImpl(WebLocalFrameImpl*, mojo::ScopedMessagePipeHandle);
   ~LocalFrameClientImpl() override;
 
   void Trace(blink::Visitor*) override;
@@ -247,6 +248,21 @@
 
   service_manager::InterfaceProvider* GetInterfaceProvider() override;
 
+  // Binds |js_handle| to the current implementation bound to
+  // |document_interface_broker_| to share the same broker between C++ and
+  // JavaScript clients.
+  void BindDocumentInterfaceBroker(
+      mojo::ScopedMessagePipeHandle js_handle) override;
+
+  mojom::blink::DocumentInterfaceBroker* GetDocumentInterfaceBroker() override;
+
+  // Binds |document_interface_broker_| to |blink_handle|. Used in tests to set
+  // a custom override for DocumentInterfaceBroker methods. Returns the handle
+  // to the previously bound 'production' implementation, which will be used to
+  // forward the calls to methods that have not been overridden.
+  mojo::ScopedMessagePipeHandle SetDocumentInterfaceBrokerForTesting(
+      mojo::ScopedMessagePipeHandle blink_handle) override;
+
   blink::BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() override;
 
   AssociatedInterfaceProvider* GetRemoteNavigationAssociatedInterfaces()
@@ -302,6 +318,18 @@
       std::unique_ptr<blink::URLLoaderFactoryBundleInfo> info) override;
 
  private:
+  struct DocumentInterfaceBrokerForwarderTraits {
+    using Interface = mojom::blink::DocumentInterfaceBroker;
+    using PointerType = WeakPersistent<LocalFrameClientImpl>;
+    static bool IsNull(PointerType ptr) {
+      return !ptr || !ptr->document_interface_broker_;
+    }
+    static Interface* GetRawPointer(PointerType* ptr) {
+      return (*ptr)->GetDocumentInterfaceBroker();
+    }
+  };
+  friend struct DocumentInterfaceBrokerForwarderTraits;
+
   bool IsLocalFrameClientImpl() const override { return true; }
   WebDevToolsAgentImpl* DevToolsAgent();
 
@@ -311,6 +339,19 @@
 
   String user_agent_;
   blink::UserAgentMetadata user_agent_metadata_;
+
+  mojo::Remote<mojom::blink::DocumentInterfaceBroker>
+      document_interface_broker_;
+
+  // |document_interface_broker_receivers_| basically just forwards the broker
+  // methods to GetDocumentInterfaceBroker()
+  // via DocumentInterfaceBrokerForwarderTraits.
+  // Used to connect JavaScript clients of DocumentInterfaceBroker with the same
+  // implementation that |document_interface_broker_| is bound to.
+  mojo::ReceiverSetBase<mojo::Receiver<mojom::blink::DocumentInterfaceBroker,
+                                       DocumentInterfaceBrokerForwarderTraits>,
+                        void>
+      document_interface_broker_receivers_;
 };
 
 DEFINE_TYPE_CASTS(LocalFrameClientImpl,
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl_test.cc b/third_party/blink/renderer/core/exported/local_frame_client_impl_test.cc
index 72d5ced..6f9d0fe 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl_test.cc
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl_test.cc
@@ -39,6 +39,7 @@
 #include "third_party/blink/public/web/web_view.h"
 #include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
+#include "third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
@@ -110,5 +111,23 @@
   EXPECT_TRUE(default_user_agent.Equals(UserAgent()));
 }
 
+TEST_F(LocalFrameClientImplTest, TestDocumentInterfaceBrokerOverride) {
+  mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker> doc;
+  FrameHostTestDocumentInterfaceBroker frame_interface_broker(
+      &MainFrame()->GetFrame()->GetDocumentInterfaceBroker(),
+      doc.InitWithNewPipeAndPassReceiver());
+  MainFrame()->GetFrame()->SetDocumentInterfaceBrokerForTesting(doc.PassPipe());
+
+  mojo::Remote<mojom::blink::FrameHostTestInterface> frame_test;
+  MainFrame()
+      ->GetFrame()
+      ->GetDocumentInterfaceBroker()
+      .GetFrameHostTestInterface(frame_test.BindNewPipeAndPassReceiver());
+  frame_test->GetName(base::BindOnce([](const WTF::String& result) {
+    EXPECT_EQ(result, kGetNameTestResponse);
+  }));
+  frame_interface_broker.Flush();
+}
+
 }  // namespace
 }  // namespace blink
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 15c97a8..0a56e715 100644
--- a/third_party/blink/renderer/core/exported/web_frame_test.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -4226,6 +4226,7 @@
   // frame_test_helpers::TestWebFrameClient:
   void DidCommitProvisionalLoad(const WebHistoryItem&,
                                 WebHistoryCommitType,
+                                mojo::ScopedMessagePipeHandle,
                                 bool) override {
     Frame()->View()->ResetScrollAndScaleState();
   }
@@ -6351,6 +6352,7 @@
   // frame_test_helpers::TestWebFrameClient:
   void DidCommitProvisionalLoad(const WebHistoryItem&,
                                 WebHistoryCommitType,
+                                mojo::ScopedMessagePipeHandle,
                                 bool) override {
     did_load_ = true;
   }
@@ -9426,6 +9428,7 @@
   // frame_test_helpers::TestWebFrameClient:
   void DidCommitProvisionalLoad(const WebHistoryItem&,
                                 WebHistoryCommitType history_commit_type,
+                                mojo::ScopedMessagePipeHandle,
                                 bool) override {
     history_commit_type_ = history_commit_type;
     remote_frame_->Swap(Frame());
@@ -9653,6 +9656,7 @@
   // frame_test_helpers::TestWebFrameClient:
   void DidCommitProvisionalLoad(const WebHistoryItem&,
                                 WebHistoryCommitType history_commit_type,
+                                mojo::ScopedMessagePipeHandle,
                                 bool) override {
     history_commit_type_ = history_commit_type;
   }
@@ -10559,6 +10563,7 @@
   }
   void DidCommitProvisionalLoad(const WebHistoryItem&,
                                 WebHistoryCommitType,
+                                mojo::ScopedMessagePipeHandle,
                                 bool) override {
     EXPECT_EQ(2, callback_count_++);
   }
diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
index d464250..20baab55 100644
--- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
@@ -191,12 +191,14 @@
     const FramePolicy& frame_policy,
     WebLocalFrameClient* client,
     blink::InterfaceRegistry* interface_registry,
+    mojo::ScopedMessagePipeHandle document_interface_broker_handle,
     WebFrame* previous_sibling,
     const WebFrameOwnerProperties& frame_owner_properties,
     FrameOwnerElementType frame_owner_element_type,
     WebFrame* opener) {
-  auto* child = MakeGarbageCollected<WebLocalFrameImpl>(scope, client,
-                                                        interface_registry);
+  auto* child = MakeGarbageCollected<WebLocalFrameImpl>(
+      scope, client, interface_registry,
+      std::move(document_interface_broker_handle));
   child->SetOpener(opener);
   InsertAfter(child, previous_sibling);
   auto* owner = MakeGarbageCollected<RemoteFrameOwner>(
diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
index 74f8b63..3593f32 100644
--- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
+++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
@@ -63,6 +63,7 @@
                                   const FramePolicy&,
                                   WebLocalFrameClient*,
                                   blink::InterfaceRegistry*,
+                                  mojo::ScopedMessagePipeHandle,
                                   WebFrame* previous_sibling,
                                   const WebFrameOwnerProperties&,
                                   FrameOwnerElementType,
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 4eca1d7..2d236e4 100644
--- a/third_party/blink/renderer/core/exported/web_view_test.cc
+++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -49,6 +49,7 @@
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/common/frame/frame_owner_element_type.h"
 #include "third_party/blink/public/common/page/page_zoom.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
 #include "third_party/blink/public/platform/web_coalesced_input_event.h"
 #include "third_party/blink/public/platform/web_cursor_info.h"
@@ -506,7 +507,11 @@
 
   frame_test_helpers::TestWebFrameClient web_frame_client;
   WebLocalFrame* frame = WebLocalFrame::CreateMainFrame(
-      web_view, &web_frame_client, nullptr, nullptr);
+      web_view, &web_frame_client, nullptr,
+      mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver()
+          .PassPipe(),
+      nullptr);
   web_frame_client.Bind(frame);
 
   {
@@ -2642,7 +2647,11 @@
   frame_test_helpers::TestWebFrameClient web_frame_client;
   frame_test_helpers::TestWebWidgetClient web_widget_client;
   WebLocalFrame* local_frame = WebLocalFrame::CreateMainFrame(
-      web_view, &web_frame_client, nullptr, nullptr);
+      web_view, &web_frame_client, nullptr,
+      mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver()
+          .PassPipe(),
+      nullptr);
   web_frame_client.Bind(local_frame);
   blink::WebFrameWidget::CreateForMainFrame(&web_widget_client, local_frame);
 
diff --git a/third_party/blink/renderer/core/frame/event_handler_registry.cc b/third_party/blink/renderer/core/frame/event_handler_registry.cc
index a2ff7ebc..c15fda7 100644
--- a/third_party/blink/renderer/core/frame/event_handler_registry.cc
+++ b/third_party/blink/renderer/core/frame/event_handler_registry.cc
@@ -336,11 +336,12 @@
 
 void EventHandlerRegistry::Trace(blink::Visitor* visitor) {
   visitor->Trace(frame_);
-  visitor->template RegisterWeakMembers<
-      EventHandlerRegistry, &EventHandlerRegistry::ClearWeakMembers>(this);
+  visitor->template RegisterWeakCallbackMethod<
+      EventHandlerRegistry, &EventHandlerRegistry::ProcessCustomWeakness>(this);
 }
 
-void EventHandlerRegistry::ClearWeakMembers(Visitor* visitor) {
+void EventHandlerRegistry::ProcessCustomWeakness(
+    const WeakCallbackInfo& broker) {
   Vector<UntracedMember<EventTarget>> dead_targets;
   for (int i = 0; i < kEventHandlerClassCount; ++i) {
     EventHandlerClass handler_class = static_cast<EventHandlerClass>(i);
@@ -348,9 +349,9 @@
     for (const auto& event_target : *targets) {
       Node* node = event_target.key->ToNode();
       LocalDOMWindow* window = event_target.key->ToLocalDOMWindow();
-      if (node && !ThreadHeap::IsHeapObjectAlive(node)) {
+      if (node && !broker.IsHeapObjectAlive(node)) {
         dead_targets.push_back(node);
-      } else if (window && !ThreadHeap::IsHeapObjectAlive(window)) {
+      } else if (window && !broker.IsHeapObjectAlive(window)) {
         dead_targets.push_back(window);
       }
     }
diff --git a/third_party/blink/renderer/core/frame/event_handler_registry.h b/third_party/blink/renderer/core/frame/event_handler_registry.h
index 3c119318..06cbeef 100644
--- a/third_party/blink/renderer/core/frame/event_handler_registry.h
+++ b/third_party/blink/renderer/core/frame/event_handler_registry.h
@@ -79,7 +79,6 @@
   void DocumentDetached(Document&);
 
   void Trace(blink::Visitor*);
-  void ClearWeakMembers(Visitor*);
 
  private:
   enum ChangeOperation {
@@ -130,6 +129,8 @@
 
   Page* GetPage() const;
 
+  void ProcessCustomWeakness(const WeakCallbackInfo&);
+
   Member<LocalFrame> frame_;
   EventTargetSet targets_[kEventHandlerClassCount];
 };
diff --git a/third_party/blink/renderer/core/frame/frame_test.cc b/third_party/blink/renderer/core/frame/frame_test.cc
index 8fbde69..aa5e866 100644
--- a/third_party/blink/renderer/core/frame/frame_test.cc
+++ b/third_party/blink/renderer/core/frame/frame_test.cc
@@ -9,6 +9,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/core/dom/user_gesture_indicator.h"
 #include "third_party/blink/renderer/core/loader/document_loader.h"
+#include "third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h"
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
@@ -184,4 +185,23 @@
       LocalFrame::ConsumeTransientUserActivation(GetDocument().GetFrame()));
 }
 
+TEST_F(FrameTest, TestDocumentInterfaceBrokerOverride) {
+  mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker> doc;
+  FrameHostTestDocumentInterfaceBroker frame_interface_broker(
+      &GetDocument().GetFrame()->GetDocumentInterfaceBroker(),
+      doc.InitWithNewPipeAndPassReceiver());
+  GetDocument().GetFrame()->SetDocumentInterfaceBrokerForTesting(
+      doc.PassPipe());
+
+  mojo::Remote<mojom::blink::FrameHostTestInterface> frame_test;
+  GetDocument()
+      .GetFrame()
+      ->GetDocumentInterfaceBroker()
+      .GetFrameHostTestInterface(frame_test.BindNewPipeAndPassReceiver());
+  frame_test->GetName(base::BindOnce([](const WTF::String& result) {
+    EXPECT_EQ(result, kGetNameTestResponse);
+  }));
+  frame_interface_broker.Flush();
+}
+
 }  // namespace blink
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 e77c1f4..999e5c6 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -212,8 +212,11 @@
                                     TestWebFrameClient* client) {
   std::unique_ptr<TestWebFrameClient> owned_client;
   client = CreateDefaultClientIfNeeded(client, owned_client);
-  auto* frame =
-      To<WebLocalFrameImpl>(parent.CreateLocalChild(scope, client, nullptr));
+  auto* frame = To<WebLocalFrameImpl>(parent.CreateLocalChild(
+      scope, client, nullptr,
+      mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver()
+          .PassPipe()));
   client->Bind(frame, std::move(owned_client));
   return frame;
 }
@@ -224,8 +227,11 @@
     std::unique_ptr<TestWebFrameClient> self_owned) {
   DCHECK(self_owned);
   TestWebFrameClient* client = self_owned.get();
-  auto* frame =
-      To<WebLocalFrameImpl>(parent.CreateLocalChild(scope, client, nullptr));
+  auto* frame = To<WebLocalFrameImpl>(parent.CreateLocalChild(
+      scope, client, nullptr,
+      mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver()
+          .PassPipe()));
   client->Bind(frame, std::move(self_owned));
   return frame;
 }
@@ -235,7 +241,11 @@
   std::unique_ptr<TestWebFrameClient> owned_client;
   client = CreateDefaultClientIfNeeded(client, owned_client);
   auto* frame = To<WebLocalFrameImpl>(WebLocalFrame::CreateProvisional(
-      client, nullptr, &old_frame, FramePolicy()));
+      client, nullptr,
+      mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver()
+          .PassPipe(),
+      &old_frame, FramePolicy()));
   client->Bind(frame, std::move(owned_client));
   std::unique_ptr<TestWebWidgetClient> widget_client;
   // Create a local root, if necessary.
@@ -279,6 +289,9 @@
   client = CreateDefaultClientIfNeeded(client, owned_client);
   auto* frame = To<WebLocalFrameImpl>(parent.CreateLocalChild(
       WebTreeScopeType::kDocument, name, FramePolicy(), client, nullptr,
+      mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver()
+          .PassPipe(),
       previous_sibling, properties, FrameOwnerElementType::kIframe, nullptr));
   client->Bind(frame, std::move(owned_client));
 
@@ -343,7 +356,11 @@
   web_frame_client =
       CreateDefaultClientIfNeeded(web_frame_client, owned_web_frame_client);
   WebLocalFrame* frame = WebLocalFrame::CreateMainFrame(
-      web_view_, web_frame_client, nullptr, opener);
+      web_view_, web_frame_client, nullptr,
+      mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker>()
+          .InitWithNewPipeAndPassReceiver()
+          .PassPipe(),
+      opener);
   web_frame_client->Bind(frame, std::move(owned_web_frame_client));
 
   test_web_widget_client_ = CreateDefaultClientIfNeeded(
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 24ea8a0..2e89bd6 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -41,6 +41,7 @@
 #include "third_party/blink/public/common/frame/blocked_navigation_types.h"
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom-blink.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/mojom/frame/lifecycle.mojom-blink.h"
 #include "third_party/blink/public/platform/interface_provider.h"
 #include "third_party/blink/public/platform/interface_registry.h"
@@ -1134,11 +1135,30 @@
   return *Client()->GetInterfaceProvider();
 }
 
+void LocalFrame::BindDocumentInterfaceBroker(
+    mojo::ScopedMessagePipeHandle js_handle) {
+  DCHECK(Client());
+  Client()->BindDocumentInterfaceBroker(std::move(js_handle));
+}
+
+mojom::blink::DocumentInterfaceBroker&
+LocalFrame::GetDocumentInterfaceBroker() {
+  DCHECK(Client());
+  return *Client()->GetDocumentInterfaceBroker();
+}
+
 BrowserInterfaceBrokerProxy& LocalFrame::GetBrowserInterfaceBroker() {
   DCHECK(Client());
   return Client()->GetBrowserInterfaceBroker();
 }
 
+mojo::ScopedMessagePipeHandle LocalFrame::SetDocumentInterfaceBrokerForTesting(
+    mojo::ScopedMessagePipeHandle blink_handle) {
+  DCHECK(Client());
+  return Client()->SetDocumentInterfaceBrokerForTesting(
+      std::move(blink_handle));
+}
+
 AssociatedInterfaceProvider*
 LocalFrame::GetRemoteNavigationAssociatedInterfaces() {
   DCHECK(Client());
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index a5e3023a..0fdcfa4 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -40,6 +40,7 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/unique_receiver_set.h"
 #include "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom-blink.h"
 #include "third_party/blink/public/mojom/frame/lifecycle.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/loader/pause_subresource_loading_handle.mojom-blink-forward.h"
@@ -277,6 +278,10 @@
   bool CanNavigate(const Frame&, const KURL& destination_url = KURL());
 
   service_manager::InterfaceProvider& GetInterfaceProvider();
+  void BindDocumentInterfaceBroker(mojo::ScopedMessagePipeHandle js_handle);
+  mojom::blink::DocumentInterfaceBroker& GetDocumentInterfaceBroker();
+  mojo::ScopedMessagePipeHandle SetDocumentInterfaceBrokerForTesting(
+      mojo::ScopedMessagePipeHandle blink_handle);
 
   BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker();
 
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h
index 41e8871..12937e8 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client.h
+++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -84,6 +84,10 @@
 namespace blink {
 namespace mojom {
 enum class WebFeature : int32_t;
+
+namespace blink {
+class DocumentInterfaceBroker;
+}  // namespace blink
 }  // namespace mojom
 
 class AssociatedInterfaceProvider;
@@ -368,8 +372,28 @@
     return nullptr;
   }
 
+  // Binds |js_handle| to the currently bound implementation of
+  // DocumentInterfaceBroker to share the same broker between C++ and JavaScript
+  // clients.
+  virtual void BindDocumentInterfaceBroker(
+      mojo::ScopedMessagePipeHandle js_handle) {}
+
+  virtual mojom::blink::DocumentInterfaceBroker* GetDocumentInterfaceBroker() {
+    return nullptr;
+  }
+
   virtual BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() = 0;
 
+  // Used in tests to set a custom override for DocumentInterfaceBroker methods.
+  // |blink_handle| is bound to the test implementation on the caller side.
+  // Returns the handle to the previously bound 'production' implementation,
+  // which will be used to forward the calls to methods that have not been
+  // overridden.
+  virtual mojo::ScopedMessagePipeHandle SetDocumentInterfaceBrokerForTesting(
+      mojo::ScopedMessagePipeHandle blink_handle) {
+    return mojo::ScopedMessagePipeHandle();
+  }
+
   virtual AssociatedInterfaceProvider*
   GetRemoteNavigationAssociatedInterfaces() = 0;
 
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 75fecf47..41107ab9 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -1598,34 +1598,40 @@
     WebView* web_view,
     WebLocalFrameClient* client,
     InterfaceRegistry* interface_registry,
+    mojo::ScopedMessagePipeHandle document_interface_broker_handle,
     WebFrame* opener,
     const WebString& name,
     WebSandboxFlags sandbox_flags,
     const FeaturePolicy::FeatureState& opener_feature_state) {
   return WebLocalFrameImpl::CreateMainFrame(
-      web_view, client, interface_registry, opener, name, sandbox_flags,
+      web_view, client, interface_registry,
+      std::move(document_interface_broker_handle), opener, name, sandbox_flags,
       opener_feature_state);
 }
 
 WebLocalFrame* WebLocalFrame::CreateProvisional(
     WebLocalFrameClient* client,
     InterfaceRegistry* interface_registry,
+    mojo::ScopedMessagePipeHandle document_interface_broker_handle,
     WebFrame* previous_frame,
     const FramePolicy& frame_policy) {
-  return WebLocalFrameImpl::CreateProvisional(client, interface_registry,
-                                              previous_frame, frame_policy);
+  return WebLocalFrameImpl::CreateProvisional(
+      client, interface_registry, std::move(document_interface_broker_handle),
+      previous_frame, frame_policy);
 }
 
 WebLocalFrameImpl* WebLocalFrameImpl::CreateMainFrame(
     WebView* web_view,
     WebLocalFrameClient* client,
     InterfaceRegistry* interface_registry,
+    mojo::ScopedMessagePipeHandle document_interface_broker_handle,
     WebFrame* opener,
     const WebString& name,
     WebSandboxFlags sandbox_flags,
     const FeaturePolicy::FeatureState& opener_feature_state) {
   WebLocalFrameImpl* frame = MakeGarbageCollected<WebLocalFrameImpl>(
-      WebTreeScopeType::kDocument, client, interface_registry);
+      WebTreeScopeType::kDocument, client, interface_registry,
+      std::move(document_interface_broker_handle));
   frame->SetOpener(opener);
   Page& page = *static_cast<WebViewImpl*>(web_view)->GetPage();
   DCHECK(!page.MainFrame());
@@ -1639,13 +1645,14 @@
 WebLocalFrameImpl* WebLocalFrameImpl::CreateProvisional(
     WebLocalFrameClient* client,
     blink::InterfaceRegistry* interface_registry,
+    mojo::ScopedMessagePipeHandle document_interface_broker_handle,
     WebFrame* previous_web_frame,
     const FramePolicy& frame_policy) {
   DCHECK(client);
   auto* web_frame = MakeGarbageCollected<WebLocalFrameImpl>(
       previous_web_frame->InShadowTree() ? WebTreeScopeType::kShadow
                                          : WebTreeScopeType::kDocument,
-      client, interface_registry);
+      client, interface_registry, std::move(document_interface_broker_handle));
   Frame* previous_frame = ToCoreFrame(*previous_web_frame);
   web_frame->SetParent(previous_web_frame->Parent());
   web_frame->SetOpener(previous_web_frame->Opener());
@@ -1690,9 +1697,11 @@
 WebLocalFrameImpl* WebLocalFrameImpl::CreateLocalChild(
     WebTreeScopeType scope,
     WebLocalFrameClient* client,
-    blink::InterfaceRegistry* interface_registry) {
+    blink::InterfaceRegistry* interface_registry,
+    mojo::ScopedMessagePipeHandle document_interface_broker_handle) {
   WebLocalFrameImpl* frame = MakeGarbageCollected<WebLocalFrameImpl>(
-      scope, client, interface_registry);
+      scope, client, interface_registry,
+      std::move(document_interface_broker_handle));
   AppendChild(frame);
   return frame;
 }
@@ -1700,10 +1709,13 @@
 WebLocalFrameImpl::WebLocalFrameImpl(
     WebTreeScopeType scope,
     WebLocalFrameClient* client,
-    blink::InterfaceRegistry* interface_registry)
+    blink::InterfaceRegistry* interface_registry,
+    mojo::ScopedMessagePipeHandle document_interface_broker_handle)
     : WebNavigationControl(scope),
       client_(client),
-      local_frame_client_(MakeGarbageCollected<LocalFrameClientImpl>(this)),
+      local_frame_client_(MakeGarbageCollected<LocalFrameClientImpl>(
+          this,
+          std::move(document_interface_broker_handle))),
       autofill_client_(nullptr),
       find_in_page_(
           MakeGarbageCollected<FindInPage>(*this, interface_registry)),
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
index ef0067c..7313ce1e 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -103,7 +103,8 @@
   // WebLocalFrame overrides:
   WebLocalFrameImpl* CreateLocalChild(WebTreeScopeType,
                                       WebLocalFrameClient*,
-                                      blink::InterfaceRegistry*) override;
+                                      blink::InterfaceRegistry*,
+                                      mojo::ScopedMessagePipeHandle) override;
   WebLocalFrameClient* Client() const override { return client_; }
   void SetAutofillClient(WebAutofillClient*) override;
   WebAutofillClient* AutofillClient() override;
@@ -354,18 +355,21 @@
   static WebLocalFrameImpl* CreateMainFrame(WebView*,
                                             WebLocalFrameClient*,
                                             InterfaceRegistry*,
+                                            mojo::ScopedMessagePipeHandle,
                                             WebFrame* opener,
                                             const WebString& name,
                                             WebSandboxFlags,
                                             const FeaturePolicy::FeatureState&);
   static WebLocalFrameImpl* CreateProvisional(WebLocalFrameClient*,
                                               InterfaceRegistry*,
+                                              mojo::ScopedMessagePipeHandle,
                                               WebFrame*,
                                               const FramePolicy&);
 
   WebLocalFrameImpl(WebTreeScopeType,
                     WebLocalFrameClient*,
-                    blink::InterfaceRegistry*);
+                    blink::InterfaceRegistry*,
+                    mojo::ScopedMessagePipeHandle);
   ~WebLocalFrameImpl() override;
 
   LocalFrame* CreateChildFrame(const AtomicString& name,
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
index 61e63d3..c8454e99 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -1357,7 +1357,7 @@
 
   // A non-interactive table, caption, thead, tbody, tfoot, tr, td, or th
   // element.
-  if (IsHTMLTableElement(element) ||
+  if (IsA<HTMLTableElement>(element) ||
       element.HasTagName(html_names::kCaptionTag) ||
       element.HasTagName(html_names::kTheadTag) ||
       element.HasTagName(html_names::kTbodyTag) ||
diff --git a/third_party/blink/renderer/core/html/html_table_part_element.cc b/third_party/blink/renderer/core/html/html_table_part_element.cc
index fa6b910..c9e312b 100644
--- a/third_party/blink/renderer/core/html/html_table_part_element.cc
+++ b/third_party/blink/renderer/core/html/html_table_part_element.cc
@@ -113,9 +113,9 @@
 
 HTMLTableElement* HTMLTablePartElement::FindParentTable() const {
   ContainerNode* parent = FlatTreeTraversal::Parent(*this);
-  while (parent && !IsHTMLTableElement(*parent))
+  while (parent && !IsA<HTMLTableElement>(*parent))
     parent = FlatTreeTraversal::Parent(*parent);
-  return ToHTMLTableElement(parent);
+  return To<HTMLTableElement>(parent);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_table_row_element.cc b/third_party/blink/renderer/core/html/html_table_row_element.cc
index 6160091..23556c2 100644
--- a/third_party/blink/renderer/core/html/html_table_row_element.cc
+++ b/third_party/blink/renderer/core/html/html_table_row_element.cc
@@ -67,10 +67,10 @@
     // Skip THEAD, TBODY and TFOOT.
     maybe_table = maybe_table->parentNode();
   }
-  if (!(maybe_table && IsHTMLTableElement(maybe_table)))
+  auto* html_table_element = DynamicTo<HTMLTableElement>(maybe_table);
+  if (!html_table_element)
     return -1;
-  return FindIndexInRowCollection(*ToHTMLTableElement(maybe_table)->rows(),
-                                  *this);
+  return FindIndexInRowCollection(*html_table_element->rows(), *this);
 }
 
 int HTMLTableRowElement::sectionRowIndex() const {
@@ -80,7 +80,7 @@
   HTMLCollection* rows = nullptr;
   if (auto* section = ToHTMLTableSectionElementOrNull(maybe_table))
     rows = section->rows();
-  else if (auto* table = ToHTMLTableElementOrNull(maybe_table))
+  else if (auto* table = DynamicTo<HTMLTableElement>(maybe_table))
     rows = table->rows();
   if (!rows)
     return -1;
diff --git a/third_party/blink/renderer/core/html/html_table_rows_collection.cc b/third_party/blink/renderer/core/html/html_table_rows_collection.cc
index 1f341263..2235f2dd 100644
--- a/third_party/blink/renderer/core/html/html_table_rows_collection.cc
+++ b/third_party/blink/renderer/core/html/html_table_rows_collection.cc
@@ -141,7 +141,7 @@
 // evaluation is undefined and can differ between compilers.
 HTMLTableRowsCollection::HTMLTableRowsCollection(ContainerNode& table)
     : HTMLCollection(table, kTableRows, kOverridesItemAfter) {
-  DCHECK(IsHTMLTableElement(table));
+  DCHECK(IsA<HTMLTableElement>(table));
 }
 
 HTMLTableRowsCollection::HTMLTableRowsCollection(ContainerNode& table,
@@ -151,7 +151,7 @@
 }
 
 Element* HTMLTableRowsCollection::VirtualItemAfter(Element* previous) const {
-  return RowAfter(ToHTMLTableElement(ownerNode()),
+  return RowAfter(To<HTMLTableElement>(ownerNode()),
                   ToHTMLTableRowElement(previous));
 }
 
diff --git a/third_party/blink/renderer/core/inspector/network_resources_data.cc b/third_party/blink/renderer/core/inspector/network_resources_data.cc
index 9b854a6..0530b05 100644
--- a/third_party/blink/renderer/core/inspector/network_resources_data.cc
+++ b/third_party/blink/renderer/core/inspector/network_resources_data.cc
@@ -92,9 +92,9 @@
 void NetworkResourcesData::ResourceData::Trace(blink::Visitor* visitor) {
   visitor->Trace(network_resources_data_);
   visitor->Trace(xhr_replay_data_);
-  visitor->template RegisterWeakMembers<
+  visitor->template RegisterWeakCallbackMethod<
       NetworkResourcesData::ResourceData,
-      &NetworkResourcesData::ResourceData::ClearWeakMembers>(this);
+      &NetworkResourcesData::ResourceData::ProcessCustomWeakness>(this);
 }
 
 void NetworkResourcesData::ResourceData::SetContent(const String& content,
@@ -142,8 +142,9 @@
   cached_resource_ = cached_resource;
 }
 
-void NetworkResourcesData::ResourceData::ClearWeakMembers(Visitor* visitor) {
-  if (!cached_resource_ || ThreadHeap::IsHeapObjectAlive(cached_resource_))
+void NetworkResourcesData::ResourceData::ProcessCustomWeakness(
+    const WeakCallbackInfo& broker) {
+  if (!cached_resource_ || broker.IsHeapObjectAlive(cached_resource_))
     return;
 
   // Mark loaded resources or resources without the buffer as loaded.
diff --git a/third_party/blink/renderer/core/inspector/network_resources_data.h b/third_party/blink/renderer/core/inspector/network_resources_data.h
index 0a4c41a3..a80765f 100644
--- a/third_party/blink/renderer/core/inspector/network_resources_data.h
+++ b/third_party/blink/renderer/core/inspector/network_resources_data.h
@@ -182,7 +182,7 @@
     uint64_t DataLength() const;
     void AppendData(const char* data, size_t data_length);
     size_t DecodeDataToContent();
-    void ClearWeakMembers(Visitor*);
+    void ProcessCustomWeakness(const WeakCallbackInfo&);
 
     Member<NetworkResourcesData> network_resources_data_;
     String request_id_;
@@ -203,7 +203,7 @@
     int64_t pending_encoded_data_length_;
 
     scoped_refptr<SharedBuffer> buffer_;
-    WeakMember<const Resource> cached_resource_;
+    UntracedMember<const Resource> cached_resource_;
     scoped_refptr<BlobDataHandle> downloaded_file_blob_;
     Vector<AtomicString> certificate_;
     scoped_refptr<EncodedFormData> post_data_;
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
index fab611c..b3342cd5 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
@@ -282,8 +282,9 @@
   }
 }
 
-void IntersectionObserver::ClearWeakMembers(Visitor* visitor) {
-  if (RootIsImplicit() || (root() && ThreadHeap::IsHeapObjectAlive(root())))
+void IntersectionObserver::ProcessCustomWeakness(
+    const WeakCallbackInfo& broker) {
+  if (RootIsImplicit() || (root() && broker.IsHeapObjectAlive(root())))
     return;
   DummyExceptionStateForTesting exception_state;
   disconnect(exception_state);
@@ -441,8 +442,8 @@
 }
 
 void IntersectionObserver::Trace(blink::Visitor* visitor) {
-  visitor->template RegisterWeakMembers<
-      IntersectionObserver, &IntersectionObserver::ClearWeakMembers>(this);
+  visitor->template RegisterWeakCallbackMethod<
+      IntersectionObserver, &IntersectionObserver::ProcessCustomWeakness>(this);
   visitor->Trace(delegate_);
   visitor->Trace(observations_);
   ScriptWrappable::Trace(visitor);
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer.h b/third_party/blink/renderer/core/intersection_observer/intersection_observer.h
index b02f353..44f632cd 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_observer.h
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer.h
@@ -163,10 +163,10 @@
   static void SetThrottleDelayEnabledForTesting(bool);
 
  private:
-  void ClearWeakMembers(Visitor*);
+  void ProcessCustomWeakness(const WeakCallbackInfo&);
 
   const Member<IntersectionObserverDelegate> delegate_;
-  WeakMember<Element> root_;
+  UntracedMember<Element> root_;
   HeapLinkedHashSet<WeakMember<IntersectionObservation>> observations_;
   Vector<float> thresholds_;
   DOMHighResTimeStamp delay_;
diff --git a/third_party/blink/renderer/core/layout/layout_flexible_box.cc b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
index d9ceaf12..fe08524c 100644
--- a/third_party/blink/renderer/core/layout/layout_flexible_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
@@ -761,7 +761,7 @@
         child.ContainingBlockLogicalHeightForPercentageResolution(&cb) != -1;
     if (add_to_cb)
       cb->AddPercentHeightDescendant(const_cast<LayoutBox*>(&child));
-    if (in_layout_) {
+    if (in_layout_ && !child.HasOverrideContainingBlockContentLogicalHeight()) {
       // We can reach this code even while we're not laying ourselves out, such
       // as from mainSizeForPercentageResolution.
       has_definite_height_ = definite ? SizeDefiniteness::kDefinite
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index 02c9e180..67aa26be 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3598,7 +3598,7 @@
       break;
 
     if (!IsPositioned() &&
-        (IsHTMLTableElement(*node) || IsHTMLTableCellElement(*node)))
+        (IsA<HTMLTableElement>(*node) || IsHTMLTableCellElement(*node)))
       break;
 
     // Webkit specific extension where offsetParent stops at zoom level changes.
diff --git a/third_party/blink/renderer/core/layout/layout_table.cc b/third_party/blink/renderer/core/layout/layout_table.cc
index 0ab4d60..33333b6b 100644
--- a/third_party/blink/renderer/core/layout/layout_table.cc
+++ b/third_party/blink/renderer/core/layout/layout_table.cc
@@ -447,7 +447,7 @@
   // HTML tables' width styles already include borders and paddings, but CSS
   // tables' width styles do not.
   LayoutUnit borders;
-  bool is_css_table = !IsHTMLTableElement(GetNode());
+  bool is_css_table = !IsA<HTMLTableElement>(GetNode());
   if (is_css_table && style_logical_width.IsSpecified() &&
       style_logical_width.IsPositive() &&
       StyleRef().BoxSizing() == EBoxSizing::kContentBox) {
@@ -475,7 +475,7 @@
     LayoutUnit borders = LayoutUnit();
     // FIXME: We cannot apply box-sizing: content-box on <table> which other
     // browsers allow.
-    if (IsHTMLTableElement(GetNode()) ||
+    if (IsA<HTMLTableElement>(GetNode()) ||
         StyleRef().BoxSizing() == EBoxSizing::kBorderBox) {
       borders = border_and_padding;
     }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
index 89a2826..d3a36e29 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
@@ -843,13 +843,13 @@
 }
 
 void NGInlineCursor::MoveToPreviousLine() {
+  // Note: List marker is sibling of line box.
   DCHECK(IsLineBox());
   if (current_paint_fragment_) {
-    // TODO(yosin): We should implement |PreviousLineOf()| here.
-    if (auto* paint_fragment =
-            NGPaintFragmentTraversal::PreviousLineOf(*current_paint_fragment_))
-      return MoveTo(*paint_fragment);
-    return MakeNull();
+    do {
+      MoveToPreviousSiblingPaintFragment();
+    } while (IsNotNull() && !IsLineBox());
+    return;
   }
   if (current_item_) {
     do {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index f12452e..b787fe72 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -975,7 +975,7 @@
 
   if (NGFragmentItemsBuilder* items_builder = context_->ItemsBuilder()) {
     DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
-    container_builder_.AddOutOfFlowChildren(line_box_);
+    container_builder_.PropagateChildrenData(line_box_);
     scoped_refptr<const NGLayoutResult> layout_result =
         container_builder_.ToLineBoxFragment();
     if (items_builder->TextContent(false).IsNull())
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc
index 4264b98d..8bee981 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc
@@ -108,9 +108,12 @@
   }
 }
 
-void NGLineBoxFragmentBuilder::AddOutOfFlowChildren(ChildList& children) {
+void NGLineBoxFragmentBuilder::PropagateChildrenData(ChildList& children) {
   for (auto& child : children) {
-    if (child.out_of_flow_positioned_box) {
+    if (child.layout_result) {
+      DCHECK(!child.fragment);
+      PropagateChildData(child.layout_result->PhysicalFragment(), child.offset);
+    } else if (child.out_of_flow_positioned_box) {
       AddOutOfFlowChildCandidate(
           NGBlockNode(ToLayoutBox(child.out_of_flow_positioned_box)),
           child.offset, child.container_direction);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
index d7320dd..0080781 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
@@ -253,10 +253,10 @@
   // Add all items in ChildList. Skips null Child if any.
   void AddChildren(ChildList&);
 
-  // Add only out-of-flow items in ChildList. TODO(kojii): When |NGFragmentItem|
-  // is on, all objects should go to |NGFragmentItems| but OOF still uses
-  // fragments to propagate while in transition.
-  void AddOutOfFlowChildren(ChildList&);
+  // Propagate data in |ChildList| without adding them to this builder. When
+  // adding children as fragment items, they appear in the container, but there
+  // are some data that should be propagated through line box fragments.
+  void PropagateChildrenData(ChildList&);
 
   // Creates the fragment. Can only be called once.
   scoped_refptr<const NGLayoutResult> ToLineBoxFragment();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index 5d072687..f0a75462 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -312,6 +312,9 @@
   // TODO(crbug.com/992953): Add a simplified layout pass for custom layout.
   if (cache_status == NGLayoutCacheStatus::kNeedsSimplifiedLayout &&
       block_flow && !GetFlowThread(block_flow) &&
+      // TODO(kojii): Enable simplified layout for fragment items.
+      !(block_flow->ChildrenInline() &&
+        RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) &&
       !block_flow->IsLayoutNGCustom()) {
     // A child may have changed size while performing "simplified" layout (it
     // may have gained or removed scrollbars, changing its size). In these
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
index b08fc69..d1231c5d 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
@@ -28,6 +28,16 @@
     const NGPhysicalContainerFragment& child,
     const LogicalOffset& child_offset,
     const LayoutInline* inline_container) {
+  PropagateChildData(child, child_offset, inline_container);
+  AddChildInternal(&child, child_offset);
+}
+
+// Propagate data in |child| to this fragment. The |child| will then be added as
+// a child fragment or a child fragment item.
+void NGContainerFragmentBuilder::PropagateChildData(
+    const NGPhysicalContainerFragment& child,
+    const LogicalOffset& child_offset,
+    const LayoutInline* inline_container) {
   // Collect the child's out of flow descendants.
   // child_offset is offset of inline_start/block_start vertex.
   // Candidates need offset of top/left vertex.
@@ -138,8 +148,6 @@
       }
     }
   }
-
-  AddChildInternal(&child, child_offset);
 }
 
 void NGContainerFragmentBuilder::AddChildInternal(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
index 209039c7..3e151c9 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
@@ -193,6 +193,10 @@
     layout_object_ = node.GetLayoutBox();
   }
 
+  void PropagateChildData(const NGPhysicalContainerFragment& child,
+                          const LogicalOffset& child_offset,
+                          const LayoutInline* inline_container = nullptr);
+
   void AddChildInternal(scoped_refptr<const NGPhysicalFragment>,
                         const LogicalOffset&);
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
index 5954f3ab..22bca26 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
@@ -66,6 +66,9 @@
   DCHECK(is_column_);
   // If this flex container is also a flex item, it might have a definite size
   // imposed on it by its parent flex container.
+  // We can't rely on BlockLengthUnresolvable for this case because that
+  // considers Auto as unresolvable even when the block size is fixed and
+  // definite.
   if (ConstraintSpace().IsFixedBlockSize() &&
       !ConstraintSpace().IsFixedBlockSizeIndefinite())
     return true;
@@ -80,6 +83,8 @@
     return true;
   // If this flex container is also a flex item, it might have a definite size
   // imposed on it by its parent flex container.
+  // TODO(dgrogan): Removing this check doesn't cause any tests to fail. Remove
+  // it if unneeded or add a test that needs it.
   if (ConstraintSpace().IsFixedBlockSize() &&
       !ConstraintSpace().IsFixedBlockSizeIndefinite())
     return true;
@@ -216,10 +221,9 @@
     }
   }
 
-  // TODO(dgrogan): Change SetPercentageResolutionSize everywhere in this file
-  // to use CalculateChildPercentageSize.
   space_builder.SetAvailableSize(content_box_size_);
-  space_builder.SetPercentageResolutionSize(content_box_size_);
+  space_builder.SetPercentageResolutionSize(CalculateChildPercentageSize(
+      ConstraintSpace(), Node(), content_box_size_));
   return space_builder.ToConstraintSpace();
 }
 
@@ -558,13 +562,19 @@
       }
 
       space_builder.SetAvailableSize(available_size);
+      // CalculateChildPercentageSize probably has no effect here:
+      // content_box_size_ would already be indefinite without
+      // CalculateChildPercentageSize checking IsFixedBlockSizeIndefinite.
+      space_builder.SetPercentageResolutionSize(CalculateChildPercentageSize(
+          ConstraintSpace(), Node(), content_box_size_));
+
       // https://drafts.csswg.org/css-flexbox/#algo-cross-item
       // Determine the hypothetical cross size of each item by performing layout
       // with the used main size and the available space, treating auto as
       // fit-content.
       if (ShouldItemShrinkToFit(flex_item.ng_input_node))
         space_builder.SetIsShrinkToFit(true);
-      space_builder.SetPercentageResolutionSize(content_box_size_);
+
       NGConstraintSpace child_space = space_builder.ToConstraintSpace();
       flex_item.layout_result =
           flex_item.ng_input_node.Layout(child_space, nullptr /*break token*/);
@@ -616,7 +626,8 @@
     }
   }
   space_builder.SetAvailableSize(available_size);
-  space_builder.SetPercentageResolutionSize(content_box_size_);
+  space_builder.SetPercentageResolutionSize(CalculateChildPercentageSize(
+      ConstraintSpace(), Node(), content_box_size_));
   space_builder.SetIsFixedInlineSize(true);
   space_builder.SetIsFixedBlockSize(true);
   NGConstraintSpace child_space = space_builder.ToConstraintSpace();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
index d15d0fc..330e366 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
@@ -96,9 +96,6 @@
     if (phase == LengthResolvePhase::kIntrinsic)
       return true;
 
-    // TODO(dgrogan): Make this account for constraint_space.IsFixedSizeBlock &&
-    // constraint_space.IsFixedBlockSizeIndefinite?
-
     LayoutUnit percentage_resolution_block_size =
         opt_percentage_resolution_block_size_for_min_max
             ? *opt_percentage_resolution_block_size_for_min_max
diff --git a/third_party/blink/renderer/core/loader/empty_clients.cc b/third_party/blink/renderer/core/loader/empty_clients.cc
index cf9c781..2cc6662 100644
--- a/third_party/blink/renderer/core/loader/empty_clients.cc
+++ b/third_party/blink/renderer/core/loader/empty_clients.cc
@@ -120,6 +120,26 @@
                                               std::move(navigation_params));
 }
 
+mojom::blink::DocumentInterfaceBroker*
+EmptyLocalFrameClient::GetDocumentInterfaceBroker() {
+  if (!document_interface_broker_.is_bound())
+    ignore_result(document_interface_broker_.BindNewPipeAndPassReceiver());
+  return document_interface_broker_.get();
+}
+
+mojo::ScopedMessagePipeHandle
+EmptyLocalFrameClient::SetDocumentInterfaceBrokerForTesting(
+    mojo::ScopedMessagePipeHandle blink_handle) {
+  mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker> test_broker(
+      std::move(blink_handle), mojom::blink::DocumentInterfaceBroker::Version_);
+
+  mojo::ScopedMessagePipeHandle real_handle =
+      document_interface_broker_.Unbind().PassPipe();
+  document_interface_broker_.Bind(std::move(test_broker));
+
+  return real_handle;
+}
+
 LocalFrame* EmptyLocalFrameClient::CreateFrame(const AtomicString&,
                                                HTMLFrameOwnerElement*) {
   return nullptr;
diff --git a/third_party/blink/renderer/core/loader/empty_clients.h b/third_party/blink/renderer/core/loader/empty_clients.h
index 2d0434f..583983c 100644
--- a/third_party/blink/renderer/core/loader/empty_clients.h
+++ b/third_party/blink/renderer/core/loader/empty_clients.h
@@ -37,6 +37,7 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/public/platform/web_menu_source_type.h"
@@ -381,6 +382,10 @@
     return &interface_provider_;
   }
 
+  mojom::blink::DocumentInterfaceBroker* GetDocumentInterfaceBroker() override;
+  mojo::ScopedMessagePipeHandle SetDocumentInterfaceBrokerForTesting(
+      mojo::ScopedMessagePipeHandle blink_handle) override;
+
   BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() override {
     return GetEmptyBrowserInterfaceBroker();
   }
@@ -430,6 +435,8 @@
   WebTextCheckClient* text_check_client_;
 
   service_manager::InterfaceProvider interface_provider_;
+  mojo::Remote<mojom::blink::DocumentInterfaceBroker>
+      document_interface_broker_;
 
   DISALLOW_COPY_AND_ASSIGN(EmptyLocalFrameClient);
 };
diff --git a/third_party/blink/renderer/core/mojo/mojo.cc b/third_party/blink/renderer/core/mojo/mojo.cc
index aab3fa5c..6a22d23 100644
--- a/third_party/blink/renderer/core/mojo/mojo.cc
+++ b/third_party/blink/renderer/core/mojo/mojo.cc
@@ -9,6 +9,7 @@
 
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/platform/interface_provider.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/core/dom/document.h"
@@ -127,4 +128,32 @@
   }
 }
 
+// static
+MojoHandle* Mojo::getDocumentInterfaceBrokerHandle(ScriptState* script_state) {
+  ExecutionContext* execution_context = ExecutionContext::From(script_state);
+  DCHECK(execution_context);
+  Document* document = static_cast<Document*>(execution_context);
+  DCHECK(document);
+
+  mojo::MessagePipe pipe;
+  document->BindDocumentInterfaceBroker(std::move(pipe.handle0));
+  return MakeGarbageCollected<MojoHandle>(
+      mojo::ScopedHandle::From(std::move(pipe.handle1)));
+}
+
+// static
+MojoHandle* Mojo::replaceDocumentInterfaceBrokerForTesting(
+    ScriptState* script_state,
+    MojoHandle* test_broker_handle) {
+  ExecutionContext* execution_context = ExecutionContext::From(script_state);
+  DCHECK(execution_context);
+  Document* document = static_cast<Document*>(execution_context);
+  DCHECK(document);
+
+  return MakeGarbageCollected<MojoHandle>(
+      mojo::ScopedHandle::From(document->SetDocumentInterfaceBrokerForTesting(
+          mojo::ScopedMessagePipeHandle(mojo::MessagePipeHandle(
+              test_broker_handle->TakeHandle().release().value())))));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/mojo/mojo.h b/third_party/blink/renderer/core/mojo/mojo.h
index b0e8b78..4fe5d108 100644
--- a/third_party/blink/renderer/core/mojo/mojo.h
+++ b/third_party/blink/renderer/core/mojo/mojo.h
@@ -56,6 +56,9 @@
                             MojoHandle*,
                             const String& scope,
                             bool use_browser_interface_broker);
+  static MojoHandle* getDocumentInterfaceBrokerHandle(ScriptState*);
+  static MojoHandle* replaceDocumentInterfaceBrokerForTesting(ScriptState*,
+                                                              MojoHandle*);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/mojo/mojo.idl b/third_party/blink/renderer/core/mojo/mojo.idl
index 9bfcfc6..7bcfb127d 100644
--- a/third_party/blink/renderer/core/mojo/mojo.idl
+++ b/third_party/blink/renderer/core/mojo/mojo.idl
@@ -47,4 +47,6 @@
     static MojoCreateSharedBufferResult createSharedBuffer(unsigned long numBytes);
 
     [CallWith=ScriptState] static void bindInterface(DOMString interfaceName, MojoHandle request_handle, optional MojoScope scope = "context", optional boolean useBrowserInterfaceBroker = false);
+    [CallWith=ScriptState] static MojoHandle getDocumentInterfaceBrokerHandle();
+    [CallWith=ScriptState] static MojoHandle replaceDocumentInterfaceBrokerForTesting(MojoHandle test_broker_handle);
 };
diff --git a/third_party/blink/renderer/core/page/spatial_navigation_controller.cc b/third_party/blink/renderer/core/page/spatial_navigation_controller.cc
index 57746336..964b2076 100644
--- a/third_party/blink/renderer/core/page/spatial_navigation_controller.cc
+++ b/third_party/blink/renderer/core/page/spatial_navigation_controller.cc
@@ -457,10 +457,10 @@
     element = interest_element_;
   }
 
-  DispatchMouseMoveAt(element);
-
-  if (!element)
+  if (!element) {
+    DispatchMouseMoveAt(nullptr);
     return;
+  }
 
   // Before focusing the new element, check if we're leaving an iframe (= moving
   // focus out of an iframe). In this case, we want the exited [nested] iframes
@@ -470,6 +470,7 @@
 
   element->focus(FocusParams(SelectionBehaviorOnFocus::kReset,
                              kWebFocusTypeSpatialNavigation, nullptr));
+  DispatchMouseMoveAt(element);
 }
 
 void SpatialNavigationController::DispatchMouseMoveAt(Element* element) {
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
index 533edd64..6cf8252 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -383,9 +383,9 @@
       (!physical_box_fragment.Children().empty() ||
        physical_box_fragment.HasItems()) &&
       !paint_info.DescendantPaintingBlocked()) {
-    if (physical_box_fragment.ChildrenInline()) {
-      DCHECK(paint_fragment_ || PhysicalFragment().HasItems());
-      if (paint_phase != PaintPhase::kFloat) {
+    if (paint_phase != PaintPhase::kFloat) {
+      if (physical_box_fragment.ChildrenInline()) {
+        DCHECK(paint_fragment_ || PhysicalFragment().HasItems());
         if (physical_box_fragment.IsBlockFlow()) {
           PaintBlockFlowContents(paint_info, paint_offset);
         } else if (ShouldPaintDescendantOutlines(paint_info.phase)) {
@@ -398,25 +398,17 @@
           PaintInlineChildren(paint_fragment_->Children(), paint_info,
                               paint_offset);
         }
-      }
-
-      if (paint_phase == PaintPhase::kFloat ||
-          paint_phase == PaintPhase::kSelection ||
-          paint_phase == PaintPhase::kTextClip) {
-        if (physical_box_fragment.HasFloatingDescendantsForPaint())
-          PaintFloats(paint_info);
-      }
-    } else {
-      if (paint_phase != PaintPhase::kFloat)
+      } else {
         PaintBlockChildren(paint_info);
-
-      if (paint_phase == PaintPhase::kFloat ||
-          paint_phase == PaintPhase::kSelection ||
-          paint_phase == PaintPhase::kTextClip) {
-        if (physical_box_fragment.HasFloatingDescendantsForPaint())
-          PaintFloats(paint_info);
       }
     }
+
+    if (paint_phase == PaintPhase::kFloat ||
+        paint_phase == PaintPhase::kSelection ||
+        paint_phase == PaintPhase::kTextClip) {
+      if (physical_box_fragment.HasFloatingDescendantsForPaint())
+        PaintFloats(paint_info);
+    }
   }
 
   if (ShouldPaintSelfOutline(paint_phase)) {
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.cc
index 1ea391d9..9714f1c 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.cc
@@ -150,22 +150,6 @@
   return InlineDescendantsRange(container);
 }
 
-NGPaintFragment* NGPaintFragmentTraversal::PreviousLineOf(
-    const NGPaintFragment& line) {
-  DCHECK(line.PhysicalFragment().IsLineBox());
-  NGPaintFragment* parent = line.Parent();
-  DCHECK(parent);
-  NGPaintFragment* previous_line = nullptr;
-  for (NGPaintFragment* sibling : parent->Children()) {
-    if (sibling == &line)
-      return previous_line;
-    if (sibling->PhysicalFragment().IsLineBox())
-      previous_line = sibling;
-  }
-  NOTREACHED();
-  return nullptr;
-}
-
 void NGPaintFragmentTraversal::MoveToFirstChild() {
   DCHECK(current_->FirstChild());
   current_ = current_->FirstChild();
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.h b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.h
index 4e26682..7fbbe34 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.h
+++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.h
@@ -173,10 +173,6 @@
   static InlineDescendantsRange InlineDescendantsOf(
       const NGPaintFragment& container);
 
-  // Returns the line box paint fragment of |line|. |line| itself must be the
-  // paint fragment of a line box.
-  static NGPaintFragment* PreviousLineOf(const NGPaintFragment& line);
-
  private:
   void EnsureIndex();
   bool IsInlineLeaf() const;
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal_test.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal_test.cc
index 30d15d5..e4e8110 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal_test.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal_test.cc
@@ -180,23 +180,6 @@
               ElementsAreArray({span, span->FirstChild(), br}));
 }
 
-TEST_F(NGPaintFragmentTraversalTest, PreviousLineOf) {
-  SetUpHtml("t", "<div id=t>foo<br>bar</div>");
-  ASSERT_EQ(2u, RootChildren().size());
-  EXPECT_EQ(nullptr, NGPaintFragmentTraversal::PreviousLineOf(
-                         *ToList(RootChildren())[0]));
-  EXPECT_EQ(ToList(RootChildren())[0], NGPaintFragmentTraversal::PreviousLineOf(
-                                           *ToList(RootChildren())[1]));
-}
-
-TEST_F(NGPaintFragmentTraversalTest, PreviousLineInListItem) {
-  SetUpHtml("t", "<ul><li id=t>foo</li></ul>");
-  ASSERT_EQ(2u, RootChildren().size());
-  ASSERT_TRUE(ToList(RootChildren())[0]->PhysicalFragment().IsListMarker());
-  EXPECT_EQ(nullptr, NGPaintFragmentTraversal::PreviousLineOf(
-                         *ToList(RootChildren())[1]));
-}
-
 TEST_F(NGPaintFragmentTraversalTest, InlineDescendantsOf) {
   SetUpHtml("t",
             "<ul>"
diff --git a/third_party/blink/renderer/core/streams/readable_stream_native.cc b/third_party/blink/renderer/core/streams/readable_stream_native.cc
index 76bc848..d316e06 100644
--- a/third_party/blink/renderer/core/streams/readable_stream_native.cc
+++ b/third_party/blink/renderer/core/streams/readable_stream_native.cc
@@ -229,8 +229,6 @@
     return promise_->GetScriptPromise(script_state_);
   }
 
-  StreamPromiseResolver* Promise() { return promise_; }
-
   void Trace(Visitor* visitor) {
     visitor->Trace(script_state_);
     visitor->Trace(pipe_options_);
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 63807df4..a22d9e8d 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
@@ -789,7 +789,9 @@
       DCHECK(!temp_begin.IsIndefinite());
       return SMILInterval(temp_begin, temp_end);
     }
-
+    // Ensure forward progress.
+    if (begin_after == temp_end)
+      temp_end = begin_after + SMILTime::Epsilon();
     begin_after = temp_end;
   }
   return SMILInterval::Unresolved();
diff --git a/third_party/blink/renderer/core/svg/svg_tree_scope_resources.cc b/third_party/blink/renderer/core/svg/svg_tree_scope_resources.cc
index f4f4d4b..c96d616 100644
--- a/third_party/blink/renderer/core/svg/svg_tree_scope_resources.cc
+++ b/third_party/blink/renderer/core/svg/svg_tree_scope_resources.cc
@@ -32,11 +32,12 @@
   return resources_.at(id);
 }
 
-void SVGTreeScopeResources::ClearWeakMembers(Visitor*) {
+void SVGTreeScopeResources::ProcessCustomWeakness(
+    const WeakCallbackInfo& broker) {
   // Unregister and remove any resources that are no longer alive.
   Vector<AtomicString> to_remove;
   for (auto& resource_entry : resources_) {
-    if (ThreadHeap::IsHeapObjectAlive(resource_entry.value))
+    if (broker.IsHeapObjectAlive(resource_entry.value))
       continue;
     resource_entry.value->Unregister();
     to_remove.push_back(resource_entry.key);
@@ -45,8 +46,9 @@
 }
 
 void SVGTreeScopeResources::Trace(Visitor* visitor) {
-  visitor->template RegisterWeakMembers<
-      SVGTreeScopeResources, &SVGTreeScopeResources::ClearWeakMembers>(this);
+  visitor->template RegisterWeakCallbackMethod<
+      SVGTreeScopeResources, &SVGTreeScopeResources::ProcessCustomWeakness>(
+      this);
   visitor->Trace(resources_);
   visitor->Trace(tree_scope_);
 }
diff --git a/third_party/blink/renderer/core/svg/svg_tree_scope_resources.h b/third_party/blink/renderer/core/svg/svg_tree_scope_resources.h
index f6fbe0c9..6cde646 100644
--- a/third_party/blink/renderer/core/svg/svg_tree_scope_resources.h
+++ b/third_party/blink/renderer/core/svg/svg_tree_scope_resources.h
@@ -30,7 +30,7 @@
   void Trace(Visitor*);
 
  private:
-  void ClearWeakMembers(Visitor*);
+  void ProcessCustomWeakness(const WeakCallbackInfo&);
 
   HeapHashMap<AtomicString, WeakMember<LocalSVGResource>> resources_;
   Member<TreeScope> tree_scope_;
diff --git a/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.cc b/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.cc
new file mode 100644
index 0000000..9a00ab95
--- /dev/null
+++ b/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.cc
@@ -0,0 +1,27 @@
+// Copyright 2019 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/testing/document_interface_broker_test_helpers.h"
+
+#include <utility>
+
+namespace blink {
+
+void FrameHostTestInterfaceImpl::BindAndFlush(
+    mojo::PendingReceiver<mojom::blink::FrameHostTestInterface> receiver) {
+  receiver_.Bind(std::move(receiver));
+  receiver_.WaitForIncomingCall();
+}
+
+void FrameHostTestInterfaceImpl::GetName(GetNameCallback callback) {
+  std::move(callback).Run(kGetNameTestResponse);
+}
+
+void FrameHostTestDocumentInterfaceBroker::GetFrameHostTestInterface(
+    mojo::PendingReceiver<mojom::blink::FrameHostTestInterface> receiver) {
+  FrameHostTestInterfaceImpl impl;
+  impl.BindAndFlush(std::move(receiver));
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h b/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h
new file mode 100644
index 0000000..f00a018a
--- /dev/null
+++ b/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h
@@ -0,0 +1,58 @@
+// Copyright 2019 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_TESTING_DOCUMENT_INTERFACE_BROKER_TEST_HELPERS_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_DOCUMENT_INTERFACE_BROKER_TEST_HELPERS_H_
+
+#include <utility>
+
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom-blink.h"
+#include "third_party/blink/renderer/core/testing/test_document_interface_broker.h"
+
+namespace blink {
+
+constexpr char kGetNameTestResponse[] = "BlinkTestName";
+
+// These classes can be used for verifying that overriding mechanism for
+// DocumentInterfaceBroker method calls works as expected with LocalFrameClient
+// implementations. See frame_test.cc and local_frame_client_impl.cc for
+// examples.
+class FrameHostTestInterfaceImpl : public mojom::blink::FrameHostTestInterface {
+ public:
+  FrameHostTestInterfaceImpl() = default;
+  ~FrameHostTestInterfaceImpl() override {}
+
+  void BindAndFlush(
+      mojo::PendingReceiver<mojom::blink::FrameHostTestInterface> receiver);
+
+ protected:
+  void Ping(const KURL& url, const WTF::String& event) override {}
+  void GetName(GetNameCallback callback) override;
+
+ private:
+  mojo::Receiver<mojom::blink::FrameHostTestInterface> receiver_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(FrameHostTestInterfaceImpl);
+};
+
+class FrameHostTestDocumentInterfaceBroker
+    : public TestDocumentInterfaceBroker {
+ public:
+  FrameHostTestDocumentInterfaceBroker(
+      mojom::blink::DocumentInterfaceBroker* document_interface_broker,
+      mojo::PendingReceiver<mojom::blink::DocumentInterfaceBroker> receiver)
+      : TestDocumentInterfaceBroker(document_interface_broker,
+                                    std::move(receiver)) {}
+
+  void GetFrameHostTestInterface(
+      mojo::PendingReceiver<mojom::blink::FrameHostTestInterface> receiver)
+      override;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_DOCUMENT_INTERFACE_BROKER_TEST_HELPERS_H_
diff --git a/third_party/blink/renderer/core/testing/test_document_interface_broker.cc b/third_party/blink/renderer/core/testing/test_document_interface_broker.cc
new file mode 100644
index 0000000..9ad8a94
--- /dev/null
+++ b/third_party/blink/renderer/core/testing/test_document_interface_broker.cc
@@ -0,0 +1,28 @@
+// Copyright 2019 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/testing/test_document_interface_broker.h"
+
+#include <utility>
+
+namespace blink {
+
+TestDocumentInterfaceBroker::TestDocumentInterfaceBroker(
+    mojom::blink::DocumentInterfaceBroker* document_interface_broker,
+    mojo::PendingReceiver<mojom::blink::DocumentInterfaceBroker> receiver)
+    : real_broker_(document_interface_broker),
+      receiver_(this, std::move(receiver)) {}
+
+TestDocumentInterfaceBroker::~TestDocumentInterfaceBroker() {}
+
+mojom::blink::DocumentInterfaceBroker*
+TestDocumentInterfaceBroker::GetForwardingInterface() {
+  return real_broker_;
+}
+
+void TestDocumentInterfaceBroker::Flush() {
+  receiver_.FlushForTesting();
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/testing/test_document_interface_broker.h b/third_party/blink/renderer/core/testing/test_document_interface_broker.h
new file mode 100644
index 0000000..5786f31
--- /dev/null
+++ b/third_party/blink/renderer/core/testing/test_document_interface_broker.h
@@ -0,0 +1,34 @@
+// Copyright 2019 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_TESTING_TEST_DOCUMENT_INTERFACE_BROKER_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_TEST_DOCUMENT_INTERFACE_BROKER_H_
+
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink-test-utils.h"
+
+namespace blink {
+
+// This class can be subclassed to override specific methods of
+// LocalFrameClient's DocumentInterfaceBroker in tests. The rest of the calls
+// will be forwarded to the implementation passed to the constructor (typically
+// returned by LocalFrameClient::GetDocumentInterfaceBroker()).
+class TestDocumentInterfaceBroker
+    : public mojom::blink::DocumentInterfaceBrokerInterceptorForTesting {
+ public:
+  TestDocumentInterfaceBroker(
+      mojom::blink::DocumentInterfaceBroker* document_interface_broker,
+      mojo::PendingReceiver<mojom::blink::DocumentInterfaceBroker> receiver);
+  ~TestDocumentInterfaceBroker() override;
+  mojom::blink::DocumentInterfaceBroker* GetForwardingInterface() override;
+  void Flush();
+
+ private:
+  mojom::blink::DocumentInterfaceBroker* real_broker_;
+  mojo::Receiver<mojom::blink::DocumentInterfaceBroker> receiver_;
+};
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_TEST_DOCUMENT_INTERFACE_BROKER_H_
diff --git a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc
index ac525b62..4bdb167 100644
--- a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc
+++ b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc
@@ -34,79 +34,106 @@
 
 namespace blink {
 
-ArrayBufferContents::ArrayBufferContents()
-    : holder_(base::AdoptRef(new DataHolder())) {}
-
-ArrayBufferContents::ArrayBufferContents(
-    size_t num_elements,
-    unsigned element_byte_size,
-    SharingType is_shared,
-    ArrayBufferContents::InitializationPolicy policy)
-    : holder_(base::AdoptRef(new DataHolder())) {
-  // Do not allow 32-bit overflow of the total size.
-  size_t total_size = num_elements * element_byte_size;
-  if (num_elements) {
-    if (total_size / num_elements != element_byte_size) {
-      return;
-    }
-  }
-
-  holder_->AllocateNew(total_size, is_shared, policy);
-}
-
-ArrayBufferContents::ArrayBufferContents(DataHandle data, SharingType is_shared)
-    : holder_(base::AdoptRef(new DataHolder())) {
-  if (data) {
-    holder_->Adopt(std::move(data), is_shared);
-  } else {
-    // Allow null data if size is 0 bytes, make sure data is valid pointer.
-    // (PartitionAlloc guarantees valid pointer for size 0)
-    holder_->AllocateNew(0, is_shared, kZeroInitialize);
-  }
-}
-
 ArrayBufferContents::ArrayBufferContents(void* data,
                                          size_t length,
                                          DataDeleter deleter,
-                                         SharingType is_shared)
-    : holder_(base::AdoptRef(new DataHolder())) {
-  holder_->Adopt(DataHandle(data, length, deleter, nullptr), is_shared);
+                                         SharingType is_shared) {
+  if (!data) {
+    return;
+  }
+  if (is_shared == kNotShared) {
+    backing_store_ =
+        v8::ArrayBuffer::NewBackingStore(data, length, deleter, nullptr);
+  } else {
+    backing_store_ =
+        v8::SharedArrayBuffer::NewBackingStore(data, length, deleter, nullptr);
+  }
+}
+
+ArrayBufferContents::ArrayBufferContents(
+    size_t num_elements,
+    size_t element_byte_size,
+    SharingType is_shared,
+    ArrayBufferContents::InitializationPolicy policy) {
+  auto checked_length =
+      base::CheckedNumeric<size_t>(num_elements) * element_byte_size;
+  if (!checked_length.IsValid()) {
+    // The requested size is too big, we cannot allocate the memory and
+    // therefore just return.
+    return;
+  }
+  size_t length = checked_length.ValueOrDie();
+  void* data = AllocateMemoryOrNull(length, policy);
+  auto deleter = [](void* data, size_t, void*) { FreeMemory(data); };
+  if (is_shared == kNotShared) {
+    backing_store_ =
+        v8::ArrayBuffer::NewBackingStore(data, length, deleter, nullptr);
+  } else {
+    backing_store_ =
+        v8::SharedArrayBuffer::NewBackingStore(data, length, deleter, nullptr);
+  }
+}
+
+ArrayBufferContents::ArrayBufferContents(
+    std::shared_ptr<v8::BackingStore> backing_store) {
+  if (!backing_store || backing_store->Data()) {
+    backing_store_ = std::move(backing_store);
+    return;
+  }
+  // ArrayBufferContents has to guarantee that Data() provides a valid pointer,
+  // even when DataSize() is '0'. That's why we create a new BackingStore here.
+
+  // TODO(ahaas): Remove this code here once nullptr is a valid result for
+  // Data().
+  CHECK_EQ(backing_store->ByteLength(), 0u);
+  void* data = AllocateMemoryOrNull(0, kDontInitialize);
+  CHECK_NE(data, nullptr);
+  DataDeleter deleter = [](void* data, size_t, void*) { FreeMemory(data); };
+  if (!backing_store->IsShared()) {
+    backing_store_ =
+        v8::ArrayBuffer::NewBackingStore(data, 0, deleter, nullptr);
+  } else {
+    backing_store_ =
+        v8::SharedArrayBuffer::NewBackingStore(data, 0, deleter, nullptr);
+  }
 }
 
 ArrayBufferContents::~ArrayBufferContents() = default;
 
 void ArrayBufferContents::Detach() {
-  holder_ = nullptr;
+  backing_store_.reset();
 }
 
 void ArrayBufferContents::Reset() {
-  holder_ = base::MakeRefCounted<DataHolder>();
+  backing_store_.reset();
 }
 
 void ArrayBufferContents::Transfer(ArrayBufferContents& other) {
   DCHECK(!IsShared());
-  DCHECK(!other.holder_->Data());
-  other.holder_ = holder_;
-  Detach();
+  DCHECK(!other.Data());
+  other.backing_store_ = std::move(backing_store_);
 }
 
 void ArrayBufferContents::ShareWith(ArrayBufferContents& other) {
   DCHECK(IsShared());
-  DCHECK(!other.holder_->Data());
-  other.holder_ = holder_;
+  DCHECK(!other.Data());
+  other.backing_store_ = backing_store_;
 }
 
 void ArrayBufferContents::ShareNonSharedForInternalUse(
     ArrayBufferContents& other) {
   DCHECK(!IsShared());
-  DCHECK(!other.holder_->Data());
-  DCHECK(holder_->Data());
-  other.holder_ = holder_;
+  DCHECK(!other.Data());
+  DCHECK(Data());
+  other.backing_store_ = backing_store_;
 }
 
 void ArrayBufferContents::CopyTo(ArrayBufferContents& other) {
-  DCHECK(!holder_->IsShared() && !other.holder_->IsShared());
-  other.holder_->CopyMemoryFrom(*holder_);
+  other = ArrayBufferContents(
+      DataLength(), 1, IsShared() ? kShared : kNotShared, kDontInitialize);
+  if (!IsValid() || !other.IsValid())
+    return;
+  memcpy(other.Data(), Data(), DataLength());
 }
 
 void* ArrayBufferContents::AllocateMemoryWithFlags(size_t size,
@@ -130,58 +157,4 @@
   WTF::Partitions::ArrayBufferPartition()->Free(data);
 }
 
-ArrayBufferContents::DataHandle ArrayBufferContents::CreateDataHandle(
-    size_t size,
-    InitializationPolicy policy) {
-  return DataHandle(
-      ArrayBufferContents::AllocateMemoryOrNull(size, policy), size,
-      [](void* buffer, size_t, void*) { FreeMemory(buffer); }, nullptr);
-}
-
-ArrayBufferContents::DataHolder::DataHolder()
-    : data_(
-          nullptr,
-          0,
-          [](void*, size_t, void*) {},
-          nullptr),
-      is_shared_(kNotShared),
-      has_registered_external_allocation_(false) {}
-
-ArrayBufferContents::DataHolder::~DataHolder() {
-  is_shared_ = kNotShared;
-}
-
-void ArrayBufferContents::DataHolder::AllocateNew(size_t length,
-                                                  SharingType is_shared,
-                                                  InitializationPolicy policy) {
-  DCHECK(!data_);
-  DCHECK(!has_registered_external_allocation_);
-
-  data_ = CreateDataHandle(length, policy);
-  if (!data_)
-    return;
-
-  is_shared_ = is_shared;
-}
-
-void ArrayBufferContents::DataHolder::Adopt(DataHandle data,
-                                            SharingType is_shared) {
-  DCHECK(!data_);
-  DCHECK(!has_registered_external_allocation_);
-
-  data_ = std::move(data);
-  is_shared_ = is_shared;
-}
-
-void ArrayBufferContents::DataHolder::CopyMemoryFrom(const DataHolder& source) {
-  DCHECK(!data_);
-  DCHECK(!has_registered_external_allocation_);
-
-  data_ = CreateDataHandle(source.DataLength(), kDontInitialize);
-  if (!data_)
-    return;
-
-  memcpy(data_.Data(), source.Data(), source.DataLength());
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h
index 1adf492..166aa9a9 100644
--- a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h
+++ b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h
@@ -36,6 +36,7 @@
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h"
 #include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h"
 #include "third_party/blink/renderer/platform/wtf/wtf.h"
+#include "v8/include/v8.h"
 
 namespace blink {
 
@@ -43,65 +44,13 @@
   DISALLOW_NEW();
 
  public:
-  using AdjustAmountOfExternalAllocatedMemoryFunction = void (*)(int64_t diff);
   // Types that need to be used when injecting external memory.
-  // DataHandle allows specifying a deleter which will be invoked when
-  // DataHandle instance goes out of scope. If the data memory is allocated
-  // using ArrayBufferContents::AllocateMemoryOrNull, it is necessary to specify
-  // ArrayBufferContents::FreeMemory as the DataDeleter. Most clients would want
-  // to use ArrayBufferContents::CreateDataHandle, which allocates memory and
-  // specifies the correct deleter.
+  // v8::BackingStore allows specifying a deleter which will be invoked when
+  // v8::BackingStore instance goes out of scope. If the data memory is
+  // allocated using ArrayBufferContents::AllocateMemoryOrNull, it is necessary
+  // to specify ArrayBufferContents::FreeMemory as the DataDeleter.
   using DataDeleter = void (*)(void* data, size_t length, void* info);
 
-  class DataHandle {
-    DISALLOW_COPY_AND_ASSIGN(DataHandle);
-
-   public:
-    DataHandle() {}
-
-    DataHandle(void* data,
-               size_t length,
-               DataDeleter deleter,
-               void* deleter_info)
-        : data_(data),
-          data_length_(data ? length : 0),
-          deleter_(deleter),
-          deleter_info_(deleter_info) {}
-    // Move constructor
-    DataHandle(DataHandle&& other) { *this = std::move(other); }
-    ~DataHandle() {
-      if (!data_)
-        return;
-      deleter_(data_, data_length_, deleter_info_);
-    }
-
-    // Move operator
-    DataHandle& operator=(DataHandle&& other) {
-      if (data_)
-        deleter_(data_, data_length_, deleter_info_);
-      data_ = other.data_;
-      data_length_ = other.data_length_;
-      deleter_ = other.deleter_;
-      deleter_info_ = other.deleter_info_;
-      other.data_ = nullptr;
-      return *this;
-    }
-
-    void reset() { *this = DataHandle(); }
-
-    void* Data() const { return data_; }
-    size_t DataLength() const { return data_length_; }
-
-    operator bool() const { return data_; }
-
-   private:
-    void* data_ = nullptr;
-    size_t data_length_ = 0;
-
-    DataDeleter deleter_ = nullptr;
-    void* deleter_info_ = nullptr;
-  };
-
   enum InitializationPolicy { kZeroInitialize, kDontInitialize };
 
   enum SharingType {
@@ -109,17 +58,17 @@
     kShared,
   };
 
-  ArrayBufferContents();
+  ArrayBufferContents() = default;
   ArrayBufferContents(size_t num_elements,
-                      unsigned element_byte_size,
+                      size_t element_byte_size,
                       SharingType is_shared,
                       InitializationPolicy);
   ArrayBufferContents(void* data,
                       size_t length,
                       DataDeleter deleter,
                       SharingType is_shared);
-  ArrayBufferContents(DataHandle, SharingType is_shared);
   ArrayBufferContents(ArrayBufferContents&&) = default;
+  explicit ArrayBufferContents(std::shared_ptr<v8::BackingStore> backing_store);
 
   ~ArrayBufferContents();
 
@@ -138,10 +87,16 @@
     DCHECK(IsShared());
     return DataMaybeShared();
   }
-  void* DataMaybeShared() const { return holder_ ? holder_->Data() : nullptr; }
-  size_t DataLength() const { return holder_ ? holder_->DataLength() : 0; }
-  bool IsShared() const { return holder_ ? holder_->IsShared() : false; }
-  bool IsValid() const { return holder_->Data(); }
+  void* DataMaybeShared() const {
+    return backing_store_ ? backing_store_->Data() : nullptr;
+  }
+  size_t DataLength() const {
+    return backing_store_ ? backing_store_->ByteLength() : 0;
+  }
+  bool IsShared() const {
+    return backing_store_ ? backing_store_->IsShared() : false;
+  }
+  bool IsValid() const { return backing_store_ && backing_store_->Data(); }
 
   void Transfer(ArrayBufferContents& other);
   void ShareWith(ArrayBufferContents& other);
@@ -150,7 +105,6 @@
 
   static void* AllocateMemoryOrNull(size_t, InitializationPolicy);
   static void FreeMemory(void*);
-  static DataHandle CreateDataHandle(size_t, InitializationPolicy);
 
  private:
   static void* AllocateMemoryWithFlags(size_t, InitializationPolicy, int);
@@ -158,31 +112,7 @@
   static void DefaultAdjustAmountOfExternalAllocatedMemoryFunction(
       int64_t diff);
 
-  class CORE_EXPORT DataHolder : public ThreadSafeRefCounted<DataHolder> {
-    DISALLOW_COPY_AND_ASSIGN(DataHolder);
-
-   public:
-    DataHolder();
-    ~DataHolder();
-
-    void AllocateNew(size_t length,
-                     SharingType is_shared,
-                     InitializationPolicy);
-    void Adopt(DataHandle, SharingType is_shared);
-    void CopyMemoryFrom(const DataHolder& source);
-
-    const void* Data() const { return data_.Data(); }
-    void* Data() { return data_.Data(); }
-    size_t DataLength() const { return data_.DataLength(); }
-    bool IsShared() const { return is_shared_ == kShared; }
-
-   private:
-    DataHandle data_;
-    SharingType is_shared_;
-    bool has_registered_external_allocation_;
-  };
-
-  scoped_refptr<DataHolder> holder_;
+  std::shared_ptr<v8::BackingStore> backing_store_;
 
   DISALLOW_COPY_AND_ASSIGN(ArrayBufferContents);
 };
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
index 94d154a..de1360f 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -1426,7 +1426,7 @@
     // This has to be overridden in the case where the selected item has an ARIA
     // label.
     auto* select_element = To<HTMLSelectElement>(layout_object_->GetNode());
-    int selected_index = select_element->selectedIndex();
+    int selected_index = select_element->SelectedListIndex();
     const HeapVector<Member<HTMLElement>>& list_items =
         select_element->GetListItems();
     if (selected_index >= 0 &&
@@ -2080,8 +2080,8 @@
         !IsA<HTMLMapElement>(
             *element) &&                 // Handled in AddImageMapChildren (img)
         !IsHTMLRubyElement(*element) &&  // Special layout handling
-        !IsHTMLTableElement(*element) &&  // thead/tfoot move around
-        !element->IsPseudoElement()) {    // Not visited in layout traversal
+        !IsA<HTMLTableElement>(*element) &&  // thead/tfoot move around
+        !element->IsPseudoElement()) {       // Not visited in layout traversal
       AXNodeObject::AddChildren();
       return;
     }
@@ -2450,14 +2450,14 @@
       ToInterface<LayoutNGTableInterface>(layout_object_);
   table->RecalcSectionsIfNeeded();
   Node* table_node = layout_object_->GetNode();
-  if (!table_node || !IsHTMLTableElement(table_node))
-    return false;
 
   // This employs a heuristic to determine if this table should appear.
   // Only "data" tables should be exposed as tables.
   // Unfortunately, there is no good way to determine the difference
   // between a "layout" table and a "data" table.
-  HTMLTableElement* table_element = ToHTMLTableElement(table_node);
+  auto* table_element = DynamicTo<HTMLTableElement>(table_node);
+  if (!table_element)
+    return false;
 
   // If there is a caption element, summary, THEAD, or TFOOT section, it's most
   // certainly a data table
@@ -3134,9 +3134,8 @@
         ToInterface<LayoutNGTableInterface>(layout_object_);
     table->RecalcSectionsIfNeeded();
     Node* table_node = table->ToLayoutObject()->GetNode();
-    if (IsHTMLTableElement(table_node)) {
-      if (HTMLTableCaptionElement* caption =
-              ToHTMLTableElement(table_node)->caption()) {
+    if (auto* html_table_element = DynamicTo<HTMLTableElement>(table_node)) {
+      if (HTMLTableCaptionElement* caption = html_table_element->caption()) {
         AXObject* caption_object = ax_cache.GetOrCreate(caption);
         if (caption_object && caption_object->AccessibilityIsIncludedInTree())
           children_.push_front(caption_object);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 9ca0bc6..d5c87ce 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -633,7 +633,7 @@
 
   // Chrome exposes both table markup and table CSS as a tables, letting
   // the screen reader determine what to do for CSS tables.
-  if (IsHTMLTableElement(*GetNode())) {
+  if (IsA<HTMLTableElement>(*GetNode())) {
     return IsDataTable() ? ax::mojom::Role::kTable
                          : ax::mojom::Role::kLayoutTable;
   }
@@ -2041,7 +2041,7 @@
     return String();
 
   if (auto* select_element = DynamicTo<HTMLSelectElement>(*node)) {
-    int selected_index = select_element->selectedIndex();
+    int selected_index = select_element->SelectedListIndex();
     const HeapVector<Member<HTMLElement>>& list_items =
         select_element->GetListItems();
     if (selected_index >= 0 &&
@@ -3331,7 +3331,7 @@
   }
 
   // 5.9 table Element
-  if (auto* table_element = ToHTMLTableElementOrNull(GetNode())) {
+  if (auto* table_element = DynamicTo<HTMLTableElement>(GetNode())) {
     // caption
     name_from = ax::mojom::NameFrom::kCaption;
     if (name_sources) {
@@ -3632,10 +3632,8 @@
 
   // table caption, 5.9.2 from:
   // http://rawgit.com/w3c/aria/master/html-aam/html-aam.html
-  if (name_from != ax::mojom::NameFrom::kCaption &&
-      IsHTMLTableElement(GetNode())) {
-    HTMLTableElement* table_element = ToHTMLTableElement(GetNode());
-
+  auto* table_element = DynamicTo<HTMLTableElement>(GetNode());
+  if (name_from != ax::mojom::NameFrom::kCaption && table_element) {
     description_from = ax::mojom::DescriptionFrom::kRelatedElement;
     if (description_sources) {
       description_sources->push_back(DescriptionSource(found_description));
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 548ce134..456153a 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -605,7 +605,7 @@
 
 ContainerNode* FindParentTable(Node* node) {
   ContainerNode* parent = node->parentNode();
-  while (parent && !IsHTMLTableElement(*parent))
+  while (parent && !IsA<HTMLTableElement>(*parent))
     parent = parent->parentNode();
   return parent;
 }
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
index 1089c43..41c5e93 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
@@ -77,7 +77,8 @@
     }
 
     P2PQuicPacketTransport::QuicPacket packet;
-    packet.packet_number = connection_->packet_generator().packet_number().ToUint64();
+    packet.packet_number =
+        connection_->packet_creator().packet_number().ToUint64();
     packet.buffer = buffer;
     packet.buf_len = buf_len;
     int bytes_written = packet_transport_->WritePacket(packet);
diff --git a/third_party/blink/renderer/modules/xr/xr.cc b/third_party/blink/renderer/modules/xr/xr.cc
index 51d8e985..a29117d 100644
--- a/third_party/blink/renderer/modules/xr/xr.cc
+++ b/third_party/blink/renderer/modules/xr/xr.cc
@@ -317,9 +317,13 @@
   ParseSensorRequirement();
 }
 
-void XR::PendingRequestSessionQuery::Resolve(XRSession* session) {
+void XR::PendingRequestSessionQuery::Resolve(
+    XRSession* session,
+    mojo::PendingRemote<device::mojom::blink::XRSessionMetricsRecorder>
+        metrics_recorder) {
   resolver_->Resolve(session);
-  ReportRequestSessionResult(SessionRequestStatus::kSuccess);
+  ReportRequestSessionResult(SessionRequestStatus::kSuccess, session,
+                             std::move(metrics_recorder));
 }
 
 void XR::PendingRequestSessionQuery::RejectWithDOMException(
@@ -367,17 +371,69 @@
   ReportRequestSessionResult(SessionRequestStatus::kOtherError);
 }
 
+device::mojom::XRSessionFeatureRequestStatus
+XR::PendingRequestSessionQuery::GetFeatureRequestStatus(
+    device::mojom::XRSessionFeature feature,
+    const XRSession* session) const {
+  using device::mojom::XRSessionFeatureRequestStatus;
+
+  if (RequiredFeatures().Contains(feature)) {
+    // In the case of required features, accepted/rejected state is
+    // the same as the entire session.
+    return XRSessionFeatureRequestStatus::kRequired;
+  }
+
+  if (OptionalFeatures().Contains(feature)) {
+    if (!session || !session->IsFeatureEnabled(feature)) {
+      return XRSessionFeatureRequestStatus::kOptionalRejected;
+    }
+
+    return XRSessionFeatureRequestStatus::kOptionalAccepted;
+  }
+
+  return XRSessionFeatureRequestStatus::kNotRequested;
+}
+
 void XR::PendingRequestSessionQuery::ReportRequestSessionResult(
-    SessionRequestStatus status) {
+    SessionRequestStatus status,
+    XRSession* session,
+    mojo::PendingRemote<device::mojom::blink::XRSessionMetricsRecorder>
+        metrics_recorder) {
+  using device::mojom::XRSessionFeature;
+
   LocalFrame* frame = resolver_->GetFrame();
   Document* doc = frame ? frame->GetDocument() : nullptr;
   if (!doc)
     return;
 
+  auto feature_request_viewer =
+      GetFeatureRequestStatus(XRSessionFeature::REF_SPACE_VIEWER, session);
+  auto feature_request_local =
+      GetFeatureRequestStatus(XRSessionFeature::REF_SPACE_LOCAL, session);
+  auto feature_request_local_floor =
+      GetFeatureRequestStatus(XRSessionFeature::REF_SPACE_LOCAL_FLOOR, session);
+  auto feature_request_bounded_floor = GetFeatureRequestStatus(
+      XRSessionFeature::REF_SPACE_BOUNDED_FLOOR, session);
+  auto feature_request_unbounded =
+      GetFeatureRequestStatus(XRSessionFeature::REF_SPACE_UNBOUNDED, session);
+
   ukm::builders::XR_WebXR_SessionRequest(ukm_source_id_)
       .SetMode(static_cast<int64_t>(mode_))
       .SetStatus(static_cast<int64_t>(status))
+      .SetFeature_Viewer(static_cast<int64_t>(feature_request_viewer))
+      .SetFeature_Local(static_cast<int64_t>(feature_request_local))
+      .SetFeature_LocalFloor(static_cast<int64_t>(feature_request_local_floor))
+      .SetFeature_BoundedFloor(
+          static_cast<int64_t>(feature_request_bounded_floor))
+      .SetFeature_Unbounded(static_cast<int64_t>(feature_request_unbounded))
       .Record(doc->UkmRecorder());
+
+  if (session && metrics_recorder) {
+    mojo::Remote<device::mojom::blink::XRSessionMetricsRecorder> recorder(
+        std::move(metrics_recorder));
+    session->SetMetricsReporter(
+        std::make_unique<XRSession::MetricsReporter>(std::move(recorder)));
+  }
 }
 
 XRSession::SessionMode XR::PendingRequestSessionQuery::mode() const {
@@ -918,12 +974,9 @@
     has_outstanding_immersive_request_ = false;
   }
 
-  device::mojom::blink::XRSessionPtr session_ptr =
-      result->is_session() ? std::move(result->get_session()) : nullptr;
-
   // TODO(https://crbug.com/872316) Improve the error messaging to indicate why
   // a request failed.
-  if (!session_ptr) {
+  if (!result->is_success()) {
     // |service_| does not support the requested mode. Attempt to create a
     // sensorless session.
     if (query->GetSensorRequirement() != SensorRequirement::kRequired) {
@@ -941,6 +994,9 @@
     return;
   }
 
+  auto session_ptr = std::move(result->get_success()->session);
+  auto metrics_recorder = std::move(result->get_success()->metrics_recorder);
+
   bool environment_integration = query->mode() == XRSession::kModeImmersiveAR;
 
   // immersive sessions must supply display info.
@@ -1039,7 +1095,7 @@
   UseCounter::Count(ExecutionContext::From(query->GetScriptState()),
                     WebFeature::kWebXrSessionCreated);
 
-  query->Resolve(session);
+  query->Resolve(session, std::move(metrics_recorder));
 }
 
 void XR::ReportImmersiveSupported(bool supported) {
diff --git a/third_party/blink/renderer/modules/xr/xr.h b/third_party/blink/renderer/modules/xr/xr.h
index 0ac7ca8c4..bf498cf75 100644
--- a/third_party/blink/renderer/modules/xr/xr.h
+++ b/third_party/blink/renderer/modules/xr/xr.h
@@ -134,7 +134,12 @@
     virtual ~PendingRequestSessionQuery() = default;
 
     // Resolves underlying promise with passed in XR session.
-    void Resolve(XRSession* session);
+    // If metrics are to be recorded for this session, an
+    // |XRSessionMetricsRecorded| may be passed in as well.
+    void Resolve(
+        XRSession* session,
+        mojo::PendingRemote<device::mojom::blink::XRSessionMetricsRecorder>
+            metrics_recorder = mojo::NullRemote());
 
     // Rejects underlying promise with a DOMException.
     // Do not call this with |DOMExceptionCode::kSecurityError|, use
@@ -173,8 +178,15 @@
     virtual void Trace(blink::Visitor*);
 
    private:
-    void ReportRequestSessionResult(SessionRequestStatus status);
     void ParseSensorRequirement();
+    device::mojom::XRSessionFeatureRequestStatus GetFeatureRequestStatus(
+        device::mojom::XRSessionFeature feature,
+        const XRSession* session) const;
+    void ReportRequestSessionResult(
+        SessionRequestStatus status,
+        XRSession* session = nullptr,
+        mojo::PendingRemote<device::mojom::blink::XRSessionMetricsRecorder>
+            metrics_recorder = mojo::NullRemote());
 
     Member<ScriptPromiseResolver> resolver_;
     const XRSession::SessionMode mode_;
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc
index e20fe726..8ce7b82 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.cc
+++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -157,6 +157,41 @@
   Member<XRSession> session_;
 };
 
+XRSession::MetricsReporter::MetricsReporter(
+    mojo::Remote<device::mojom::blink::XRSessionMetricsRecorder> recorder)
+    : recorder_(std::move(recorder)) {}
+
+void XRSession::MetricsReporter::ReportFeatureUsed(
+    device::mojom::blink::XRSessionFeature feature) {
+  using device::mojom::blink::XRSessionFeature;
+
+  // If we've already reported using this feature, no need to report again.
+  if (!reported_features_.insert(feature).is_new_entry) {
+    return;
+  }
+
+  switch (feature) {
+    case XRSessionFeature::REF_SPACE_VIEWER:
+      recorder_->ReportFeatureUsed(XRSessionFeature::REF_SPACE_VIEWER);
+      break;
+    case XRSessionFeature::REF_SPACE_LOCAL:
+      recorder_->ReportFeatureUsed(XRSessionFeature::REF_SPACE_LOCAL);
+      break;
+    case XRSessionFeature::REF_SPACE_LOCAL_FLOOR:
+      recorder_->ReportFeatureUsed(XRSessionFeature::REF_SPACE_LOCAL_FLOOR);
+      break;
+    case XRSessionFeature::REF_SPACE_BOUNDED_FLOOR:
+      recorder_->ReportFeatureUsed(XRSessionFeature::REF_SPACE_BOUNDED_FLOOR);
+      break;
+    case XRSessionFeature::REF_SPACE_UNBOUNDED:
+      recorder_->ReportFeatureUsed(XRSessionFeature::REF_SPACE_UNBOUNDED);
+      break;
+    case XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR:
+      // Not recording metrics for this feature currently
+      break;
+  }
+}
+
 XRSession::XRSession(
     XR* xr,
     mojo::PendingReceiver<device::mojom::blink::XRSessionClient>
@@ -330,8 +365,18 @@
   // If the session feature required by this reference space type is not
   // enabled, reject the session.
   auto type_as_feature = MapReferenceSpaceTypeToFeature(requested_type);
-  if (!type_as_feature ||
-      !enabled_features_.Contains(type_as_feature.value())) {
+  if (!type_as_feature) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError,
+                                      kReferenceSpaceNotSupported);
+    return ScriptPromise();
+  }
+
+  // Report attempt to use this feature
+  if (metrics_reporter_) {
+    metrics_reporter_->ReportFeatureUsed(type_as_feature.value());
+  }
+
+  if (!IsFeatureEnabled(type_as_feature.value())) {
     exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError,
                                       kReferenceSpaceNotSupported);
     return ScriptPromise();
@@ -1177,6 +1222,16 @@
   }
 }
 
+bool XRSession::IsFeatureEnabled(
+    device::mojom::XRSessionFeature feature) const {
+  return enabled_features_.Contains(feature);
+}
+
+void XRSession::SetMetricsReporter(std::unique_ptr<MetricsReporter> reporter) {
+  DCHECK(!metrics_reporter_);
+  metrics_reporter_ = std::move(reporter);
+}
+
 void XRSession::OnFrame(
     double timestamp,
     const base::Optional<gpu::MailboxHolder>& output_mailbox_holder) {
diff --git a/third_party/blink/renderer/modules/xr/xr_session.h b/third_party/blink/renderer/modules/xr/xr_session.h
index 42750a7..41581e1 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.h
+++ b/third_party/blink/renderer/modules/xr/xr_session.h
@@ -10,6 +10,7 @@
 #include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
 #include "third_party/blink/renderer/core/typed_arrays/array_buffer_view_helpers.h"
@@ -21,6 +22,7 @@
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/transforms/transformation_matrix.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
+#include "third_party/blink/renderer/platform/wtf/hash_set.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_view.h"
 
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
@@ -72,6 +74,22 @@
     kBlendModeAlphaBlend
   };
 
+  struct MetricsReporter {
+    explicit MetricsReporter(
+        mojo::Remote<device::mojom::blink::XRSessionMetricsRecorder> recorder);
+
+    // Reports a use (or attempted use) of the given feature to the underlying
+    // metrics recorder.
+    void ReportFeatureUsed(device::mojom::blink::XRSessionFeature feature);
+
+   private:
+    mojo::Remote<device::mojom::blink::XRSessionMetricsRecorder> recorder_;
+
+    // Keeps track of which features have already been reported, to reduce
+    // redundant mojom calls.
+    WTF::HashSet<device::mojom::blink::XRSessionFeature> reported_features_;
+  };
+
   XRSession(XR* xr,
             mojo::PendingReceiver<device::mojom::blink::XRSessionClient>
                 client_receiver,
@@ -256,6 +274,12 @@
   // provider endpoint.
   void OnEnvironmentProviderCreated();
 
+  // Returns whether the given feature is enabled for this session.
+  bool IsFeatureEnabled(device::mojom::XRSessionFeature feature) const;
+
+  // Sets the metrics reporter for this session. This should only be done once.
+  void SetMetricsReporter(std::unique_ptr<MetricsReporter> reporter);
+
  private:
   class XRSessionResizeObserverDelegate;
 
@@ -334,6 +358,7 @@
   bool waiting_for_shutdown_ = false;
 
   XRSessionFeatureSet enabled_features_;
+  std::unique_ptr<MetricsReporter> metrics_reporter_;
 
   bool is_tracked_anchors_null_ = true;
   HeapHashMap<uint64_t, Member<XRAnchor>> anchor_ids_to_anchors_;
diff --git a/third_party/blink/renderer/platform/bindings/v8_private_property.h b/third_party/blink/renderer/platform/bindings/v8_private_property.h
index ef82fb6..8201c9a 100644
--- a/third_party/blink/renderer/platform/bindings/v8_private_property.h
+++ b/third_party/blink/renderer/platform/bindings/v8_private_property.h
@@ -20,29 +20,16 @@
 
 class ScriptWrappable;
 
-// TODO(peria): Remove properties just to keep V8 objects alive.
-// e.g. IDBCursor.Request.
-// Apply |X| for each pair of (InterfaceName, PrivateKeyName).
-#define V8_PRIVATE_PROPERTY_FOR_EACH(X)                 \
-  X(MessageEvent, CachedData)                           \
-
-// The getter's name for a private property.
-#define V8_PRIVATE_PROPERTY_GETTER_NAME(InterfaceName, PrivateKeyName) \
-  Get##InterfaceName##PrivateKeyName
-
-// Provides access to V8's private properties.
+// Provides access to V8's private properties with a symbol key.
 //
-// Usage 1) Path to use a pre-registered symbol.
-//   auto private_property = V8PrivateProperty::GetDOMExceptionError(isolate);
+//   static const V8PrivateProperty::SymbolKey kPrivateProperty;
+//   auto private_property = V8PrivateProperty::GetSymbol(
+//       isolate, kPrivateProperty);
 //   v8::Local<v8::Object> object = ...;
 //   v8::Local<v8::Value> value;
 //   if (!private_property.GetOrUndefined(object).ToLocal(&value)) return;
 //   value = ...;
 //   private_property.Set(object, value);
-//
-// Usage 2) Access with a symbol key.
-//   static const SymbolKey key;
-//   auto private_property = V8PrivateProperty::GetSymbol(isolate, key);
 //   ...
 class PLATFORM_EXPORT V8PrivateProperty {
   USING_FAST_MALLOC(V8PrivateProperty);
@@ -121,17 +108,6 @@
     SymbolKey& operator=(const SymbolKey&) = delete;
   };
 
-#define V8_PRIVATE_PROPERTY_DEFINE_GETTER(InterfaceName, KeyName)        \
-  static Symbol V8_PRIVATE_PROPERTY_GETTER_NAME(/* // NOLINT */          \
-                                                InterfaceName, KeyName)( \
-      v8::Isolate * isolate) {                                           \
-    static const SymbolKey private_property_key;                         \
-    return GetSymbol(isolate, private_property_key);                     \
-  }
-
-  V8_PRIVATE_PROPERTY_FOR_EACH(V8_PRIVATE_PROPERTY_DEFINE_GETTER)
-#undef V8_PRIVATE_PROPERTY_DEFINE_GETTER
-
   // TODO(peria): Do not use this specialized hack. See a TODO comment
   // on m_symbolWindowDocumentCachedAccessor.
   static Symbol GetWindowDocumentCachedAccessor(v8::Isolate* isolate);
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.cc b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
index 28083b7..a993192 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
@@ -99,6 +99,9 @@
     bool lost_resource) {
   resource->WaitSyncToken(sync_token);
 
+  if (resource_provider)
+    resource_provider->NotifyTexParamsModified(resource.get());
+
   // TODO(khushalsagar): If multiple readers had access to this resource, losing
   // it once should make sure subsequent releases don't try to recycle this
   // resource.
@@ -465,10 +468,6 @@
   if (!is_accelerated_)
     return;
 
-  // If skia is accessing the resource, it can modify the texture's filter
-  // params. Make sure to set them to the desired value before sending the
-  // resource to the display compositor.
-  owning_thread_data().needs_gl_filter_reset = true;
   owning_thread_data().mailbox_needs_new_sync_token = true;
 }
 
@@ -499,11 +498,6 @@
     }
   }
 
-  // The StaticBitmapImage is used for readbacks which may modify the texture
-  // params. Note that this is racy, since the modification and resetting of the
-  // param is not atomic so the display may draw with incorrect params, but its
-  // a good enough fix for now.
-  resource->owning_thread_data().needs_gl_filter_reset = true;
   auto weak_provider = resource->WeakProvider();
   ReleaseFrameResources(std::move(weak_provider), std::move(resource),
                         sync_token, is_lost);
@@ -513,10 +507,6 @@
   if (is_cross_thread() || !ContextProviderWrapper())
     return;
 
-  // Initialize GLFilter first so that the generated sync token includes this
-  // update.
-  SetGLFilterIfNeeded();
-
   // TODO(khushalsagar): This is for consistency with MailboxTextureHolder
   // transfer path. Its unclear why the verification can not be deferred until
   // the resource needs to be transferred cross-process.
@@ -578,13 +568,6 @@
       context_provider_wrapper_, owning_thread_id_, is_origin_top_left_,
       std::move(release_callback));
 
-  // The StaticBitmapImage is used for readbacks which may modify the texture
-  // params. We reset this when the image is destroyed but it is important to
-  // also do it here in case we try to send the resource to the display
-  // compositor while the |image| is still alive.
-  if (!is_cross_thread())
-    owning_thread_data().needs_gl_filter_reset = true;
-
   DCHECK(image);
   return image;
 }
@@ -610,30 +593,11 @@
 const gpu::Mailbox& CanvasResourceSharedImage::GetOrCreateGpuMailbox(
     MailboxSyncMode sync_mode) {
   if (!is_cross_thread()) {
-    SetGLFilterIfNeeded();
     owning_thread_data().mailbox_sync_mode = sync_mode;
   }
   return mailbox();
 }
 
-void CanvasResourceSharedImage::SetGLFilterIfNeeded() {
-  DCHECK(!is_cross_thread());
-
-  if (!owning_thread_data().needs_gl_filter_reset || !ContextGL() ||
-      !WeakProvider())
-    return;
-
-  ContextGL()->BindTexture(texture_target_, GetTextureIdForReadAccess());
-  ContextGL()->TexParameteri(texture_target_, GL_TEXTURE_MIN_FILTER,
-                             GLFilter());
-  ContextGL()->TexParameteri(texture_target_, GL_TEXTURE_MAG_FILTER,
-                             GLFilter());
-  ContextGL()->BindTexture(texture_target_, 0u);
-  owning_thread_data().mailbox_needs_new_sync_token = true;
-  owning_thread_data().needs_gl_filter_reset = false;
-  Provider()->NotifyTexParamsModified(this);
-}
-
 bool CanvasResourceSharedImage::HasGpuMailbox() const {
   return !mailbox().IsZero();
 }
@@ -673,9 +637,6 @@
 void CanvasResourceSharedImage::NotifyResourceLost() {
   owning_thread_data().is_lost = true;
 
-  // Since the texture params are in an unknown state, reset the cached tex
-  // params state for the resource.
-  owning_thread_data().needs_gl_filter_reset = true;
   if (WeakProvider())
     Provider()->NotifyTexParamsModified(this);
 }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.h b/third_party/blink/renderer/platform/graphics/canvas_resource.h
index 96aaebe..2110069 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource.h
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource.h
@@ -320,7 +320,6 @@
     bool mailbox_needs_new_sync_token = true;
     gpu::Mailbox shared_image_mailbox;
     gpu::SyncToken sync_token;
-    bool needs_gl_filter_reset = true;
     size_t bitmap_image_read_refs = 0u;
     MailboxSyncMode mailbox_sync_mode = kVerifiedSyncToken;
     bool is_lost = false;
@@ -359,7 +358,6 @@
                             bool is_origin_top_left,
                             bool allow_concurrent_read_write_access,
                             bool is_accelerated);
-  void SetGLFilterIfNeeded();
 
   OwningThreadData& owning_thread_data() {
     DCHECK_EQ(base::PlatformThread::CurrentId(), owning_thread_id_);
diff --git a/third_party/blink/renderer/platform/heap/blink_gc.h b/third_party/blink/renderer/platform/heap/blink_gc.h
index bf89c93..a1ba0e53 100644
--- a/third_party/blink/renderer/platform/heap/blink_gc.h
+++ b/third_party/blink/renderer/platform/heap/blink_gc.h
@@ -14,6 +14,7 @@
 
 namespace blink {
 
+class WeakCallbackInfo;
 class MarkingVisitor;
 class Visitor;
 
@@ -23,7 +24,7 @@
 using VisitorCallback = void (*)(Visitor*, void*);
 using MarkingVisitorCallback = void (*)(MarkingVisitor*, void*);
 using TraceCallback = VisitorCallback;
-using WeakCallback = VisitorCallback;
+using WeakCallback = void (*)(const WeakCallbackInfo&, void*);
 using EphemeronCallback = VisitorCallback;
 
 // Simple alias to avoid heap compaction type signatures turning into
diff --git a/third_party/blink/renderer/platform/heap/heap.cc b/third_party/blink/renderer/platform/heap/heap.cc
index 6dd6e3a..aff6115 100644
--- a/third_party/blink/renderer/platform/heap/heap.cc
+++ b/third_party/blink/renderer/platform/heap/heap.cc
@@ -398,8 +398,9 @@
 
   // Call weak callbacks on objects that may now be pointing to dead objects.
   CustomCallbackItem item;
+  WeakCallbackInfo broker;
   while (weak_callback_worklist_->Pop(WorklistTaskId::MutatorThread, &item)) {
-    item.callback(visitor, item.base_object_payload);
+    item.callback(broker, item.parameter);
   }
   // Weak callbacks should not add any new objects for marking.
   DCHECK(marking_worklist_->IsGlobalEmpty());
diff --git a/third_party/blink/renderer/platform/heap/heap.h b/third_party/blink/renderer/platform/heap/heap.h
index 8dfba8d..a758b1e 100644
--- a/third_party/blink/renderer/platform/heap/heap.h
+++ b/third_party/blink/renderer/platform/heap/heap.h
@@ -64,7 +64,6 @@
 class RegionTree;
 
 using MarkingItem = TraceDescriptor;
-using CustomCallbackItem = MarkingItem;
 using NotFullyConstructedItem = void*;
 using WeakTableItem = MarkingItem;
 
@@ -73,6 +72,11 @@
   MovingObjectCallback callback;
 };
 
+struct CustomCallbackItem {
+  WeakCallback callback;
+  void* parameter;
+};
+
 using V8Reference = const TraceWrapperV8Reference<v8::Value>*;
 
 // Segment size of 512 entries necessary to avoid throughput regressions. Since
@@ -612,7 +616,7 @@
 }
 
 template <typename T>
-void Visitor::HandleWeakCell(Visitor* self, void* object) {
+void Visitor::HandleWeakCell(const WeakCallbackInfo&, void* object) {
   WeakMember<T>* weak_member = reinterpret_cast<WeakMember<T>*>(object);
   if (weak_member->Get()) {
     if (weak_member->IsHashTableDeletedValue()) {
@@ -626,6 +630,37 @@
   }
 }
 
+class PLATFORM_EXPORT WeakCallbackInfo final {
+ public:
+  template <typename T>
+  bool IsHeapObjectAlive(const T*) const;
+  template <typename T>
+  bool IsHeapObjectAlive(const WeakMember<T>&) const;
+  template <typename T>
+  bool IsHeapObjectAlive(const UntracedMember<T>&) const;
+
+ private:
+  WeakCallbackInfo() = default;
+  friend class ThreadHeap;
+};
+
+template <typename T>
+bool WeakCallbackInfo::IsHeapObjectAlive(const T* object) const {
+  return ThreadHeap::IsHeapObjectAlive(object);
+}
+
+template <typename T>
+bool WeakCallbackInfo::IsHeapObjectAlive(
+    const WeakMember<T>& weak_member) const {
+  return ThreadHeap::IsHeapObjectAlive(weak_member);
+}
+
+template <typename T>
+bool WeakCallbackInfo::IsHeapObjectAlive(
+    const UntracedMember<T>& untraced_member) const {
+  return ThreadHeap::IsHeapObjectAlive(untraced_member.Get());
+}
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_H_
diff --git a/third_party/blink/renderer/platform/heap/heap_allocator.h b/third_party/blink/renderer/platform/heap/heap_allocator.h
index d48280c..d41fe4e4 100644
--- a/third_party/blink/renderer/platform/heap/heap_allocator.h
+++ b/third_party/blink/renderer/platform/heap/heap_allocator.h
@@ -71,6 +71,7 @@
   STATIC_ONLY(HeapAllocator);
 
  public:
+  using WeakCallbackInfo = blink::WeakCallbackInfo;
   using Visitor = blink::Visitor;
   static constexpr bool kIsGarbageCollected = true;
 
diff --git a/third_party/blink/renderer/platform/heap/heap_test.cc b/third_party/blink/renderer/platform/heap/heap_test.cc
index 8589ead..39c90da 100644
--- a/third_party/blink/renderer/platform/heap/heap_test.cc
+++ b/third_party/blink/renderer/platform/heap/heap_test.cc
@@ -859,11 +859,12 @@
 
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(strong_bar_);
-    visitor->template RegisterWeakMembers<Weak, &Weak::ZapWeakMembers>(this);
+    visitor->template RegisterWeakCallbackMethod<Weak, &Weak::ZapWeakMembers>(
+        this);
   }
 
-  void ZapWeakMembers(Visitor* visitor) {
-    if (!ThreadHeap::IsHeapObjectAlive(weak_bar_))
+  void ZapWeakMembers(const WeakCallbackInfo& broker) {
+    if (!broker.IsHeapObjectAlive(weak_bar_))
       weak_bar_ = nullptr;
   }
 
@@ -1007,13 +1008,13 @@
   bool DidCallWillFinalize() const { return did_call_will_finalize_; }
 
   void Trace(blink::Visitor* visitor) {
-    visitor->template RegisterWeakMembers<
+    visitor->template RegisterWeakCallbackMethod<
         FinalizationObserver<T>, &FinalizationObserver<T>::ZapWeakMembers>(
         this);
   }
 
-  void ZapWeakMembers(Visitor* visitor) {
-    if (data_ && !ThreadHeap::IsHeapObjectAlive(data_)) {
+  void ZapWeakMembers(const WeakCallbackInfo& broker) {
+    if (data_ && !broker.IsHeapObjectAlive(data_)) {
       data_->WillFinalize();
       data_ = nullptr;
       did_call_will_finalize_ = true;
diff --git a/third_party/blink/renderer/platform/heap/incremental_marking_test.cc b/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
index b38716fc..c3725ad1 100644
--- a/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
+++ b/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
@@ -85,7 +85,7 @@
                                void*) final {}
   void VisitBackingStoreOnly(void*, void**) final {}
   void RegisterBackingStoreCallback(void* slot, MovingObjectCallback) final {}
-  void RegisterWeakCallback(void* closure, WeakCallback) final {}
+  void RegisterWeakCallback(WeakCallback, void*) final {}
   void Visit(const TraceWrapperV8Reference<v8::Value>&) final {}
 
  private:
diff --git a/third_party/blink/renderer/platform/heap/marking_verifier.h b/third_party/blink/renderer/platform/heap/marking_verifier.h
index 786fad3..14e53676 100644
--- a/third_party/blink/renderer/platform/heap/marking_verifier.h
+++ b/third_party/blink/renderer/platform/heap/marking_verifier.h
@@ -35,7 +35,7 @@
   // Unused overrides.
   void VisitBackingStoreOnly(void*, void**) final {}
   void RegisterBackingStoreCallback(void*, MovingObjectCallback) final {}
-  void RegisterWeakCallback(void*, WeakCallback) final {}
+  void RegisterWeakCallback(WeakCallback, void*) final {}
   void Visit(const TraceWrapperV8Reference<v8::Value>&) final {}
 
  private:
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.cc b/third_party/blink/renderer/platform/heap/marking_visitor.cc
index d2fd2ee..65540b0 100644
--- a/third_party/blink/renderer/platform/heap/marking_visitor.cc
+++ b/third_party/blink/renderer/platform/heap/marking_visitor.cc
@@ -39,9 +39,9 @@
   backing_store_callback_worklist_.FlushToGlobal();
 }
 
-void MarkingVisitorCommon::RegisterWeakCallback(void* object,
-                                                WeakCallback callback) {
-  weak_callback_worklist_.Push({object, callback});
+void MarkingVisitorCommon::RegisterWeakCallback(WeakCallback callback,
+                                                void* object) {
+  weak_callback_worklist_.Push({callback, object});
 }
 
 void MarkingVisitorCommon::RegisterBackingStoreReference(void** slot) {
@@ -76,7 +76,7 @@
       HeapObjectHeader::FromPayload(desc.base_object_payload)
           ->IsMarked<HeapObjectHeader::AccessMode::kAtomic>())
     return;
-  RegisterWeakCallback(object_weak_ref, callback);
+  RegisterWeakCallback(callback, object_weak_ref);
 }
 
 void MarkingVisitorCommon::VisitBackingStoreStrongly(void* object,
@@ -99,7 +99,7 @@
   RegisterBackingStoreReference(object_slot);
   if (!object)
     return;
-  RegisterWeakCallback(weak_callback_parameter, weak_callback);
+  RegisterWeakCallback(weak_callback, weak_callback_parameter);
 
   if (weak_desc.callback) {
     weak_table_worklist_.Push(
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.h b/third_party/blink/renderer/platform/heap/marking_visitor.h
index c06c3b85..0bb441d 100644
--- a/third_party/blink/renderer/platform/heap/marking_visitor.h
+++ b/third_party/blink/renderer/platform/heap/marking_visitor.h
@@ -49,7 +49,7 @@
   // For Blink, |HeapLinkedHashSet<>| is currently the only abstraction which
   // relies on this feature.
   void RegisterBackingStoreCallback(void*, MovingObjectCallback) final;
-  void RegisterWeakCallback(void*, WeakCallback) final;
+  void RegisterWeakCallback(WeakCallback, void*) final;
 
   // Flush private segments remaining in visitor's worklists to global pools.
   void FlushCompactionWorklists();
diff --git a/third_party/blink/renderer/platform/heap/persistent.h b/third_party/blink/renderer/platform/heap/persistent.h
index a2e9ed6..0b098c1 100644
--- a/third_party/blink/renderer/platform/heap/persistent.h
+++ b/third_party/blink/renderer/platform/heap/persistent.h
@@ -304,7 +304,7 @@
                   "T needs to be a garbage collected object");
     DCHECK(!IsHashTableDeletedValue());
     if (weaknessConfiguration == kWeakPersistentConfiguration) {
-      visitor->RegisterWeakCallback(this, HandleWeakPersistent);
+      visitor->RegisterWeakCallback(HandleWeakPersistent, this);
     } else {
 #if BUILDFLAG(RAW_HEAP_SNAPSHOTS)
       visitor->TraceRoot(raw_, location_.get());
@@ -384,7 +384,8 @@
 #endif
   }
 
-  static void HandleWeakPersistent(Visitor* self, void* persistent_pointer) {
+  static void HandleWeakPersistent(const WeakCallbackInfo&,
+                                   void* persistent_pointer) {
     using Base =
         PersistentBase<typename std::remove_const<T>::type,
                        weaknessConfiguration, crossThreadnessConfiguration>;
diff --git a/third_party/blink/renderer/platform/heap/visitor.h b/third_party/blink/renderer/platform/heap/visitor.h
index 0fccc12..81ea157 100644
--- a/third_party/blink/renderer/platform/heap/visitor.h
+++ b/third_party/blink/renderer/platform/heap/visitor.h
@@ -52,6 +52,7 @@
 
 template <typename T>
 class GarbageCollected;
+class WeakCallbackInfo;
 template <typename T>
 struct TraceTrait;
 class ThreadState;
@@ -76,6 +77,14 @@
   }
 };
 
+template <typename T, void (T::*method)(const WeakCallbackInfo&)>
+struct WeakCallbackMethodDelegate {
+  STATIC_ONLY(WeakCallbackMethodDelegate);
+  static void Trampoline(const WeakCallbackInfo& broker, void* self) {
+    (reinterpret_cast<T*>(self)->*method)(broker);
+  }
+};
+
 // Visitor is used to traverse Oilpan's object graph.
 class PLATFORM_EXPORT Visitor {
   USING_FAST_MALLOC(Visitor);
@@ -202,20 +211,12 @@
     TraceTrait<T>::Trace(this, &const_cast<T&>(t));
   }
 
-  // Registers a callback for custom weakness.
-  template <typename T, void (T::*method)(Visitor*)>
-  void RegisterWeakMembers(const T* obj) {
-    RegisterWeakCallback(const_cast<T*>(obj),
-                         &TraceMethodDelegate<T, method>::Trampoline);
-  }
-
-  using EphemeronTracingCallback = bool (*)(Visitor*, void*);
-  virtual bool VisitEphemeronKeyValuePair(
-      void* key,
-      void* value,
-      EphemeronTracingCallback key_trace_callback,
-      EphemeronTracingCallback value_trace_callback) {
-    return true;
+  // Registers an instance method using |RegisterWeakCallback|. See description
+  // below.
+  template <typename T, void (T::*method)(const WeakCallbackInfo&)>
+  void RegisterWeakCallbackMethod(const T* obj) {
+    RegisterWeakCallback(&WeakCallbackMethodDelegate<T, method>::Trampoline,
+                         const_cast<T*>(obj));
   }
 
   // Cross-component tracing interface.
@@ -247,6 +248,17 @@
                                        void*) = 0;
   virtual void VisitBackingStoreOnly(void*, void**) = 0;
 
+  // Visits ephemeron pairs which are a combination of weak and strong keys and
+  // values.
+  using EphemeronTracingCallback = bool (*)(Visitor*, void*);
+  virtual bool VisitEphemeronKeyValuePair(
+      void* key,
+      void* value,
+      EphemeronTracingCallback key_trace_callback,
+      EphemeronTracingCallback value_trace_callback) {
+    return true;
+  }
+
   // Visits cross-component references to V8.
 
   virtual void Visit(const TraceWrapperV8Reference<v8::Value>&) = 0;
@@ -256,15 +268,19 @@
   virtual void RegisterBackingStoreCallback(void* backing,
                                             MovingObjectCallback) = 0;
 
-  // |WeakCallback| will usually use |ObjectAliveTrait| to figure out liveness
-  // of any children of |closure|. Upon return from the callback all references
-  // to dead objects must have been purged. Any operation that extends the
-  // object graph, including allocation or reviving objects, is prohibited.
-  // Clearing out additional pointers is allowed. Note that removing elements
-  // from heap collections such as HeapHashSet can cause an allocation if the
-  // backing store requires resizing. These collections know how to deal with
-  // WeakMember elements though.
-  virtual void RegisterWeakCallback(void* closure, WeakCallback) = 0;
+  // Adds a |callback| that is invoked with |parameter| after liveness has been
+  // computed on the whole object graph. The |callback| may use the provided
+  // |WeakCallbackInfo| to determine whether an object is considered alive or
+  // dead.
+  //
+  // - Upon returning from the callback all references to dead objects must have
+  //   been cleared.
+  // - Any operation that extends the object graph, including allocation
+  //   or reviving objects, is prohibited.
+  // - Clearing out pointers is allowed.
+  // - Removing elements from heap collections is allowed as these collections
+  //   are aware of custom weakness and won't resize their backings.
+  virtual void RegisterWeakCallback(WeakCallback callback, void* parameter) = 0;
 
  protected:
   template <typename T>
@@ -279,7 +295,7 @@
 
  private:
   template <typename T>
-  static void HandleWeakCell(Visitor* self, void*);
+  static void HandleWeakCell(const WeakCallbackInfo&, void*);
 
   ThreadState* const state_;
 };
diff --git a/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc b/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
index 41e0301..d9c2c3c 100644
--- a/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
@@ -67,13 +67,12 @@
 }
 
 void MemoryCacheEntry::Trace(blink::Visitor* visitor) {
-  visitor->template RegisterWeakMembers<MemoryCacheEntry,
-                                        &MemoryCacheEntry::ClearResourceWeak>(
-      this);
+  visitor->template RegisterWeakCallbackMethod<
+      MemoryCacheEntry, &MemoryCacheEntry::ClearResourceWeak>(this);
 }
 
-void MemoryCacheEntry::ClearResourceWeak(Visitor* visitor) {
-  if (!resource_ || ThreadHeap::IsHeapObjectAlive(resource_))
+void MemoryCacheEntry::ClearResourceWeak(const WeakCallbackInfo& broker) {
+  if (!resource_ || broker.IsHeapObjectAlive(resource_))
     return;
   GetMemoryCache()->Remove(resource_.Get());
   resource_.Clear();
diff --git a/third_party/blink/renderer/platform/loader/fetch/memory_cache.h b/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
index b3000a9..bc8e09b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
+++ b/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
@@ -55,9 +55,9 @@
   Resource* GetResource() const { return resource_; }
 
  private:
-  void ClearResourceWeak(Visitor*);
+  void ClearResourceWeak(const WeakCallbackInfo&);
 
-  WeakMember<Resource> resource_;
+  UntracedMember<Resource> resource_;
 };
 
 // This cache holds subresources used by Web pages: images, scripts,
diff --git a/third_party/blink/renderer/platform/wtf/hash_table.h b/third_party/blink/renderer/platform/wtf/hash_table.h
index 71fadad..c38ae79f 100644
--- a/third_party/blink/renderer/platform/wtf/hash_table.h
+++ b/third_party/blink/renderer/platform/wtf/hash_table.h
@@ -2023,7 +2023,7 @@
           typename Allocator>
 struct WeakProcessingHashTableHelper {
   STATIC_ONLY(WeakProcessingHashTableHelper);
-  static void Process(typename Allocator::Visitor* visitor, void* closure) {}
+  static void Process(const typename Allocator::WeakCallbackInfo&, void*) {}
 };
 
 template <typename Key,
@@ -2053,8 +2053,9 @@
   using ValueType = typename HashTableType::ValueType;
 
   // Used for purely weak and for weak-and-strong tables (ephemerons).
-  static void Process(typename Allocator::Visitor* visitor, void* closure) {
-    HashTableType* table = reinterpret_cast<HashTableType*>(closure);
+  static void Process(const typename Allocator::WeakCallbackInfo& broker,
+                      void* parameter) {
+    HashTableType* table = reinterpret_cast<HashTableType*>(parameter);
     // During incremental marking, the table may be freed after the callback has
     // been registered.
     if (!table->table_)
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 5747369..891831b 100644
--- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
+++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -41,7 +41,7 @@
 crbug.com/982194 animations/rotate-transform-equivalent.html [ Failure ]
 crbug.com/982194 compositing/backgrounds/fixed-backgrounds.html [ Failure Pass ]
 crbug.com/982194 compositing/flex-composited-animated-table-row-background.html [ Crash Failure ]
-crbug.com/982194 compositing/geometry/foreground-offset-change.html [ Crash Failure ]
+crbug.com/982194 compositing/geometry/foreground-offset-change.html [ Crash Failure Pass ]
 crbug.com/982194 compositing/geometry/limit-layer-bounds-opacity-transition.html [ Failure ]
 crbug.com/982194 compositing/geometry/limit-layer-bounds-positioned.html [ Failure ]
 crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-composited-scrolled-late-noncomposite.html [ Failure ]
@@ -76,8 +76,8 @@
 crbug.com/982194 compositing/iframes/invisible-nested-iframe-show.html [ Crash ]
 crbug.com/982194 compositing/iframes/layout-on-compositing-change.html [ Crash Failure ]
 crbug.com/982194 compositing/layer-creation/fixed-position-out-of-view-positioning.html [ Crash ]
-crbug.com/982194 compositing/overflow/ancestor-overflow.html [ Crash ]
-crbug.com/982194 compositing/overflow/get-transform-from-non-box-container.html [ Crash ]
+crbug.com/982194 compositing/overflow/ancestor-overflow.html [ Crash Pass ]
+crbug.com/982194 compositing/overflow/get-transform-from-non-box-container.html [ Crash Pass ]
 crbug.com/982194 compositing/overflow/scroll-children-do-not-paint-comp-scroll-phase.html [ Failure ]
 crbug.com/982194 compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ Crash Failure ]
 crbug.com/982194 compositing/reflections/remove-reflection.html [ Crash Pass ]
@@ -117,14 +117,14 @@
 crbug.com/982194 css3/blending/mix-blend-mode-simple-text.html [ Failure ]
 crbug.com/982194 css3/blending/mix-blend-mode-simple.html [ Failure ]
 crbug.com/982194 css3/filters/filtered-inline.html [ Failure ]
-crbug.com/982194 css3/flexbox/flexbox-baseline-margins.html [ Crash Failure ]
-crbug.com/982194 css3/flexbox/flexbox-baseline.html [ Crash Failure ]
+crbug.com/982194 css3/flexbox/flexbox-baseline-margins.html [ Crash Failure Pass ]
+crbug.com/982194 css3/flexbox/flexbox-baseline.html [ Crash Failure Pass ]
 crbug.com/982194 css3/flexbox/multiline-shrink-to-fit.html [ Failure Pass ]
-crbug.com/982194 css3/flexbox/percentage-height-replaced-element.html [ Crash Failure ]
+crbug.com/982194 css3/flexbox/percentage-height-replaced-element.html [ Crash Failure Pass ]
 crbug.com/982194 css3/masking/clip-path-reference-box-inline.html [ Failure ]
 crbug.com/982194 css3/masking/clip-path-selection.html [ Crash Failure ]
 crbug.com/982194 css3/masking/inline-in-vertical-rl.html [ Failure ]
-crbug.com/982194 css3/masking/mask-not-clipped.html [ Crash ]
+crbug.com/982194 css3/masking/mask-not-clipped.html [ Crash Pass ]
 crbug.com/982194 css3/selectors3/xml/css3-modsel-14.xml [ Failure Pass ]
 crbug.com/982194 css3/selectors3/xml/css3-modsel-14b.xml [ Failure Pass ]
 crbug.com/982194 css3/selectors3/xml/css3-modsel-14c.xml [ Failure Pass ]
@@ -432,12 +432,12 @@
 crbug.com/982194 external/wpt/2dcontext/building-paths/canvas_complexshapes_arcto_001.htm [ Pass ]
 crbug.com/982194 external/wpt/2dcontext/building-paths/canvas_complexshapes_beziercurveto_001.htm [ Pass ]
 crbug.com/982194 external/wpt/2dcontext/transformations/canvas_transformations_reset_001.html [ Failure Pass ]
-crbug.com/626703 external/wpt/acid/acid3/test.html [ Crash ]
+crbug.com/626703 external/wpt/acid/acid3/test.html [ Crash Pass ]
 crbug.com/986282 external/wpt/client-hints/accept-ch-lifetime.tentative.https.html [ Crash Failure ]
-crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-002.html [ Crash Pass ]
-crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-003.html [ Crash Pass ]
+crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-002.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-003.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/contacts/contacts-select.https.window.html [ Failure ]
-crbug.com/982194 external/wpt/css/CSS2/abspos/hypothetical-inline-alone-on-second-line.html [ Crash ]
+crbug.com/982194 external/wpt/css/CSS2/abspos/hypothetical-inline-alone-on-second-line.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-002.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-004.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/floats-clear/adjacent-floats-001.xht [ Failure Pass ]
@@ -569,10 +569,10 @@
 crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-non-replaced-width-024.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-008.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-float-with-inline-container.html [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-inline-007.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-inline-008.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-negative-margin-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-width-change-inline-container-001.html [ Crash ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-inline-007.xht [ Crash Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-inline-008.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-negative-margin-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-width-change-inline-container-001.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/position-absolute-007.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-001.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-003.xht [ Failure ]
@@ -583,9 +583,9 @@
 crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-031.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-032.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-033.xht [ Failure ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/toogle-abspos-on-relpos-inline-child.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-align/baseline-of-scrollable-1a.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-align/baseline-of-scrollable-1b.html [ Crash ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/toogle-abspos-on-relpos-inline-child.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-align/baseline-of-scrollable-1a.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-align/baseline-of-scrollable-1b.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-backgrounds/background-image-first-line.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-backgrounds/background-repeat/background-repeat-space.xht [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius.html [ Failure ]
@@ -593,20 +593,20 @@
 crbug.com/982194 external/wpt/css/css-cascade/all-prop-001.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-contain/contain-layout-016.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-contain/contain-layout-017.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-011.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-012.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-002.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-011.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-012.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-contain/contain-paint-020.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-contain/contain-paint-021.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-024.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-024.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-contain/contain-size-056.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-005.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-002-inline.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-002-none.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-003-inline.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-003-none.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-flex-002.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-flex-003.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-005.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-002-inline.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-002-none.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-003-inline.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-003-none.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-flex-002.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-flex-003.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-display/display-contents-shadow-dom-1.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-display/display-flow-root-001.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-flexbox/Flexible-order.html [ Failure Pass ]
@@ -617,169 +617,169 @@
 crbug.com/982194 external/wpt/css/css-flexbox/css-flexbox-column-wrap.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/css-flexbox-column.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flex-box-wrap.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flex-flexitem-percentage-prescation.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flex-flow-007.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flex-flow-010.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-flexitem-percentage-prescation.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-flow-007.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-flow-010.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flex-grow-001.xht [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-row-reverse.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-with-row-reverse.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flex-vertical-align-effect.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-content-stretch-2.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-items-stretch-2.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-items-stretch.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-self-stretch.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-1-unitless-basis.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-N-unitless-basis.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-1-unitless-basis.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-N-unitless-basis.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-0-unitless.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-0.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-N-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-basis-shrink.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-basis.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-initial-2.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-initial.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-variable-auto-basis.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-variable-zero-basis.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-none.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-content-stretch-2.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-items-stretch-2.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-items-stretch.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-self-stretch.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-1-unitless-basis.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-N-unitless-basis.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-1-unitless-basis.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-N-unitless-basis.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-0.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-basis-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-basis.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-initial-2.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-initial.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-variable-auto-basis.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-variable-zero-basis.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-none.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flow-column-reverse-wrap-reverse.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flow-column-reverse-wrap.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flow-column-wrap-reverse.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flow-column-wrap.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_generated-flex.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_generated-nested-flex.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_generated-flex.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_generated-nested-flex.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_generated.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-flex-end.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-flex-start.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-negative.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-only.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-negative.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-only.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto-overflow-2.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto-overflow.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-left-ex.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_nested-flex.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_object.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_order-abspos-space-around.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-flex-end.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-flex-start.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-negative.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-only.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-negative.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-only.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto-overflow-2.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto-overflow.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-left-ex.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_nested-flex.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_object.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_order-abspos-space-around.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_order.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_quirks_body.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_quirks_body.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_rtl-flow-reverse.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_rtl-flow.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_rtl-order.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/order/order-with-row-reverse.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/percentage-heights-002.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/percentage-heights-004.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/percentage-heights-002.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/percentage-heights-004.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-center.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-end.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-space-around.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-space-between.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-start.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-base.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-base.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-wrap-reverse.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-flexbox/ttwf-reftest-flex-wrap.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-fonts/font-display/font-display.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-grid/abspos/descendant-static-position-004.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-007.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-009.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-010.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-013.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-017.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-007.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-009.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-010.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-013.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-017.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-grid/alignment/grid-container-baseline-001.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-grid/grid-definition/fr-unit-with-percentage.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-grid/grid-definition/fr-unit.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/fr-unit-with-percentage.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/fr-unit.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-auto-tracks.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-basic.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-repeat-notation.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-layout-z-order-a.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-layout-z-order-b.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-scrollbar-001.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-scrollbar-001.html [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-first-letter-001.html [ Failure Pass ]
@@ -816,32 +816,32 @@
 crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-021.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-paint-api/style-before-pseudo.https.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-paint-api/style-first-letter-pseudo.https.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-007.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-008.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-009.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-011.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-007.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-008.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-009.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-crash-chrome-011.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position-floats-001.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position-floats-003.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position-floats-004.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-002.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-002.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/css-position/position-sticky-inline.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-position/position-sticky-input-box-gets-focused-after-scroll.html [ Crash Pass ]
-crbug.com/982194 external/wpt/css/css-position/position-sticky-nested-inline.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-position/position-sticky-nested-inline.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/css-position/position-sticky-writing-modes.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-position/static-position/htb-ltr-ltr.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/htb-ltr-rtl.tentative.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/htb-rtl-ltr.tentative.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/htb-rtl-rtl.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/vlr-ltr-ltr.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/vlr-ltr-rtl.tentative.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/vlr-rtl-ltr.tentative.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/vlr-rtl-rtl.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/vrl-ltr-ltr.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/vrl-ltr-rtl.tentative.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/vrl-rtl-ltr.tentative.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/static-position/vrl-rtl-rtl.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-position/static-position/htb-ltr-ltr.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/htb-ltr-rtl.tentative.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/htb-rtl-ltr.tentative.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/htb-rtl-rtl.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/vlr-ltr-ltr.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/vlr-ltr-rtl.tentative.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/vlr-rtl-ltr.tentative.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/vlr-rtl-rtl.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/vrl-ltr-ltr.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/vrl-ltr-rtl.tentative.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/vrl-rtl-ltr.tentative.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/static-position/vrl-rtl-rtl.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-pseudo/first-letter-of-html-root-crash.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-pseudo/first-letter-opacity-float-001.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-pseudo/first-line-change-inline-color-nested.html [ Failure ]
@@ -858,31 +858,31 @@
 crbug.com/982194 external/wpt/css/css-sizing/intrinsic-percent-replaced-006.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-sizing/orthogonal-writing-mode-float-in-inline.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-sizing/slice-intrinsic-size.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-color.html [ Pass ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-color-001.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-filled-001.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-open-001.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-shape-001.xht [ Crash ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-string-001.xht [ Crash ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-color-001.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-filled-001.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-open-001.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-shape-001.xht [ Crash Failure ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-string-001.xht [ Crash Failure ]
 crbug.com/982194 external/wpt/css/css-text-decor/text-underline-offset-002.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-018.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-019.html [ Crash ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-018.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-019.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/css-text/white-space/white-space-intrinsic-size-001.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-text/white-space/white-space-intrinsic-size-002.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-text/white-space/white-space-intrinsic-size-003.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-text/white-space/white-space-intrinsic-size-004.html [ Failure Pass ]
 crbug.com/669473 external/wpt/css/css-ui/outline-016.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-ui/outline-020.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-ui/text-overflow-ellipsis-abspos-in-inline-block-crash-001.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-ellipsis-abspos-in-inline-block-crash-001.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-ui/text-overflow-ruby.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-writig-modes/sizing-orthog-htb-in-vlr-011.xht [ Failure ]
 crbug.com/982194 external/wpt/css/css-writing-modes/block-flow-direction-vlr-007.xht [ Failure Pass ]
@@ -970,11 +970,11 @@
 crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-trailing-space-inline.html [ Failure ]
 crbug.com/982194 external/wpt/css/cssom-view/scrollIntoView-svg-shape.html [ Failure ]
 crbug.com/982194 external/wpt/css/csui/text-overflow-002.html [ Failure ]
-crbug.com/982194 external/wpt/css/filter-effects/filter-cb-abspos-inline-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/filter-effects/filter-cb-abspos-inline-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/filter-effects/filter-cb-abspos-inline-003.html [ Crash ]
+crbug.com/982194 external/wpt/css/filter-effects/filter-cb-abspos-inline-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/filter-effects/filter-cb-abspos-inline-002.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/filter-effects/filter-cb-abspos-inline-003.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-applies-to-float.html [ Failure ]
-crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-is-container.html [ Crash ]
+crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-is-container.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/selectors/focus-display-none-001.html [ Crash Pass ]
 crbug.com/846656 external/wpt/css/selectors/focus-visible-002-manual.html [ Crash Timeout ]
 crbug.com/982194 external/wpt/css/selectors/focus-visible-003-manual.html [ Crash Timeout ]
@@ -988,9 +988,9 @@
 crbug.com/982194 external/wpt/css/selectors/remove-hovered-element.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/selectors/selection-image-001.html [ Crash ]
 crbug.com/982194 external/wpt/css/selectors/selection-image-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-layout-ignored-cases-ib-split-001.html [ Crash ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-layout-ignored-cases-ib-split-001.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-layout-overflow-002.html [ Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ib-split-001.html [ Crash ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ib-split-001.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/dependent-builtin.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback-invalid.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback.html [ Failure Pass ]
@@ -1018,28 +1018,28 @@
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-001b.xhtml [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-002.xhtml [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-008.xhtml [ Failure Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-block.xhtml [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-table.xhtml [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-003.xhtml [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-004.xhtml [ Crash Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-block.xhtml [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-table.xhtml [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-003.xhtml [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-004.xhtml [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-stretch-vert-002.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-002.xhtml [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-rtl-001.xhtml [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-rtl-005.xhtml [ Failure Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001a.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001b.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-001.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-002.html [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001a.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001b.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-canvas-horiz-001.xhtml [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-canvas-horiz-001v.xhtml [ Crash Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001a.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001b.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-001.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-002.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001a.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001b.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-canvas-horiz-001.xhtml [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-canvas-horiz-001v.xhtml [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-fieldset-horiz-001.xhtml [ Crash Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-iframe-horiz-001.xhtml [ Crash Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-img-horiz-001.xhtml [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-textarea-horiz-001.xhtml [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-video-horiz-001.xhtml [ Crash Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-textarea-horiz-001.xhtml [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-video-horiz-001.xhtml [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-002a.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-002b.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Failure Pass ]
@@ -1060,8 +1060,8 @@
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-001.xhtml [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-safe-overflow-position-001.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-sizing-horiz-001.xhtml [ Failure Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-sizing-horiz-002.xhtml [ Crash Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-whitespace-handling-002.xhtml [ Crash Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-sizing-horiz-002.xhtml [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-whitespace-handling-002.xhtml [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-001.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-002.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-003.html [ Failure Pass ]
@@ -1416,7 +1416,7 @@
 crbug.com/982194 fast/block/float/float-overflow-hidden-containing-block-width.html [ Failure ]
 crbug.com/982194 fast/block/float/float-overhanging-grandparent-change-self-painting.html [ Failure Pass ]
 crbug.com/982194 fast/block/float/float-overhangs-root.html [ Failure Pass ]
-crbug.com/982194 fast/block/float/floats-not-cleared-from-grand-parents.html [ Crash ]
+crbug.com/982194 fast/block/float/floats-not-cleared-from-grand-parents.html [ Crash Pass ]
 crbug.com/982194 fast/block/float/intruding-painted-twice.html [ Failure Pass ]
 crbug.com/982194 fast/block/float/nowrap-clear-min-width.html [ Failure ]
 crbug.com/982194 fast/block/float/overhanging-after-height-decrease.html [ Failure Pass ]
@@ -1435,11 +1435,11 @@
 crbug.com/982194 fast/block/float/previous-sibling-float-002.html [ Failure Pass ]
 crbug.com/982194 fast/block/float/relative-painted-twice.html [ Failure ]
 crbug.com/982194 fast/block/float/selection-gap-clip-out-tiger-crash.html [ Crash Pass ]
-crbug.com/982194 fast/block/line-layout/crash-in-isolate-with-positioned-child.html [ Crash ]
-crbug.com/982194 fast/block/line-layout/line-break-obj-removal-crash.html [ Crash ]
+crbug.com/982194 fast/block/line-layout/crash-in-isolate-with-positioned-child.html [ Crash Pass ]
+crbug.com/982194 fast/block/line-layout/line-break-obj-removal-crash.html [ Crash Pass ]
 crbug.com/982194 fast/block/line-layout/line-break-removal-near-textarea-crash.html [ Crash Pass ]
-crbug.com/982194 fast/block/margin-collapse/block-inside-inline/015.html [ Crash ]
-crbug.com/982194 fast/block/margin-collapse/block-inside-inline/016.html [ Crash ]
+crbug.com/982194 fast/block/margin-collapse/block-inside-inline/015.html [ Crash Pass ]
+crbug.com/982194 fast/block/margin-collapse/block-inside-inline/016.html [ Crash Pass ]
 crbug.com/982194 fast/block/margin-collapse/block-inside-inline/021.html [ Failure ]
 crbug.com/982194 fast/block/margin-collapse/block-inside-inline/022.html [ Failure ]
 crbug.com/982194 fast/block/margin-collapse/block-inside-inline/025.html [ Failure Pass ]
@@ -1447,20 +1447,20 @@
 crbug.com/982194 fast/block/margin-collapse/self-collapsing-block-with-float-child.html [ Failure Pass ]
 crbug.com/982194 fast/block/margin-collapse/self-collapsing-block-with-float-descendants.html [ Failure Pass ]
 crbug.com/982194 fast/block/multicol-paint-invalidation-assert.html [ Crash Pass ]
-crbug.com/982194 fast/block/positioning/052.html [ Crash ]
-crbug.com/982194 fast/block/positioning/058.html [ Crash ]
-crbug.com/982194 fast/block/positioning/abs-inside-inline-rel.html [ Crash ]
+crbug.com/982194 fast/block/positioning/052.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/058.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/abs-inside-inline-rel.html [ Crash Pass ]
 crbug.com/982194 fast/block/positioning/absolute-appended-to-inline.html [ Timeout ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-dynamic.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr-2.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr-3.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl-2.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl-3.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-short-ltr.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-short-rtl.html [ Crash ]
-crbug.com/982194 fast/block/positioning/absolute-layout-after-image-load.html [ Crash ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-dynamic.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr-2.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr-3.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl-2.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl-3.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-short-ltr.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-short-rtl.html [ Crash Failure ]
+crbug.com/982194 fast/block/positioning/absolute-layout-after-image-load.html [ Crash Pass ]
 crbug.com/982194 fast/block/positioning/auto/vertical-lr/001.html [ Failure ]
 crbug.com/982194 fast/block/positioning/auto/vertical-lr/002.html [ Failure ]
 crbug.com/982194 fast/block/positioning/auto/vertical-lr/003.html [ Failure ]
@@ -1468,28 +1468,28 @@
 crbug.com/982194 fast/block/positioning/auto/vertical-lr/005.html [ Failure ]
 crbug.com/982194 fast/block/positioning/auto/vertical-lr/006.html [ Failure ]
 crbug.com/982194 fast/block/positioning/auto/vertical-lr/007.html [ Failure ]
-crbug.com/982194 fast/block/positioning/border-change-relayout-test.html [ Crash ]
-crbug.com/982194 fast/block/positioning/complex-positioned-movement-inline-ancestor.html [ Crash ]
-crbug.com/982194 fast/block/positioning/complex-positioned-movement-inline.html [ Crash ]
-crbug.com/982194 fast/block/positioning/hiding-inside-relpositioned-inline.html [ Crash ]
+crbug.com/982194 fast/block/positioning/border-change-relayout-test.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/complex-positioned-movement-inline-ancestor.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/complex-positioned-movement-inline.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/hiding-inside-relpositioned-inline.html [ Crash Failure ]
 crbug.com/982194 fast/block/positioning/hittest-on-relative-positioned-children.html [ Crash Failure ]
-crbug.com/982194 fast/block/positioning/mark-layout-on-chain-of-pos-objects.html [ Crash ]
+crbug.com/982194 fast/block/positioning/mark-layout-on-chain-of-pos-objects.html [ Crash Pass ]
 crbug.com/982194 fast/block/positioning/negative-right-pos.html [ Failure ]
-crbug.com/982194 fast/block/positioning/positioned-float-layout-after-image-load.html [ Crash ]
-crbug.com/982194 fast/block/positioning/rel-positioned-inline-changes-width.html [ Crash ]
+crbug.com/982194 fast/block/positioning/positioned-float-layout-after-image-load.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/rel-positioned-inline-changes-width.html [ Crash Failure ]
 crbug.com/982194 fast/block/positioning/relative-overflow-replaced-float.html [ Failure ]
 crbug.com/982194 fast/block/positioning/relative-overflow-replaced.html [ Failure ]
-crbug.com/982194 fast/block/positioning/relative-positioned-inline-container.html [ Crash ]
-crbug.com/982194 fast/block/positioning/relayout-nested-positioned-elements-crash.html [ Crash ]
-crbug.com/982194 fast/block/positioning/removing-inside-relpositioned-inline-crash.html [ Crash ]
-crbug.com/982194 fast/block/positioning/rtl-static-positioning-inline-block.html [ Crash ]
-crbug.com/982194 fast/block/positioning/rtl-static-positioning.html [ Crash ]
-crbug.com/982194 fast/block/positioning/table-cell-static-position.html [ Crash ]
-crbug.com/982194 fast/block/positioning/trailing-space-test.html [ Crash ]
+crbug.com/982194 fast/block/positioning/relative-positioned-inline-container.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/relayout-nested-positioned-elements-crash.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/removing-inside-relpositioned-inline-crash.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/rtl-static-positioning-inline-block.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/rtl-static-positioning.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/table-cell-static-position.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/trailing-space-test.html [ Crash Pass ]
 crbug.com/982194 fast/block/positioning/vertical-lr/001.html [ Failure ]
 crbug.com/982194 fast/borders/bidi-012.html [ Failure Pass ]
 crbug.com/982194 fast/borders/border-image-inherits-with-border.html [ Failure Pass ]
-crbug.com/982194 fast/borders/border-image-outset-split-inline.html [ Failure ]
+crbug.com/982194 fast/borders/border-image-outset-split-inline.html [ Crash Failure ]
 crbug.com/982194 fast/borders/border-radius-position.html [ Crash Pass ]
 crbug.com/982194 fast/borders/border-styles-split.html [ Failure ]
 crbug.com/982194 fast/borders/border-width-below-1.html [ Failure Pass ]
@@ -1500,9 +1500,9 @@
 crbug.com/982194 fast/borders/rtl-border-02.html [ Failure ]
 crbug.com/982194 fast/borders/rtl-border-03.html [ Failure ]
 crbug.com/982194 fast/borders/rtl-border-05.html [ Failure ]
-crbug.com/982194 fast/box-shadow/box-shadow-radius.html [ Crash ]
+crbug.com/982194 fast/box-shadow/box-shadow-radius.html [ Crash Pass ]
 crbug.com/982194 fast/box-shadow/box-shadow.html [ Failure Pass ]
-crbug.com/982194 fast/box-shadow/inset-box-shadow-radius.html [ Crash ]
+crbug.com/982194 fast/box-shadow/inset-box-shadow-radius.html [ Crash Pass ]
 crbug.com/982194 fast/box-shadow/inset-with-extraordinary-radii-and-border.html [ Failure Pass ]
 crbug.com/982194 fast/box-shadow/spread.html [ Failure Pass ]
 crbug.com/982194 fast/canvas-api/canvas-hit-regions-event-test.html [ Crash Pass ]
@@ -1512,16 +1512,16 @@
 crbug.com/982194 fast/css-generated-content/hover-inline.html [ Failure ]
 crbug.com/982194 fast/css-generated-content/hover-style-change.html [ Crash Pass ]
 crbug.com/982194 fast/css-generated-content/positioned-background-hit-test-crash.html [ Crash Pass ]
-crbug.com/982194 fast/css-generated-content/positioned-generated-content-under-run-in-crash.html [ Crash ]
+crbug.com/982194 fast/css-generated-content/positioned-generated-content-under-run-in-crash.html [ Crash Pass ]
 crbug.com/982194 fast/css-generated-content/table-parts-before-and-after.html [ Failure ]
 crbug.com/982194 fast/css-grid-layout/float-not-protruding-into-next-grid-item.html [ Failure ]
-crbug.com/982194 fast/css-grid-layout/grid-baseline.html [ Crash Failure ]
-crbug.com/982194 fast/css-grid-layout/grid-container-scroll-accounts-for-auto-margin.html [ Crash Failure ]
+crbug.com/982194 fast/css-grid-layout/grid-baseline.html [ Crash Failure Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-container-scroll-accounts-for-auto-margin.html [ Crash Failure Pass ]
 crbug.com/982194 fast/css-grid-layout/grid-item-margins-not-collapse.html [ Failure Pass ]
 crbug.com/982194 fast/css-grid-layout/grid-item-overflow-paint.html [ Failure ]
-crbug.com/982194 fast/css-grid-layout/grid-item-overflow.html [ Crash Failure ]
+crbug.com/982194 fast/css-grid-layout/grid-item-overflow.html [ Crash Failure Pass ]
 crbug.com/982194 fast/css-grid-layout/grid-self-baseline-01.html [ Failure Pass ]
-crbug.com/982194 fast/css-grid-layout/grid-self-baseline-02-b.html [ Failure ]
+crbug.com/982194 fast/css-grid-layout/grid-self-baseline-02-b.html [ Crash Failure ]
 crbug.com/982194 fast/css-grid-layout/grid-self-baseline-02.html [ Failure ]
 crbug.com/982194 fast/css-grid-layout/grid-self-baseline-03.html [ Failure Pass ]
 crbug.com/982194 fast/css-grid-layout/grid-self-baseline-04.html [ Failure Pass ]
@@ -1539,8 +1539,8 @@
 crbug.com/982194 fast/css-grid-layout/grid-self-baseline-vertical-rl-07.html [ Crash Failure ]
 crbug.com/982194 fast/css-grid-layout/preferred-width-computed-after-layout.html [ Crash Pass ]
 crbug.com/982194 fast/css/007.html [ Failure Pass ]
-crbug.com/982194 fast/css/abs-pos-child-inside-rel-pos-inline-001.html [ Crash ]
-crbug.com/982194 fast/css/abs-pos-child-inside-rel-pos-inline-offset-001.html [ Crash ]
+crbug.com/982194 fast/css/abs-pos-child-inside-rel-pos-inline-001.html [ Crash Pass ]
+crbug.com/982194 fast/css/abs-pos-child-inside-rel-pos-inline-offset-001.html [ Crash Pass ]
 crbug.com/982194 fast/css/acid2.html [ Failure ]
 crbug.com/982194 fast/css/active-pseudo-and-focus-move.html [ Crash Failure ]
 crbug.com/982194 fast/css/area-computedStyle.html [ Timeout ]
@@ -1555,10 +1555,10 @@
 crbug.com/982194 fast/css/containment/change-text-node-data-tab.html [ Failure Pass ]
 crbug.com/982194 fast/css/containment/change-text-node-data.html [ Failure ]
 crbug.com/982194 fast/css/containment/inline-contain-layout-crash.html [ Crash Pass ]
-crbug.com/982194 fast/css/containment/inline-contain-paint-crash.html [ Crash ]
+crbug.com/982194 fast/css/containment/inline-contain-paint-crash.html [ Crash Pass ]
 crbug.com/982194 fast/css/counters/counter-before-content-not-incremented.html [ Crash Pass ]
-crbug.com/982194 fast/css/counters/remove-anonymous-block-wrapper-crash.html [ Crash ]
-crbug.com/982194 fast/css/css-properties-position-relative-as-parent-fixed.html [ Crash ]
+crbug.com/982194 fast/css/counters/remove-anonymous-block-wrapper-crash.html [ Crash Pass ]
+crbug.com/982194 fast/css/css-properties-position-relative-as-parent-fixed.html [ Crash Pass ]
 crbug.com/982194 fast/css/disabled-form-control-elements-should-not-be-active.html [ Failure ]
 crbug.com/982194 fast/css/first-letter-hit-test.html [ Failure ]
 crbug.com/982194 fast/css/first-letter-hover-hit-test.html [ Failure ]
@@ -1566,7 +1566,7 @@
 crbug.com/982194 fast/css/first-line-change-color.html [ Failure ]
 crbug.com/982194 fast/css/first-line-hover-001.html [ Failure ]
 crbug.com/982194 fast/css/font-face-used-after-retired.html [ Crash Pass ]
-crbug.com/982194 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Crash ]
+crbug.com/982194 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Crash Failure ]
 crbug.com/982194 fast/css/hover-active-quirks.html [ Crash Failure ]
 crbug.com/982194 fast/css/hover-after-clicking-embed.html [ Crash Failure ]
 crbug.com/982194 fast/css/hover-display-block-inline.html [ Crash Failure ]
@@ -1584,7 +1584,7 @@
 crbug.com/982194 fast/css/namespaces/003.xml [ Failure ]
 crbug.com/982194 fast/css/outline-auto-empty-rects.html [ Failure ]
 crbug.com/835484 fast/css/outline-narrowLine.html [ Failure ]
-crbug.com/982194 fast/css/positioned-in-relative-position-inline-crash.html [ Crash ]
+crbug.com/982194 fast/css/positioned-in-relative-position-inline-crash.html [ Crash Pass ]
 crbug.com/982194 fast/css/pseudo-active-display-none.html [ Crash Failure ]
 crbug.com/982194 fast/css/pseudo-element-hit-test.html [ Crash ]
 crbug.com/982194 fast/css/pseudostyle-anonymous-text.html [ Crash Pass ]
@@ -1600,7 +1600,7 @@
 crbug.com/982194 fast/css/relative-positioned-block-with-inline-parent-dynamic.html [ Failure ]
 crbug.com/982194 fast/css/relative-positioned-block-with-inline-parent-keeps-style.html [ Failure ]
 crbug.com/982194 fast/css/shadow-multiple.html [ Crash Pass ]
-crbug.com/982194 fast/css/sticky/inline-sticky-abspos-child.html [ Crash ]
+crbug.com/982194 fast/css/sticky/inline-sticky-abspos-child.html [ Crash Pass ]
 crbug.com/982194 fast/css/sticky/sticky-input-box-position.html [ Crash Pass ]
 crbug.com/982194 fast/css/sticky/sticky-top-overflow-scroll-by-fragment.html [ Failure ]
 crbug.com/982194 fast/css/text-overflow-ellipsis-vertical-hittest.html [ Crash Timeout ]
@@ -1718,7 +1718,7 @@
 crbug.com/982194 fast/dom/vertical-scrollbar-in-rtl.html [ Crash Pass ]
 crbug.com/982194 fast/dynamic/005.html [ Failure Pass ]
 crbug.com/982194 fast/dynamic/012.html [ Failure ]
-crbug.com/982194 fast/dynamic/ancestor-to-absolute.html [ Crash ]
+crbug.com/982194 fast/dynamic/ancestor-to-absolute.html [ Crash Pass ]
 crbug.com/982194 fast/dynamic/checkbox-selection-crash.html [ Crash Pass ]
 crbug.com/982194 fast/dynamic/float-no-longer-overhanging.html [ Failure Pass ]
 crbug.com/982194 fast/dynamic/float-withdrawal-2.html [ Failure Pass ]
@@ -1727,14 +1727,14 @@
 crbug.com/982194 fast/dynamic/layer-hit-test-crash.html [ Crash Pass ]
 crbug.com/982194 fast/dynamic/recursive-layout.html [ Crash Pass ]
 crbug.com/982194 fast/dynamic/selection-highlight-adjust.html [ Crash Pass ]
-crbug.com/982194 fast/dynamic/static-to-relative-with-absolute-child.html [ Crash ]
+crbug.com/982194 fast/dynamic/static-to-relative-with-absolute-child.html [ Crash Pass ]
 crbug.com/982194 fast/encoding/mailto-always-utf-8.html [ Crash Timeout ]
 crbug.com/982194 fast/encoding/utf-16-big-endian.html [ Failure ]
 crbug.com/982194 fast/encoding/utf-16-little-endian.html [ Failure ]
 crbug.com/982194 fast/events/anchor-image-scrolled-x-y.html [ Timeout ]
 crbug.com/982194 fast/events/attribute-listener-deletion-crash.html [ Crash Failure ]
 crbug.com/982194 fast/events/autoscroll-disabled-in-fix.html [ Crash Timeout ]
-crbug.com/874695 fast/events/autoscroll-iframe-no-scrolling.html [ Crash Pass ]
+crbug.com/874695 fast/events/autoscroll-iframe-no-scrolling.html [ Crash Pass Timeout ]
 crbug.com/982194 fast/events/autoscroll-in-overflow-hidden-html.html [ Crash ]
 crbug.com/982194 fast/events/autoscroll-nonscrollable-iframe-in-scrollable-div.html [ Crash ]
 crbug.com/982194 fast/events/autoscroll-overflow-hidden-longhands.html [ Crash Pass ]
@@ -1870,7 +1870,7 @@
 crbug.com/982194 fast/events/open-window-from-another-frame.html [ Crash Timeout ]
 crbug.com/982194 fast/events/page-scaled-mouse-click-iframe.html [ Crash ]
 crbug.com/982194 fast/events/page-scaled-mouse-click.html [ Crash Pass ]
-crbug.com/982194 fast/events/pointer-events-2.html [ Crash ]
+crbug.com/982194 fast/events/pointer-events-2.html [ Crash Failure ]
 crbug.com/982194 fast/events/pointer-events.html [ Crash Pass ]
 crbug.com/982194 fast/events/pointerevents/mouse-node-remove.html [ Failure ]
 crbug.com/982194 fast/events/pointerevents/mouse-on-object.html [ Crash ]
@@ -2060,7 +2060,7 @@
 crbug.com/982194 fast/forms/file/file-reset-in-change.html [ Timeout ]
 crbug.com/982194 fast/forms/file/file-user-selection.html [ Timeout ]
 crbug.com/982194 fast/forms/file/file-webkitRelativePath.html [ Crash Timeout ]
-crbug.com/982194 fast/forms/file/get-file-upload.html [ Failure ]
+crbug.com/982194 fast/forms/file/get-file-upload.html [ Crash Failure ]
 crbug.com/982194 fast/forms/file/input-file-entries.html [ Timeout ]
 crbug.com/982194 fast/forms/file/input-file-not-open-without-gesture.html [ Crash Pass ]
 crbug.com/982194 fast/forms/file/input-file-re-render.html [ Timeout ]
@@ -2181,7 +2181,7 @@
 crbug.com/982194 fast/forms/select/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html [ Crash Failure ]
 crbug.com/982194 fast/forms/select/select-selectedIndex-noAnchorIndex-crash.html [ Crash Pass ]
 crbug.com/982194 fast/forms/select_detached_textarea_crash.html [ Crash Pass ]
-crbug.com/982194 fast/forms/setrangetext-out-of-range.html [ Crash Pass ]
+crbug.com/982194 fast/forms/setrangetext-out-of-range.html [ Crash Failure Pass ]
 crbug.com/982194 fast/forms/setrangetext-within-events.html [ Crash Failure ]
 crbug.com/982194 fast/forms/shadow-tree-exposure.html [ Crash Pass ]
 crbug.com/982194 fast/forms/submit-to-blank-multiple-times.html [ Crash Failure ]
@@ -2277,29 +2277,29 @@
 crbug.com/982194 fast/html/set-text-direction.html [ Crash Pass ]
 crbug.com/982194 fast/inline-block/005.html [ Failure ]
 crbug.com/982194 fast/inline-block/baseline-vertical.html [ Failure ]
-crbug.com/982194 fast/inline/add-abspos-before-block-inside-inline.html [ Crash ]
+crbug.com/982194 fast/inline/add-abspos-before-block-inside-inline.html [ Crash Pass ]
 crbug.com/982194 fast/inline/bpm-inline-ancestors.html [ Failure Pass ]
 crbug.com/982194 fast/inline/br-client-rect.html [ Failure Pass ]
 crbug.com/982194 fast/inline/continuation-outlines-with-layers-2.html [ Failure ]
 crbug.com/982194 fast/inline/continuation-outlines-with-layers.html [ Failure ]
-crbug.com/982194 fast/inline/continuation-positioned-reparenting.html [ Crash ]
+crbug.com/982194 fast/inline/continuation-positioned-reparenting.html [ Crash Pass ]
 crbug.com/982194 fast/inline/dirtyLinesForInline.html [ Crash Pass ]
 crbug.com/982194 fast/inline/inline-borders-with-bidi-override.html [ Failure ]
-crbug.com/982194 fast/inline/inline-box-append-child-crash.html [ Crash ]
+crbug.com/982194 fast/inline/inline-box-append-child-crash.html [ Crash Pass ]
 crbug.com/982194 fast/inline/inline-box-background-long-image.html [ Failure ]
 crbug.com/982194 fast/inline/inline-box-background-repeat-x.html [ Failure ]
 crbug.com/982194 fast/inline/inline-box-background-repeat-y.html [ Failure ]
 crbug.com/982194 fast/inline/inline-box-background.html [ Failure ]
-crbug.com/982194 fast/inline/inline-offsetLeft-relpos.html [ Crash ]
-crbug.com/982194 fast/inline/inline-with-empty-inline-children.html [ Crash ]
+crbug.com/982194 fast/inline/inline-offsetLeft-relpos.html [ Crash Failure ]
+crbug.com/982194 fast/inline/inline-with-empty-inline-children.html [ Crash Pass ]
 crbug.com/982194 fast/inline/layout-after-inserting-nested-br.html [ Crash Failure ]
-crbug.com/982194 fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline.html [ Crash ]
+crbug.com/982194 fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline.html [ Crash Pass ]
 crbug.com/889721 fast/inline/outline-continuations.html [ Failure ]
-crbug.com/982194 fast/inline/positioned-element-padding-contributes-width.html [ Crash ]
+crbug.com/982194 fast/inline/positioned-element-padding-contributes-width.html [ Crash Pass ]
 crbug.com/982194 fast/inline/relative-positioned-overflow.html [ Failure ]
-crbug.com/982194 fast/inline/styledEmptyInlinesWithBRs.html [ Crash ]
-crbug.com/982194 fast/layers/inline-dirty-z-order-lists.html [ Crash ]
-crbug.com/982194 fast/layers/layer-visibility.html [ Crash Failure ]
+crbug.com/982194 fast/inline/styledEmptyInlinesWithBRs.html [ Crash Failure ]
+crbug.com/982194 fast/layers/inline-dirty-z-order-lists.html [ Crash Pass ]
+crbug.com/982194 fast/layers/layer-visibility.html [ Crash Failure Pass ]
 crbug.com/982194 fast/layers/normal-flow-hit-test.html [ Failure ]
 crbug.com/982194 fast/layout/scroll-anchoring/anchor-inside-iframe.html [ Crash ]
 crbug.com/982194 fast/layout/scroll-anchoring/reading-scroll-forces-anchoring.html [ Crash ]
@@ -2308,7 +2308,7 @@
 crbug.com/982194 fast/lists/008-vertical.html [ Failure ]
 crbug.com/982194 fast/lists/list-marker-and-layout-tree-change.html [ Failure ]
 crbug.com/982194 fast/lists/markers-in-selection.html [ Failure ]
-crbug.com/982194 fast/lists/positioned-count-crash.html [ Crash ]
+crbug.com/982194 fast/lists/positioned-count-crash.html [ Crash Pass ]
 crbug.com/982194 fast/loader/child-frame-add-after-back-forward.html [ Crash Timeout ]
 crbug.com/982194 fast/loader/document-with-fragment-url-1.html [ Crash Timeout ]
 crbug.com/982194 fast/loader/document-with-fragment-url-2.html [ Crash Timeout ]
@@ -2404,8 +2404,8 @@
 crbug.com/982194 fast/reflections/inline-crash.html [ Crash ]
 crbug.com/982194 fast/replaced/006.html [ Failure Pass ]
 crbug.com/982194 fast/replaced/008.html [ Failure Pass ]
-crbug.com/982194 fast/replaced/absolute-image-position-and-focus-event.html [ Crash ]
-crbug.com/982194 fast/replaced/absolute-position-percentage-height.html [ Crash ]
+crbug.com/982194 fast/replaced/absolute-image-position-and-focus-event.html [ Crash Pass ]
+crbug.com/982194 fast/replaced/absolute-position-percentage-height.html [ Crash Failure ]
 crbug.com/982194 fast/replaced/border-radius-clip.html [ Failure ]
 crbug.com/982194 fast/replaced/image-map-2.html [ Failure ]
 crbug.com/982194 fast/replaced/image-map-alt-content.html [ Crash Failure ]
@@ -2416,26 +2416,26 @@
 crbug.com/982194 fast/replaced/image-map.html [ Crash Failure ]
 crbug.com/982194 fast/replaced/no-focus-ring-embed.html [ Crash Pass Timeout ]
 crbug.com/814953 fast/replaced/no-focus-ring-iframe.html [ Crash Timeout ]
-crbug.com/982194 fast/replaced/no-focus-ring-object.html [ Crash Timeout ]
-crbug.com/982194 fast/replaced/percent-height-in-anonymous-block-in-table.html [ Failure ]
-crbug.com/982194 fast/replaced/percent-height-in-anonymous-block.html [ Failure ]
-crbug.com/982194 fast/replaced/render-inline-cast-to-render-box-crash.html [ Crash ]
-crbug.com/982194 fast/replaced/replaced-element-with-percentage-height-anonymous-block-parent.html [ Failure ]
-crbug.com/982194 fast/replaced/replaced-last-line-layout.html [ Crash ]
+crbug.com/982194 fast/replaced/no-focus-ring-object.html [ Crash Pass Timeout ]
+crbug.com/982194 fast/replaced/percent-height-in-anonymous-block-in-table.html [ Failure Pass ]
+crbug.com/982194 fast/replaced/percent-height-in-anonymous-block.html [ Failure Pass ]
+crbug.com/982194 fast/replaced/render-inline-cast-to-render-box-crash.html [ Crash Pass ]
+crbug.com/982194 fast/replaced/replaced-element-with-percentage-height-anonymous-block-parent.html [ Failure Pass ]
+crbug.com/982194 fast/replaced/replaced-last-line-layout.html [ Crash Pass ]
 crbug.com/982194 fast/replaced/selection-rect-in-table-cell.html [ Crash ]
 crbug.com/982194 fast/replaced/selection-rect-transform.html [ Crash ]
 crbug.com/982194 fast/replaced/selection-rect.html [ Crash ]
 crbug.com/982194 fast/replaced/vertical-lr/absolute-position-percentage-width.html [ Failure ]
 crbug.com/982194 fast/replaced/vertical-lr/absolute-position-with-auto-height-and-top-and-bottom.html [ Crash Failure ]
 crbug.com/982194 fast/replaced/vertical-lr/absolute-position-with-auto-width-and-left-and-right.html [ Crash Failure ]
-crbug.com/982194 fast/replaced/vertical-resize-100percent-element.html [ Failure ]
+crbug.com/982194 fast/replaced/vertical-resize-100percent-element.html [ Failure Pass ]
 crbug.com/982194 fast/ruby/position-after.html [ Failure Pass ]
 crbug.com/982194 fast/scroll-behavior/middleclick-autoscroll-use-count.html [ Crash Pass ]
 crbug.com/982194 fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Crash Pass ]
 crbug.com/982194 fast/scroll-behavior/subframe-interrupted-scroll.html [ Failure ]
 crbug.com/982194 fast/scroll-snap/root-scroller-snap-behaviour/arrow-key-scroll-snaps-visual-viewport.html [ Crash Pass ]
 crbug.com/982194 fast/scroll-snap/snaps-after-keyboard-scrolling-rtl.html [ Crash Pass ]
-crbug.com/982194 fast/scroll-snap/snaps-after-keyboard-scrolling.html [ Crash ]
+crbug.com/982194 fast/scroll-snap/snaps-after-keyboard-scrolling.html [ Crash Pass ]
 crbug.com/986018 fast/scroll-snap/snaps-for-different-key-granularity.html [ Crash Pass ]
 crbug.com/982194 fast/scrolling/hashtag-autoscroll.html [ Crash Pass ]
 crbug.com/982194 fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Crash Pass ]
@@ -2459,7 +2459,7 @@
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-boxes-002.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-boxes-003.html [ Failure Pass ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-clip-path-selection.html [ Failure ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-dynamic-shape-overhang.html [ Crash Failure ]
+crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-dynamic-shape-overhang.html [ Crash Failure Pass ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-different-writing-modes.html [ Failure Pass ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-image-threshold-002.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-no-image-crash.html [ Crash Pass ]
@@ -2526,15 +2526,15 @@
 crbug.com/982194 fast/table/change-tbody-border-width-crash.html [ Crash ]
 crbug.com/982194 fast/table/click-near-anonymous-table.html [ Crash Pass ]
 crbug.com/982194 fast/table/crash-clearSelection-collapsed-borders.html [ Crash Pass ]
-crbug.com/982194 fast/table/dynamic-descendant-percentage-height.html [ Crash Failure ]
+crbug.com/982194 fast/table/dynamic-descendant-percentage-height.html [ Crash Failure Pass ]
 crbug.com/982194 fast/table/floating-th.html [ Failure ]
 crbug.com/982194 fast/table/floatingTablePaintBackground.html [ Failure Pass ]
 crbug.com/982194 fast/table/height-percent-test.html [ Failure Pass ]
 crbug.com/982194 fast/table/intrinsic-padding-when-cell-child-doesnt-layout.html [ Crash Pass ]
 crbug.com/874695 fast/table/multiple-captions-crash3.html [ Crash Pass ]
 crbug.com/982194 fast/table/multiple-captions-display.xhtml [ Failure ]
-crbug.com/982194 fast/table/percent-height-replaced-content-in-cell.html [ Failure ]
-crbug.com/982194 fast/table/table-split-positioned-object-crash.html [ Crash ]
+crbug.com/982194 fast/table/percent-height-replaced-content-in-cell.html [ Failure Pass ]
+crbug.com/982194 fast/table/table-split-positioned-object-crash.html [ Crash Pass ]
 crbug.com/982194 fast/table/vertical-align-baseline.html [ Failure ]
 crbug.com/982194 fast/text-autosizing/layout-after-append.html [ Failure ]
 crbug.com/982194 fast/writing-mode/background-vertical-lr.html [ Failure ]
@@ -2593,14 +2593,14 @@
 crbug.com/982194 html/details_summary/details-add-summary-4-and-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-add-summary-5-and-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-add-summary-6-and-click.html [ Crash Pass ]
-crbug.com/982194 html/details_summary/details-add-summary-7-and-click.html [ Crash Pass ]
+crbug.com/982194 html/details_summary/details-add-summary-7-and-click.html [ Crash Failure Pass ]
 crbug.com/982194 html/details_summary/details-add-summary-8-and-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-add-summary-9-and-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-click-controls.html [ Crash Failure ]
 crbug.com/982194 html/details_summary/details-mouse-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-remove-summary-1-and-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-remove-summary-2-and-click.html [ Crash Pass ]
-crbug.com/982194 html/details_summary/details-remove-summary-3-and-click.html [ Crash ]
+crbug.com/982194 html/details_summary/details-remove-summary-3-and-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-remove-summary-4-and-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-remove-summary-5-and-click.html [ Crash Pass ]
 crbug.com/982194 html/details_summary/details-remove-summary-6-and-click.html [ Crash Pass ]
@@ -2617,39 +2617,39 @@
 crbug.com/982194 html/dialog/simulated-click-inert.html [ Crash Failure ]
 crbug.com/982194 html/sections/body-legacy-colors.html [ Crash Timeout ]
 crbug.com/982194 html/text_level_semantics/a-tooltip.html [ Failure ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/basic-a11y-test.js [ Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/basic-a11y-test.js [ Crash Pass ]
 crbug.com/1000336 http/tests/devtools/a11y-axe-core/devices-a11y-test.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/elements/dom-breakpoints-a11y-test.js [ Crash ]
-crbug.com/1000336 http/tests/devtools/a11y-axe-core/elements/event-listeners-a11y-test.js [ Crash ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/elements/main-tool-test.js [ Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/elements/dom-breakpoints-a11y-test.js [ Crash Pass ]
+crbug.com/1000336 http/tests/devtools/a11y-axe-core/elements/event-listeners-a11y-test.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/elements/main-tool-test.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/a11y-axe-core/performance/performance-pane-a11y-test.js [ Crash Timeout ]
 crbug.com/982194 http/tests/devtools/a11y-axe-core/performance/performance_event_log_a11y_test.js [ Crash Pass Timeout ]
 crbug.com/982194 http/tests/devtools/a11y-axe-core/quick-open-a11y-test.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/a11y-axe-core/settings/emulated-device-a11y-test.js [ Crash Pass ]
 crbug.com/1000336 http/tests/devtools/a11y-axe-core/settings/geolocations-a11y-test.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/call-stack-a11y-test.js [ Crash ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/javascript-breakpoints-a11y-test.js [ Crash ]
-crbug.com/1000336 http/tests/devtools/a11y-axe-core/sources/sources-editor-pane-a11y-test.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-KeyframeEffect-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-after-navigation.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-empty-web-animations.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-group-matching-animations.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-group-matching-transitions.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-group-matching.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-timeline.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-transition-setTiming-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/animation/animation-web-anim-negative-start-time.js [ Crash ]
-crbug.com/982194 http/tests/devtools/application-panel/resources-panel-websql.js [ Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/call-stack-a11y-test.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/javascript-breakpoints-a11y-test.js [ Crash Pass ]
+crbug.com/1000336 http/tests/devtools/a11y-axe-core/sources/sources-editor-pane-a11y-test.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-KeyframeEffect-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-after-navigation.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-empty-web-animations.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-group-matching-animations.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-group-matching-transitions.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-group-matching.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-timeline.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-transition-setTiming-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/animation/animation-web-anim-negative-start-time.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/application-panel/resources-panel-websql.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/command-line-api-inspect.js [ Crash Pass ]
 webkit.org/b/90488 http/tests/devtools/compiler-source-mapping-debug.js [ Crash ]
-crbug.com/982194 http/tests/devtools/components/linkifier.js [ Crash ]
+crbug.com/982194 http/tests/devtools/components/linkifier.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/components/widget-focus.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/console-resource-errors.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/console-sidebar/console-filter-sidebar.js [ Crash ]
+crbug.com/982194 http/tests/devtools/console-sidebar/console-filter-sidebar.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/argument-hints.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/command-line-api-getEventListeners.js [ Crash Pass ]
-crbug.com/451577 http/tests/devtools/console/command-line-api.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/command-line-api.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-api-on-call-frame.js [ Crash ]
 crbug.com/451577 http/tests/devtools/console/console-assert.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-big-array.js [ Crash Pass ]
@@ -2659,7 +2659,7 @@
 crbug.com/451577 http/tests/devtools/console/console-context-selector.js [ Crash ]
 crbug.com/451577 http/tests/devtools/console/console-copy-treeoutline.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-copy-truncated-text.js [ Crash ]
-crbug.com/982194 virtual/text-antialias/absolute-in-inline-block-change-crash.html [ Crash ]
+crbug.com/982194 virtual/text-antialias/absolute-in-inline-block-change-crash.html [ Crash Pass ]
 crbug.com/982194 virtual/text-antialias/atsui-pointtooffset-calls-cg.html [ Crash Pass ]
 crbug.com/982194 virtual/text-antialias/basic/003.html [ Failure Pass ]
 crbug.com/982194 virtual/text-antialias/basic/005.html [ Failure Pass ]
@@ -2669,7 +2669,7 @@
 crbug.com/982194 virtual/text-antialias/editing-text-crash.html [ Crash Pass ]
 crbug.com/982194 virtual/text-antialias/emoji-vertical-origin-visual.html [ Failure ]
 crbug.com/982194 virtual/text-antialias/emphasis-height-crash.html [ Crash Pass ]
-crbug.com/982194 virtual/text-antialias/font-format-support-color-cff2.html [ Crash ]
+crbug.com/982194 virtual/text-antialias/font-format-support-color-cff2.html [ Crash Pass ]
 crbug.com/982194 virtual/text-antialias/get-client-rects-grapheme.html [ Failure ]
 crbug.com/982194 virtual/text-antialias/glyph-reordering.html [ Failure ]
 crbug.com/982194 virtual/text-antialias/in-rendered-text-rtl.html [ Crash Pass ]
@@ -2728,9 +2728,9 @@
 crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-format-es6-2.js [ Crash Failure Pass Timeout ]
 crbug.com/451577 http/tests/devtools/console/console-format-es6.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-format-style.js [ Crash ]
-crbug.com/451577 http/tests/devtools/console/console-group-similar.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/console-group-similar.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-last-result.js [ Crash Pass ]
-crbug.com/451577 http/tests/devtools/console/console-link-to-snippet.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/console-link-to-snippet.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-linkify-message-location.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-links-in-errors-with-trace.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-links-on-messages-before-inspection.js [ Crash Pass ]
@@ -2738,7 +2738,7 @@
 crbug.com/451577 http/tests/devtools/console/console-log-object-with-getter.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-message-contains-async-stack.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/console/console-message-from-inline-with-url.js [ Crash Pass ]
-crbug.com/451577 http/tests/devtools/console/console-native-function.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/console-native-function.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-object-preview.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-pins.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-preserve-scroll.js [ Crash Pass ]
@@ -2747,10 +2747,10 @@
 crbug.com/451577 crbug.com/916975 http/tests/devtools/console/console-repeat-count.js [ Crash Failure Pass Timeout ]
 crbug.com/451577 http/tests/devtools/console/console-retain-autocomplete-on-typing.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-revoke-error-in-worker.js [ Crash Pass ]
-crbug.com/451577 http/tests/devtools/console/console-revoke-error.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/console-revoke-error.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-save-to-temp-var.js [ Crash Pass ]
-crbug.com/451577 http/tests/devtools/console/console-search-reveals-messages.js [ Crash ]
-crbug.com/451577 http/tests/devtools/console/console-search.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/console-search-reveals-messages.js [ Crash Pass ]
+crbug.com/451577 http/tests/devtools/console/console-search.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-smart-enter.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-stack-overflow.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/console-substituted.js [ Crash Pass ]
@@ -2773,9 +2773,9 @@
 crbug.com/451577 http/tests/devtools/console/function-name-in-console-message-stack.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/nested-worker-eval-contains-stack.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/paintworklet-console-selector.js [ Crash Pass ]
-crbug.com/451577 http/tests/devtools/console/shadow-element.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/shadow-element.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/viewport-testing/console-clicking-messages.js [ Crash Pass ]
-crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-expand.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-expand.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-links.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-navigation.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/viewport-testing/console-runtime-result-below-prompt.js [ Crash Pass ]
@@ -2783,454 +2783,454 @@
 crbug.com/451577 http/tests/devtools/console/viewport-testing/console-stick-to-bottom-with-large-prompt.js [ Crash Pass ]
 crbug.com/451577 http/tests/devtools/console/worker-eval-contains-stack.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/copy-network-request.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/coverage/decorations-after-script-formatter.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/coverage/gutter-css.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/gutter-html.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/gutter-js.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/multiple-instances-merge.js [ Crash ]
-crbug.com/846471 http/tests/devtools/coverage/reveal-autoformat.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/coverage/decorations-after-script-formatter.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/coverage/gutter-css.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/gutter-html.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/gutter-js.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/multiple-instances-merge.js [ Crash Pass ]
+crbug.com/846471 http/tests/devtools/coverage/reveal-autoformat.js [ Crash Pass Timeout ]
 crbug.com/678482 http/tests/devtools/debugger/fetch-breakpoints.js [ Crash ]
 crbug.com/982194 http/tests/devtools/editor/text-editor-accessibility.js [ Crash Failure ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-auto-whitespace-removing.js [ Crash ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-block-indent.js [ Crash ]
-crbug.com/846997 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Crash ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-ctrl-d-2.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-auto-whitespace-removing.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-block-indent.js [ Crash Pass ]
+crbug.com/846997 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-ctrl-d-2.js [ Crash Pass Timeout ]
 crbug.com/850358 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Crash Pass Timeout ]
 crbug.com/846982 crbug.com/874695 http/tests/devtools/editor/text-editor-formatter.js [ Crash Pass Timeout ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-goto-matching-bracket.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-goto-matching-bracket.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/editor/text-editor-home-button.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-indent-autodetection.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-indent-autodetection.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/editor/text-editor-reveal-line.js [ Pass Timeout ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-search-replace.js [ Crash ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-selection-to-search.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-search-replace.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-selection-to-search.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/editor/text-editor-smart-braces.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/editor/text-editor-toggle-tab-moves-focus.js [ Crash Pass ]
 crbug.com/420008 crbug.com/749738 http/tests/devtools/editor/text-editor-word-jumps.js [ Crash Pass Timeout ]
-crbug.com/982194 http/tests/devtools/elements/accessibility/autocomplete-attribute.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/accessibility/edit-aria-attributes.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/attribute-modified-ns.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/bidi-dom-tree.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/breadcrumb-updates.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/classes-pane-widget.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/copy-styles.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/css-rule-hover-highlights-selectors.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/css-variables/color-swatch.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/css-variables/defined-css-variables.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/css-variables/resolve-css-variables.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/css-variables/resolve-inherited-css-variables.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/distance/node-distances.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/dom-agent-query-selector.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/dom-search-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/blur-while-edit-as-html.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/delete-from-document.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-after-model-changed.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-1.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-3.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-4.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-style-attribute.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-trimmed-attribute-value.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/insert-node-collapsed.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/perform-undo-undo.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/remove-node.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/set-attribute-non-html.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/set-attribute.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html-2.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html-body.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html-whitespace.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/shadow-dom-modify-chardata.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/switch-panels-while-editing-as-html.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/undo-dom-edits-2.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/undo-dom-edits.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/undo-set-outer-html-2.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/edit/undo-set-outer-html.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-child-node-count-mismatch.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-css-path.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-delete-inline-style.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-hide-html-comments.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-iframe-base-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-img-tooltip.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-inspect-iframe-from-different-domain.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-js-path.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-linkify-attributes.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-correct-case.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-limited-children.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-reload-assert.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-restore-selection-when-node-comes-later.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-rewrite-href.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-search.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-selection-after-delete.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-selection-on-refresh.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-structure.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-panel-styles.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-save-to-temp-var.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-tab-stops.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/elements-treeoutline-copy.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-custom-framework.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-jquery2.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-remove.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/event-listeners-about-blank.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/event-listeners-framework-with-service-worker.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/expand-recursively.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/hide-shortcut.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-css-grid.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-css-shapes-outside-scroll.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-css-shapes-outside.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-detached.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-display-locked.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-dom-updates.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-scaled-and-scrolled.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-scaled.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-scroll.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-styles.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-transformed.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-svg-content-inside-iframe.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-svg-root-zoomed.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-svg-root.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/html-link-import.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/iframe-load-event.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/inline-style-title.js [ Crash ]
-crbug.com/596486 http/tests/devtools/elements/insert-node.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/inspect-limited-children.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/inspect-mode-after-profiling.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/inspect-mode-shadow-text.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/inspect-pointer-events-none.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/inspect-pseudo-element.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/modify-chardata.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/move-node.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/node-reselect-on-append-child.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/node-xpath.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/resolve-alien-node.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/resolve-node-blocked.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/reveal-whitespace-text-node.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/selected-element-changes-execution-context.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/breadcrumb-shadow-roots.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/create-shadow-root.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-1.js [ Crash ]
-crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Crash ]
-crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-3.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/inspect-deep-shadow-element.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/inspect-slot-not-in-shadow-tree.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/reveal-shadow-dom-node.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/shadow-distribution.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/shadow-host-display-modes.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/shadow-root.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/shadow/update-shadowdom.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-invalid-selector.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-keyboard.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-with-style-after-body.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/background-parsing-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/cached-sync-computed-styles.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/case-sensitive-suggestions.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/accessibility/autocomplete-attribute.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/accessibility/edit-aria-attributes.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/attribute-modified-ns.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/bidi-dom-tree.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/breadcrumb-updates.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/classes-pane-widget.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/copy-styles.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/css-rule-hover-highlights-selectors.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/css-variables/color-swatch.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/css-variables/defined-css-variables.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/css-variables/resolve-css-variables.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/css-variables/resolve-inherited-css-variables.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/distance/node-distances.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/dom-agent-query-selector.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/dom-search-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/blur-while-edit-as-html.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/delete-from-document.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-after-model-changed.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-1.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-3.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-4.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-style-attribute.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-trimmed-attribute-value.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/insert-node-collapsed.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/perform-undo-undo.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/remove-node.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/set-attribute-non-html.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/set-attribute.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html-2.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html-body.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html-whitespace.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/set-outer-html.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/shadow-dom-modify-chardata.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/switch-panels-while-editing-as-html.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/undo-dom-edits-2.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/undo-dom-edits.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/undo-set-outer-html-2.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/edit/undo-set-outer-html.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-child-node-count-mismatch.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-css-path.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-delete-inline-style.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-hide-html-comments.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-iframe-base-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-img-tooltip.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-inspect-iframe-from-different-domain.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-js-path.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-linkify-attributes.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-correct-case.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-limited-children.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-reload-assert.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-restore-selection-when-node-comes-later.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-rewrite-href.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-search.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-selection-after-delete.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-selection-on-refresh.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-structure.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-panel-styles.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-save-to-temp-var.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-tab-stops.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/elements-treeoutline-copy.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-custom-framework.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-jquery2.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-remove.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/event-listeners-about-blank.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/event-listeners-framework-with-service-worker.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/expand-recursively.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/hide-shortcut.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-css-grid.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-css-shapes-outside-scroll.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-css-shapes-outside.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-detached.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-display-locked.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-dom-updates.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-scaled-and-scrolled.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-scaled.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-scroll.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-styles.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-transformed.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-svg-content-inside-iframe.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-svg-root-zoomed.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-svg-root.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/html-link-import.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/iframe-load-event.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/inline-style-title.js [ Crash Pass ]
+crbug.com/596486 http/tests/devtools/elements/insert-node.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/inspect-limited-children.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/inspect-mode-after-profiling.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/inspect-mode-shadow-text.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/inspect-pointer-events-none.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/inspect-pseudo-element.js [ Crash Failure ]
+crbug.com/982194 http/tests/devtools/elements/modify-chardata.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/move-node.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/node-reselect-on-append-child.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/node-xpath.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/resolve-alien-node.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/resolve-node-blocked.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/reveal-whitespace-text-node.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/selected-element-changes-execution-context.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/breadcrumb-shadow-roots.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/create-shadow-root.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-1.js [ Crash Pass ]
+crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Crash Pass ]
+crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-3.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/inspect-deep-shadow-element.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/inspect-slot-not-in-shadow-tree.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/reveal-shadow-dom-node.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/shadow-distribution.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/shadow/shadow-host-display-modes.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/shadow-root.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/shadow/update-shadowdom.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-invalid-selector.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-keyboard.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-with-style-after-body.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/background-parsing-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/cached-sync-computed-styles.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/case-sensitive-suggestions.js [ Crash Pass ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js [ Crash Pass Timeout ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/color-swatch.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/commit-selector-mark-matching.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/commit-selector.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/css-live-edit.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/css-outline.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/cssom-media-insert-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/disable-property-workingcopy-update.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/dynamic-style-tag.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/edit-media-text.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/edit-name-with-trimmed-value.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/color-swatch.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/commit-selector-mark-matching.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/commit-selector.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/css-live-edit.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/css-outline.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/cssom-media-insert-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/disable-property-workingcopy-update.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/dynamic-style-tag.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-media-text.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-name-with-trimmed-value.js [ Crash Pass ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-1/edit-resource-referred-by-multiple-styletags.js [ Crash Pass Timeout ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/edit-value-inside-property.js [ Crash ]
-crbug.com/510337 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/edit-value-with-trimmed-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/empty-background-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-1/filter-matched-styles.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/add-import-rule.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/cssom-shorthand-important.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/filter-matched-styles-hides-separators.js [ Crash ]
-crbug.com/994027 http/tests/devtools/elements/styles-2/force-pseudo-state.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/get-set-stylesheet-text.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/import-pseudoclass-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/inactive-properties.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/inherited-mixed-case-properties.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/inject-stylesheet.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/keyframes-rules.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/lazy-computed-style.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/media-emulation.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/media-queries.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/media-using-same-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/metrics-box-sizing.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/multiple-imports-edit-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/page-reload-update-sidebar.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/parse-comments.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/parse-declaration-unterminated-comment.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/parse-declaration-with-quote.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/parse-utf8-bom.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/perform-undo-perform-of-mergable-action.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/property-ui-location.js [ Crash ]
-crbug.com/528419 http/tests/devtools/elements/styles-2/pseudo-elements.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-2/region-style-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/computed-properties-retain-expanded.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/remove-shadow-host.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/selector-list.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/selector-source-data.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/shadow-dom-rules.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/simple-selector.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/style-autocomplete-swatches.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-value-inside-property.js [ Crash Pass ]
+crbug.com/510337 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-value-with-trimmed-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/empty-background-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/filter-matched-styles.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/add-import-rule.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/cssom-shorthand-important.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/filter-matched-styles-hides-separators.js [ Crash Pass ]
+crbug.com/994027 http/tests/devtools/elements/styles-2/force-pseudo-state.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/get-set-stylesheet-text.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/import-pseudoclass-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/inactive-properties.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/inherited-mixed-case-properties.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/inject-stylesheet.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/keyframes-rules.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/lazy-computed-style.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/media-emulation.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/media-queries.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/media-using-same-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/metrics-box-sizing.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/multiple-imports-edit-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/page-reload-update-sidebar.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/parse-comments.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/parse-declaration-unterminated-comment.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/parse-declaration-with-quote.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/parse-utf8-bom.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/perform-undo-perform-of-mergable-action.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/property-ui-location.js [ Crash Pass ]
+crbug.com/528419 http/tests/devtools/elements/styles-2/pseudo-elements.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/region-style-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/computed-properties-retain-expanded.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/remove-shadow-host.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/selector-list.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/selector-source-data.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/shadow-dom-rules.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/simple-selector.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/style-autocomplete-swatches.js [ Crash Pass ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-3/style-autocomplete.js [ Crash Pass Timeout ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/style-rule-from-imported-stylesheet.js [ Crash ]
-crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Crash ]
-crbug.com/994034 http/tests/devtools/elements/styles-3/styles-add-new-rule-colon.js [ Crash ]
-crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule-tab.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-add-new-rule-to-stylesheet.js [ Crash ]
-crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-cancel-editing.js [ Crash ]
-crbug.com/945665 http/tests/devtools/elements/styles-3/styles-change-node-while-editing.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-commit-editing.js [ Crash ]
-crbug.com/994008 http/tests/devtools/elements/styles-3/styles-computed-trace.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-cssom-important-property.js [ Crash ]
-crbug.com/945665 http/tests/devtools/elements/styles-3/styles-disable-inherited.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-property-after-selector-edit.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-then-change.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-then-delete.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-then-enable.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/style-rule-from-imported-stylesheet.js [ Crash Pass ]
+crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Crash Pass ]
+crbug.com/994034 http/tests/devtools/elements/styles-3/styles-add-new-rule-colon.js [ Crash Pass ]
+crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule-tab.js [ Crash Failure ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-add-new-rule-to-stylesheet.js [ Crash Pass ]
+crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule.js [ Crash Failure ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-cancel-editing.js [ Crash Pass ]
+crbug.com/945665 http/tests/devtools/elements/styles-3/styles-change-node-while-editing.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-commit-editing.js [ Crash Pass ]
+crbug.com/994008 http/tests/devtools/elements/styles-3/styles-computed-trace.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-cssom-important-property.js [ Crash Pass ]
+crbug.com/945665 http/tests/devtools/elements/styles-3/styles-disable-inherited.js [ Crash Failure ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-property-after-selector-edit.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-then-change.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-then-delete.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-then-enable.js [ Crash Pass ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-3/styles-variables.js [ Crash Pass Timeout ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/cssom-constructed.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/disable-last-property-without-semicolon.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/do-not-rebuild-styles-on-every-change.js [ Crash ]
-crbug.com/667560 http/tests/devtools/elements/styles-4/inline-style-sourcemap.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/keyframes-source-offsets.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/style-update-during-selector-edit.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-edit-property-after-invalid-rule.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-formatting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-grid-template.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-iframe.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-inherited-same-source.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-keyframes-cssom-injected.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-keyframes-display-none.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/cssom-constructed.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/disable-last-property-without-semicolon.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/do-not-rebuild-styles-on-every-change.js [ Crash Pass ]
+crbug.com/667560 http/tests/devtools/elements/styles-4/inline-style-sourcemap.js [ Crash Failure ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/keyframes-source-offsets.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/style-update-during-selector-edit.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-edit-property-after-invalid-rule.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-formatting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-grid-template.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-iframe.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-inherited-same-source.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-keyframes-cssom-injected.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-keyframes-display-none.js [ Crash Pass ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/styles-keyframes.js [ Crash Pass Timeout ]
-crbug.com/946714 http/tests/devtools/elements/styles-4/styles-live-locations-leak.js [ Crash ]
-crbug.com/982116 http/tests/devtools/elements/styles-4/styles-new-API.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-overloaded-shorthand.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-overriden-properties.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-properties-overload.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-rerequest-sourcemap-on-watchdog.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-should-not-force-sync-style-recalc.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-source-lines-inline.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-source-lines-recovery.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-source-lines.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-source-offsets.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-3.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-4.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-url-linkify.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/styles-with-spaces-in-sourceURL.js [ Crash ]
-crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/supports-rule-after-invalid-selector-rule-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/svg-style.js [ Crash ]
+crbug.com/946714 http/tests/devtools/elements/styles-4/styles-live-locations-leak.js [ Crash Timeout ]
+crbug.com/982116 http/tests/devtools/elements/styles-4/styles-new-API.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-overloaded-shorthand.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-overriden-properties.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-properties-overload.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-rerequest-sourcemap-on-watchdog.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-should-not-force-sync-style-recalc.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-source-lines-inline.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-source-lines-recovery.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-source-lines.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-source-offsets.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-3.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-4.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-url-linkify.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-with-spaces-in-sourceURL.js [ Crash Pass ]
+crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/supports-rule-after-invalid-selector-rule-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/svg-style.js [ Crash Pass ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/undo-add-new-rule.js [ Crash Pass Timeout ]
-crbug.com/978304 http/tests/devtools/elements/styles-4/undo-add-property.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles-4/undo-add-rule-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/cancel-upon-invalid-property.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/edit-css-with-source-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/import-added-through-js-crash.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/inline-stylesheet-sourceurl-and-sourcemapurl.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/original-content-provider.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/selector-line-deprecated.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/selector-line-sourcemap-header-deprecated.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/selector-line.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/elements/styles/show-all-properties.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/styles-do-not-add-inline-stylesheets-in-navigator.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/styles-format-style.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/styles-parse-invalid-properties.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/styles-redirected-css.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/stylesheet-tracking.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/undo-after-cancelled-editing.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/undo-change-property.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/undo-property-toggle.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/undo-set-selector-text.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/up-down-numerics-and-colors.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/updates-during-dom-traversal.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/updates-throttled.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/url-color-swatch.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/url-multiple-collapsing.js [ Crash ]
-crbug.com/982194 http/tests/devtools/elements/styles/xsl-transformed.js [ Crash ]
-crbug.com/451577 http/tests/devtools/elements/user-properties.js [ Crash ]
+crbug.com/978304 http/tests/devtools/elements/styles-4/undo-add-property.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/undo-add-rule-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/cancel-upon-invalid-property.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/edit-css-with-source-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/import-added-through-js-crash.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/inline-stylesheet-sourceurl-and-sourcemapurl.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/original-content-provider.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/selector-line-deprecated.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/selector-line-sourcemap-header-deprecated.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/selector-line.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles/show-all-properties.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/styles-do-not-add-inline-stylesheets-in-navigator.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/styles-format-style.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Crash Failure ]
+crbug.com/982194 http/tests/devtools/elements/styles/styles-parse-invalid-properties.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/styles-redirected-css.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/stylesheet-tracking.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/undo-after-cancelled-editing.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/undo-change-property.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/undo-property-toggle.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/undo-set-selector-text.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/up-down-numerics-and-colors.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/updates-during-dom-traversal.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/updates-throttled.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/url-color-swatch.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/url-multiple-collapsing.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/elements/styles/xsl-transformed.js [ Crash Pass ]
+crbug.com/451577 http/tests/devtools/elements/user-properties.js [ Crash Pass ]
 crbug.com/941860 http/tests/devtools/extensions/extensions-events.js [ Crash ]
-crbug.com/982194 http/tests/devtools/fragment.js [ Crash ]
+crbug.com/982194 http/tests/devtools/fragment.js [ Crash Pass ]
 crbug.com/246190 crbug.com/989860 http/tests/devtools/indexeddb/live-update-indexeddb-list.js [ Crash Failure Pass Timeout ]
-crbug.com/246190 http/tests/devtools/indexeddb/resources-panel.js [ Crash ]
-crbug.com/982194 http/tests/devtools/inspect-element.js [ Crash ]
-crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Crash ]
-crbug.com/982194 http/tests/devtools/modify-cross-domain-rule.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/async-xhr-json-mime-type.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/cached-resource-destroyed-moved-to-storage.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/cached-resource-destroyed-too-big-discarded.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/download.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/failed-request-preview.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/network/failed-request-response-mimetype.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/font-face.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/from-disk-cache-timing.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/har-content.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/har-post.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/html-preview-encoding.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/json-preview.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/load-resource-for-frontend.js [ Crash ]
-crbug.com/327078 http/tests/devtools/network/long-script-content.js [ Crash ]
-crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-cachedresources-with-same-urls.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-choose-preview-view.js [ Crash ]
+crbug.com/246190 http/tests/devtools/indexeddb/resources-panel.js [ Crash Failure Pass ]
+crbug.com/982194 http/tests/devtools/inspect-element.js [ Crash Pass ]
+crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Crash Failure ]
+crbug.com/982194 http/tests/devtools/modify-cross-domain-rule.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/async-xhr-json-mime-type.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/cached-resource-destroyed-moved-to-storage.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/cached-resource-destroyed-too-big-discarded.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/download.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/failed-request-preview.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/network/failed-request-response-mimetype.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/font-face.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/from-disk-cache-timing.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/har-content.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/har-post.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/html-preview-encoding.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/json-preview.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/load-resource-for-frontend.js [ Crash Pass ]
+crbug.com/327078 http/tests/devtools/network/long-script-content.js [ Crash Pass ]
+crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/network/network-cachedresources-with-same-urls.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-choose-preview-view.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/network-close-request-view.js [ Crash Failure ]
-crbug.com/982194 http/tests/devtools/network/network-columns-sorted.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-columns-visible.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-content-replacement-xhr.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-cookies-pane.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-cyrillic-xhr.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-columns-sorted.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-columns-visible.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-content-replacement-xhr.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-cookies-pane.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/network/network-cyrillic-xhr.js [ Crash Pass ]
 crbug.com/679833 crbug.com/762529 http/tests/devtools/network/network-datareceived.js [ Crash Failure Timeout ]
-crbug.com/759632 http/tests/devtools/network/network-datasaver-warning.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-disable-cache-memory.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-disable-cache-preloads.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-disable-cache-xhrs.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-disabling-check-no-memory-leak.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-document-initiator.js [ Crash ]
+crbug.com/759632 http/tests/devtools/network/network-datasaver-warning.js [ Crash Failure ]
+crbug.com/982194 http/tests/devtools/network/network-disable-cache-memory.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-disable-cache-preloads.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-disable-cache-xhrs.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-disabling-check-no-memory-leak.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-document-initiator.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/network-domain-filter.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/network/network-empty-xhr.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-eventsource.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-fetch-post-payload.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-fetch.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/network/network-empty-xhr.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-eventsource.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-fetch-post-payload.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-fetch.js [ Crash Pass Timeout ]
 crbug.com/982194 http/tests/devtools/network/network-filmstrip-overview-showing.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/network-filter-http-requests.js [ Crash Pass ]
-crbug.com/946699 http/tests/devtools/network/network-filter-service-worker.js [ Crash Timeout ]
+crbug.com/946699 http/tests/devtools/network/network-filter-service-worker.js [ Crash Pass Timeout ]
 crbug.com/982194 http/tests/devtools/network/network-filter-updated-requests.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/network/network-filters-internals.js [ Crash ]
-crbug.com/945629 http/tests/devtools/network/network-filters.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/network/network-iframe-load-and-delete.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-image-404.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-imported-resource-content.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-initiator-chain.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-initiator-from-console.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-initiator.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/network/network-json-parser.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-log-service-worker-navigate.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-memory-cached-resource.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-prefetch.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-recording-after-reload-with-screenshots-enabled.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-filters-internals.js [ Crash Pass ]
+crbug.com/945629 http/tests/devtools/network/network-filters.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/network/network-iframe-load-and-delete.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-image-404.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-imported-resource-content.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-initiator-chain.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-initiator-from-console.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-initiator.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/network/network-json-parser.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-log-service-worker-navigate.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-memory-cached-resource.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-prefetch.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-recording-after-reload-with-screenshots-enabled.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/network-request-parse-query-params.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/network-request-query-string.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/network/network-request-revision-content.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-request-type.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-search.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-status-non-http.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-timing.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-request-revision-content.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-request-type.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-search.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/network/network-status-non-http.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-timing.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/network-toggle-type-filter.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/network-update-calculator-for-all-requests.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/network/network-worker-fetch-blocked.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-worker-fetch-parallel.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-worker-fetch.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-async-double.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-async-response-type-blob.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-async.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-binary-content.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-data-received-async-response-type-blob.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-post-payload.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-redirect-body.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-redirect-method.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-replay.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-same-url-as-main-resource.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xhr-sync.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/network-xsl-content.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/oopif-content.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/network/parse-form-data.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/ping-response.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/ping.js [ Crash ]
-crbug.com/962831 http/tests/devtools/network/preview-searchable.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-worker-fetch-blocked.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-worker-fetch-parallel.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-worker-fetch.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-async-double.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-async-response-type-blob.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-async.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-binary-content.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-data-received-async-response-type-blob.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-post-payload.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-redirect-body.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-redirect-method.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-replay.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-same-url-as-main-resource.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-sync.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/network-xsl-content.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/oopif-content.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/network/parse-form-data.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/ping-response.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/ping.js [ Crash Pass ]
+crbug.com/962831 http/tests/devtools/network/preview-searchable.js [ Crash Failure ]
 crbug.com/982194 http/tests/devtools/network/request-name-path.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/request-parameters-decoding.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/network/request-preview-uri-escaping.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/network/resource-priority.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/script-as-text-loading-long-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/script-as-text-loading-with-caret.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/subresource-integrity-number-of-requests-for-script.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/subresource-integrity-number-of-requests-for-stylesheet.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/warning-for-long-cookie.js [ Crash ]
-crbug.com/982194 http/tests/devtools/network/waterfall-header-height-updates.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/resource-priority.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/script-as-text-loading-long-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/script-as-text-loading-with-caret.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/subresource-integrity-number-of-requests-for-script.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/subresource-integrity-number-of-requests-for-stylesheet.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/warning-for-long-cookie.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/network/waterfall-header-height-updates.js [ Crash Failure ]
 crbug.com/982194 http/tests/devtools/oopif/oopif-console-preserves-log-on-frame-navigation.js [ Crash Pass ]
 crbug.com/817167 crbug.com/874695 http/tests/devtools/oopif/oopif-cookies-refresh.js [ Crash Failure Pass Timeout ]
-crbug.com/982194 http/tests/devtools/oopif/oopif-elements-inspect.js [ Crash ]
-crbug.com/818076 http/tests/devtools/oopif/oopif-elements-navigate-in.js [ Crash ]
-crbug.com/982194 http/tests/devtools/oopif/oopif-elements-navigate-out.js [ Crash ]
-crbug.com/982194 http/tests/devtools/oopif/oopif-elements-nesting-error-page.js [ Crash ]
-crbug.com/982194 http/tests/devtools/oopif/oopif-elements-nesting.js [ Crash ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-elements-inspect.js [ Crash Pass ]
+crbug.com/818076 http/tests/devtools/oopif/oopif-elements-navigate-in.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-elements-navigate-out.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-elements-nesting-error-page.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-elements-nesting.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/persistence/persistence-external-change-breakpoints.js [ Crash ]
 crbug.com/982194 http/tests/devtools/persistence/persistence-go-to-file-dialog.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/persistence/persistence-merge-editor-tabs.js [ Crash ]
-crbug.com/874695 http/tests/devtools/persistence/persistence-mimetype-on-rename.js [ Crash ]
-crbug.com/981267 http/tests/devtools/persistence/persistence-move-breakpoints-on-reload.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-merge-editor-tabs.js [ Crash Pass ]
+crbug.com/874695 http/tests/devtools/persistence/persistence-mimetype-on-rename.js [ Crash Pass ]
+crbug.com/981267 http/tests/devtools/persistence/persistence-move-breakpoints-on-reload.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/persistence/persistence-move-breakpoints.js [ Crash ]
-crbug.com/982194 http/tests/devtools/persistence/persistence-sourceframe-highlight.js [ Crash ]
-crbug.com/982194 http/tests/devtools/persistence/persistence-sourceframe-messages.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/persistence/persistence-switch-editor-tab.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-sourceframe-highlight.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-sourceframe-messages.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-switch-editor-tab.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-keeps-selected-tab.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-opens-filesystem-uisourcecode.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Crash Pass Timeout ]
 crbug.com/982194 http/tests/devtools/portals/portals-console.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/portals/portals-elements-activate.js [ Crash ]
-crbug.com/982194 http/tests/devtools/portals/portals-elements-nesting-after-adoption.js [ Crash ]
-crbug.com/982194 http/tests/devtools/portals/portals-elements-nesting.js [ Crash ]
+crbug.com/982194 http/tests/devtools/portals/portals-elements-activate.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/portals/portals-elements-nesting-after-adoption.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/portals/portals-elements-nesting.js [ Crash Pass ]
 crbug.com/450493 crbug.com/971262 http/tests/devtools/profiler/live-line-level-heap-profile.js [ Crash Pass Timeout ]
-crbug.com/831673 http/tests/devtools/reveal-objects.js [ Crash ]
+crbug.com/831673 http/tests/devtools/reveal-objects.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/runtime/evaluate-timeout.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/runtime/evaluate-without-side-effects.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/search/search-in-script.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/search/source-frame-replace-1.js [ Crash ]
-crbug.com/982194 http/tests/devtools/search/source-frame-replace-2.js [ Crash ]
-crbug.com/982194 http/tests/devtools/search/source-frame-replace-3.js [ Crash ]
-crbug.com/982194 http/tests/devtools/search/source-frame-replace-4.js [ Crash ]
-crbug.com/982194 http/tests/devtools/search/source-frame-search.js [ Crash ]
-crbug.com/982194 http/tests/devtools/search/sources-search-scope.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-worker-network-fetch.js [ Crash ]
-crbug.com/849670 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Pass Timeout ]
-crbug.com/450493 http/tests/devtools/sources/autocomplete-css.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/autocomplete-general.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/autocomplete-hide-on-smart-brace.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/source-frame-replace-1.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/search/source-frame-replace-2.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/search/source-frame-replace-3.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/search/source-frame-replace-4.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/search/source-frame-search.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/search/sources-search-scope.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-worker-network-fetch.js [ Crash Pass ]
+crbug.com/849670 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Crash Pass Timeout ]
+crbug.com/450493 http/tests/devtools/sources/autocomplete-css.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/autocomplete-general.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/autocomplete-hide-on-smart-brace.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/autocomplete-scss.js [ Crash Pass ]
-crbug.com/450493 http/tests/devtools/sources/bezier-swatch-position.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/color-swatch-position.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/compile-javascript.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/css-inline-sourcemap.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/css-outline-dialog.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/bezier-swatch-position.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/color-swatch-position.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/compile-javascript.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/css-inline-sourcemap.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/css-outline-dialog.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await2.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await3.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await3.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-async/async-await/async-pause-on-exception.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-in-console.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-indexed-db.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-middle-run.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-mutation-observer.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-post-message.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-mutation-observer.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-post-message.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-promises.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-reload-no-crash.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-web-sql.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-reload-no-crash.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-web-sql.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-xhrs.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-in-collected-function.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-manager-listeners-count.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-with-sourcemap-dart.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-with-sourcemap-dart.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-with-sourcemap.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-in-anonymous-script-with-two-targets.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-in-ui-source-frame.js [ Crash ]
@@ -3239,17 +3239,17 @@
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-navigation.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-restored-breakpoint.js [ Crash ]
 crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-shifted-breakpoint.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-breakpoints-not-activated-on-reload.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-breakpoints-not-activated-on-reload.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-disable-add-breakpoint.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-reload-breakpoints-with-source-maps.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-reload-breakpoints-with-source-maps.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/disable-breakpoints.js [ Crash ]
 crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/dynamic-scripts-breakpoints.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-xhr.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-xhr.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/inline-breakpoint-with-sourcemap.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/no-pause-on-disabled-breakpoint.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/possible-breakpoints.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/possible-breakpoints.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/provisional-breakpoints.js [ Crash ]
 crbug.com/450493 crbug.com/912793 http/tests/devtools/sources/debugger-breakpoints/restore-locations-for-breakpoint-with-broken-source-map.js [ Crash Failure Pass Timeout ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/set-breakpoint.js [ Crash ]
@@ -3258,129 +3258,129 @@
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/use-possible-breakpoints-to-resolve-breakpoint.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/xhr-breakpoints.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-console/debug-console-command.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-console/debugger-command-line-api.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-console/debugger-command-line-api.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-console/step-into-async-fetch.js [ Crash Pass ]
-crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-blackbox-by-source-code.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-blackbox-by-source-code.js [ Crash Pass ]
 crbug.com/874695 http/tests/devtools/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-step-in.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-sourcemap.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-sourcemap.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-step-into-skips-setTimeout.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-steppings.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-change-variable.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-while-paused-throws.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-while-paused.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-mute-exception.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-no-nested-pause.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-no-nested-pause.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-in-eval-script.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-in-internal.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-infinite-loop.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-on-exception.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-on-failed-assertion.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-on-promise-rejection.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-resume-button-in-overlay.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-pause/eval-on-pause-blocked.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-pause/pause-in-inline-script.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-resume-button-in-overlay.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/eval-on-pause-blocked.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/pause-in-inline-script.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/pause-in-internal-script.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-pause/set-return-value.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/set-return-value.js [ Crash Failure ]
 crbug.com/450493 http/tests/devtools/sources/debugger-pause/skip-pauses-until-reload.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-custom-element-callbacks.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-document-write.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-event-listener.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-event-listener.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-inlined-scripts.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-out-custom-element-callbacks.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-out-custom-element-callbacks.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-out-document-write.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-out-event-listener.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-out-event-listener.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-over-across-timeouts.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-over-document-write.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-over-inlined-scripts.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-through-promises.js [ Crash Pass ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/async-call-stack-async-function.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/async-call-stack-async-function.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/async-call-stack-url.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/async-call-stack-worker.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/async-call-stack-worker.js [ Crash Pass ]
 crbug.com/450493 crbug.com/916975 http/tests/devtools/sources/debugger-ui/call-stack-show-more.js [ Crash Failure Pass Timeout ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/callstack-placards-discarded.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/click-gutter-breakpoint.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/continue-to-location-markers-in-top-level-function.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/continue-to-location-markers.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/copy-stack-trace.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/custom-element-lifecycle-events.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-expand-scope.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/copy-stack-trace.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/custom-element-lifecycle-events.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-expand-scope.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-inline-values-frames.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-inline-values.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-save-to-temp-var.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/inline-scope-variables.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/monitor-console-command.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/popover-for-spread-operator.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/reveal-execution-line.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-save-to-temp-var.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/inline-scope-variables.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/monitor-console-command.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/popover-for-spread-operator.js [ Crash Failure ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/reveal-execution-line.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/reveal-not-skipped.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-breakpoints-2.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-breakpoints-3.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-search.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-search.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-snippet-model.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/selected-call-frame-after-formatting-source.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/show-function-definition.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/show-function-definition.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/show-generator-location.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/snippet-edit-breakpoint.js [ Crash Pass ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/source-frame.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger-ui/source-url-comment.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/source-frame.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/source-url-comment.js [ Crash Failure ]
 crbug.com/450493 http/tests/devtools/sources/debugger-ui/watch-expressions-panel-switch.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger/anonymous-script-with-source-map-breakpoint.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger/async-callstack-network-initiator.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debug-inlined-scripts-fragment-id.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debug-inlined-scripts-fragment-id.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger/debug-inlined-scripts.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-completions-on-call-frame.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-minified-variables-evalution.js [ Crash ]
-crbug.com/874695 http/tests/devtools/sources/debugger/debugger-proto-property.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-reload-on-pause.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-minified-variables.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-resolve-identifiers.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-resolve-this.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/debugger-suspend-active-dom-objects.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-completions-on-call-frame.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-minified-variables-evalution.js [ Crash Pass ]
+crbug.com/874695 http/tests/devtools/sources/debugger/debugger-proto-property.js [ Crash Failure ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-reload-on-pause.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-minified-variables.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-resolve-identifiers.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-resolve-this.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-suspend-active-dom-objects.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger/js-with-inline-stylesheets.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger/live-edit-breakpoints.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/live-edit-original-content.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/live-edit-original-content.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger/live-edit.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger/mutation-observer-suspend-while-paused.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger/rethrow-error-from-bindings-crash.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/debugger/source-frame-breakpoint-decorations.js [ Crash ]
 crbug.com/450493 http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/dont-diverge-script-evaluated-twice.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/dont-diverge-script-evaluated-twice.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/inline-script-with-source-map.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/inspect-function.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/javascript-outline-dialog.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/inspect-function.js [ Crash Pass ]
+crbug.com/450493 http/tests/devtools/sources/javascript-outline-dialog.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/pretty-print-css-1.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/pretty-print-javascript-5.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/sass-highlighter.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/snippet-module.js [ Crash Pass ]
-crbug.com/450493 http/tests/devtools/sources/snippet-overrides.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/snippet-overrides.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/source-code-diff.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/source-frame-toolbar-items.js [ Crash ]
-crbug.com/450493 http/tests/devtools/sources/sources-panel-focus-editor-on-select.js [ Crash ]
+crbug.com/450493 http/tests/devtools/sources/sources-panel-focus-editor-on-select.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/sources/sources-pretty-print.js [ Crash ]
-crbug.com/982194 http/tests/devtools/startup/shadow-dom-rules.js [ Crash ]
+crbug.com/982194 http/tests/devtools/startup/shadow-dom-rules.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/startup/sources/debugger/linkifier.js [ Crash Pass ]
 crbug.com/450493 http/tests/devtools/startup/sources/debugger/script-formatter-breakpoints-1.js [ Crash ]
 crbug.com/450493 http/tests/devtools/startup/sources/debugger/script-formatter-breakpoints-4.js [ Crash ]
 crbug.com/450493 http/tests/devtools/startup/sources/debugger/script-formatter-console.js [ Crash ]
-crbug.com/874695 http/tests/devtools/sxg/sxg-cert-not-found.js [ Crash ]
-crbug.com/874695 http/tests/devtools/sxg/sxg-disable-cache.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sxg/sxg-navigation-fail.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sxg/sxg-navigation-redirect.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sxg/sxg-navigation.js [ Crash ]
-crbug.com/851363 http/tests/devtools/sxg/sxg-prefetch-fail.js [ Crash ]
-crbug.com/851363 http/tests/devtools/sxg/sxg-prefetch.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sxg/sxg-transfer-size.js [ Crash ]
-crbug.com/982194 http/tests/devtools/template-content-inspect-crash.js [ Crash ]
+crbug.com/874695 http/tests/devtools/sxg/sxg-cert-not-found.js [ Crash Pass ]
+crbug.com/874695 http/tests/devtools/sxg/sxg-disable-cache.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sxg/sxg-navigation-fail.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sxg/sxg-navigation-redirect.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sxg/sxg-navigation.js [ Crash Pass ]
+crbug.com/851363 http/tests/devtools/sxg/sxg-prefetch-fail.js [ Crash Failure ]
+crbug.com/851363 http/tests/devtools/sxg/sxg-prefetch.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sxg/sxg-transfer-size.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/template-content-inspect-crash.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/throttling/mobile-throttling.js [ Crash Pass ]
 crbug.com/420008 http/tests/devtools/tracing/console-timeline.js [ Crash Pass ]
 crbug.com/420008 http/tests/devtools/tracing/hit-test.js [ Failure ]
-crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-end-to-end.js [ Crash ]
-crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-no-url-end-to-end.js [ Crash ]
+crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-end-to-end.js [ Crash Pass ]
+crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-no-url-end-to-end.js [ Crash Pass ]
 crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile.js [ Crash Pass ]
 crbug.com/420008 crbug.com/916975 http/tests/devtools/tracing/timeline-misc/timeline-event-causes.js [ Crash Failure Pass Timeout ]
 crbug.com/420008 http/tests/devtools/tracing/timeline-misc/timeline-event-dispatch.js [ Pass Timeout ]
@@ -3391,9 +3391,9 @@
 crbug.com/982194 http/tests/devtools/unit/text-prompt-hint.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/unit/text-prompt.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/user-agent-setting-major-version.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/user-metrics-perf.js [ Crash ]
-crbug.com/982194 http/tests/devtools/websocket/har-websocket.js [ Crash ]
-crbug.com/982194 http/tests/devtools/websocket/network-preserve-selection-on-frame-receive.js [ Crash ]
+crbug.com/982194 http/tests/devtools/user-metrics-perf.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/websocket/har-websocket.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/websocket/network-preserve-selection-on-frame-receive.js [ Crash Pass ]
 crbug.com/982194 http/tests/download/default-encoding.html [ Crash Timeout ]
 crbug.com/982194 http/tests/download/inherited-encoding.html [ Crash Timeout ]
 crbug.com/982194 http/tests/filesystem/input-display.html [ Timeout ]
@@ -3425,7 +3425,7 @@
 crbug.com/982194 http/tests/media/autoplay/document-user-activation-navigation-tap.html [ Crash Pass ]
 crbug.com/982194 http/tests/media/video-frame-size-change.html [ Failure ]
 crbug.com/982194 http/tests/misc/acid2.html [ Failure ]
-crbug.com/24182 http/tests/misc/acid3.html [ Crash ]
+crbug.com/24182 http/tests/misc/acid3.html [ Crash Failure ]
 crbug.com/874695 http/tests/misc/drag-not-loaded-image.html [ Crash Pass ]
 crbug.com/982194 http/tests/misc/drag-over-iframe-invalid-source-crash.html [ Crash ]
 crbug.com/982194 http/tests/misc/javascript-url-location-change.html [ Crash Timeout ]
@@ -3451,7 +3451,7 @@
 crbug.com/982194 http/tests/navigation/post-with-modifier.html [ Crash Timeout ]
 crbug.com/982194 http/tests/navigation/redirect-preserves-referrer.html [ Crash Timeout ]
 crbug.com/982194 http/tests/navigation/same-document-scroll-position-restore.html [ Crash Timeout ]
-crbug.com/874695 http/tests/permissions/chromium/test-request-worker.html [ Pass ]
+crbug.com/874695 http/tests/permissions/chromium/test-request-worker.html [ Pass Timeout ]
 crbug.com/982194 http/tests/security/anchor-download-allow-blob.html [ Crash Timeout ]
 crbug.com/982194 http/tests/security/anchor-download-allow-data.html [ Crash Timeout ]
 crbug.com/982194 http/tests/security/anchor-download-allow-sameorigin.html [ Crash Timeout ]
@@ -3488,7 +3488,7 @@
 crbug.com/982194 images/image-map-multiple-xhtml.xhtml [ Crash ]
 crbug.com/982194 images/image-map-multiple.html [ Crash ]
 crbug.com/24182 images/png-suite/test.html [ Failure ]
-crbug.com/982194 images/server-side-imagemap.html [ Crash ]
+crbug.com/982194 images/server-side-imagemap.html [ Crash Pass ]
 crbug.com/982194 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Failure ]
 crbug.com/982194 inspector-protocol/accessibility/accessibility-getFullAXTree.js [ Failure ]
 crbug.com/982194 inspector-protocol/css/css-get-background-colors.js [ Failure ]
@@ -3529,8 +3529,8 @@
 crbug.com/874695 crbug.com/936165 media/autoplay-muted.html [ Crash Pass Timeout ]
 crbug.com/982194 media/autoplay/document-user-activation.html [ Crash Pass ]
 crbug.com/982194 media/autoplay/webaudio-audio-context-init.html [ Crash Pass ]
-crbug.com/908347 media/autoplay/webaudio-audio-context-resume.html [ Crash Failure ]
-crbug.com/982194 media/autoplay/webaudio-node-start.html [ Crash Pass ]
+crbug.com/908347 media/autoplay/webaudio-audio-context-resume.html [ Crash Failure Pass ]
+crbug.com/982194 media/autoplay/webaudio-node-start.html [ Crash Pass Timeout ]
 crbug.com/942951 media/controls/controls-layout-in-different-size.html [ Crash ]
 crbug.com/982194 media/controls/overflow-menu-animation.html [ Crash ]
 crbug.com/982194 media/controls/progress-bar-repaint-on-size-change.html [ Crash ]
@@ -3546,7 +3546,7 @@
 crbug.com/982194 media/track/track-cue-rendering-position-auto.html [ Failure Pass ]
 crbug.com/982194 media/video-controls-attribute-fullscreen.html [ Crash Pass ]
 crbug.com/982194 media/video-controls-overflow-menu-closed-captions-list-hide-on-click-outside.html [ Crash Pass ]
-crbug.com/982194 media/video-persistence.html [ Crash Pass ]
+crbug.com/982194 media/video-persistence.html [ Crash Failure Pass ]
 crbug.com/982194 media/video-prefixed-fullscreen.html [ Crash Pass ]
 crbug.com/982194 media/video-src-blob.html [ Timeout ]
 crbug.com/982194 overflow/overflow-inline-002.html [ Failure ]
@@ -3562,9 +3562,9 @@
 crbug.com/982194 paint/invalidation/bugzilla-5699.html [ Failure ]
 crbug.com/982194 paint/invalidation/bugzilla-6278.html [ Failure ]
 crbug.com/982194 paint/invalidation/bugzilla-6473.html [ Crash ]
-crbug.com/982194 paint/invalidation/bugzilla-7235.html [ Crash ]
+crbug.com/982194 paint/invalidation/bugzilla-7235.html [ Crash Failure ]
 crbug.com/982194 paint/invalidation/clip/clip-with-layout-delta.html [ Failure ]
-crbug.com/982194 paint/invalidation/clip/repaint-tile-clipped.html [ Crash ]
+crbug.com/982194 paint/invalidation/clip/repaint-tile-clipped.html [ Crash Pass ]
 crbug.com/982194 paint/invalidation/clip/subtree-root-clip-2.html [ Failure ]
 crbug.com/982194 paint/invalidation/clip/subtree-root-clip.html [ Failure Pass ]
 crbug.com/982194 paint/invalidation/compositing/composited-inline-change-text-data-keep-geometry.html [ Failure ]
@@ -3617,7 +3617,7 @@
 crbug.com/982194 paint/invalidation/offset-change-wrong-invalidation-with-float.html [ Failure ]
 crbug.com/982194 paint/invalidation/outline/focus-continuations.html [ Failure ]
 crbug.com/982194 paint/invalidation/outline/focus-enable-continuations.html [ Failure ]
-crbug.com/982194 paint/invalidation/outline/focus-layers.html [ Crash ]
+crbug.com/982194 paint/invalidation/outline/focus-layers.html [ Crash Failure ]
 crbug.com/982194 paint/invalidation/outline/focus-ring-continuation-move-crash.html [ Crash ]
 crbug.com/982194 paint/invalidation/outline/focus-ring-on-child-move.html [ Crash Failure ]
 crbug.com/982194 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Crash ]
@@ -3673,7 +3673,7 @@
 crbug.com/982194 paint/invalidation/selection/invalidation-rect-includes-newline.html [ Crash ]
 crbug.com/982194 paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html [ Crash Failure ]
 crbug.com/982194 paint/invalidation/selection/japanese-rl-selection-clear.html [ Crash Failure ]
-crbug.com/982194 paint/invalidation/selection/japanese-rl-selection-repaint.html [ Failure ]
+crbug.com/982194 paint/invalidation/selection/japanese-rl-selection-repaint.html [ Crash Failure ]
 crbug.com/982194 paint/invalidation/selection/selected-replaced.html [ Crash Pass ]
 crbug.com/982194 paint/invalidation/selection/selection-change-in-iframe-with-relative-parent.html [ Crash ]
 crbug.com/982194 paint/invalidation/selection/selection-clear-after-move.html [ Crash ]
@@ -3709,7 +3709,7 @@
 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 ]
 crbug.com/982194 paint/invalidation/svg/svg-image-change-content-size.xhtml [ Failure ]
-crbug.com/982194 paint/invalidation/svg/svg-percent-scale-vonly.html [ Failure ]
+crbug.com/982194 paint/invalidation/svg/svg-percent-scale-vonly.html [ Failure Pass ]
 crbug.com/982194 paint/invalidation/svg/text-xy-updates-SVGList.xhtml [ Failure ]
 crbug.com/982194 paint/invalidation/svg/transform-focus-ring-repaint.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/use-instanceRoot-event-bubbling.xhtml [ Crash Timeout ]
@@ -3783,7 +3783,7 @@
 crbug.com/982194 paint/selection/text-selection-newline-vertical-rl.html [ Crash Pass ]
 crbug.com/982194 paint/selection/text-selection-newline.html [ Crash Pass ]
 crbug.com/982194 paint/selection/text-selection-update-style.html [ Crash ]
-crbug.com/982194 paint/stacking/layer-stacking-change-under-inline.html [ Crash ]
+crbug.com/982194 paint/stacking/layer-stacking-change-under-inline.html [ Crash Pass ]
 crbug.com/982194 paint/text/selection-no-clip-text.html [ Crash Pass ]
 crbug.com/982194 plugins/change-widget-and-click-crash.html [ Crash Failure ]
 crbug.com/982194 plugins/clicking-missing-plugin-fires-delegate.html [ Crash Pass ]
@@ -3922,7 +3922,7 @@
 crbug.com/982194 tables/mozilla/bugs/bug1261.html [ Failure Pass ]
 crbug.com/982194 tables/mozilla/bugs/bug12709.html [ Failure ]
 crbug.com/982194 tables/mozilla/bugs/bug12910.html [ Failure Pass ]
-crbug.com/982194 tables/mozilla/bugs/bug131020.html [ Failure ]
+crbug.com/982194 tables/mozilla/bugs/bug131020.html [ Failure Pass ]
 crbug.com/982194 tables/mozilla/bugs/bug13196.html [ Failure ]
 crbug.com/982194 tables/mozilla/bugs/bug138725.html [ Failure ]
 crbug.com/982194 tables/mozilla/bugs/bug24661.html [ Failure ]
@@ -3931,7 +3931,7 @@
 crbug.com/982194 tables/mozilla/bugs/bug26553.html [ Failure ]
 crbug.com/982194 tables/mozilla/bugs/bug269566.html [ Failure ]
 crbug.com/982194 tables/mozilla/bugs/bug2962.html [ Failure ]
-crbug.com/982194 tables/mozilla/bugs/bug30692.html [ Crash Failure ]
+crbug.com/982194 tables/mozilla/bugs/bug30692.html [ Crash Failure Pass ]
 crbug.com/982194 tables/mozilla/bugs/bug45055-2.html [ Failure Pass ]
 crbug.com/982194 tables/mozilla/bugs/bug4520.html [ Failure ]
 crbug.com/982194 tables/mozilla/bugs/bug72359.xml [ Failure Pass ]
@@ -3958,7 +3958,7 @@
 crbug.com/982194 touchadjustment/touch-links-active.html [ Failure ]
 crbug.com/982194 touchadjustment/touch-links-longpress.html [ Crash Failure ]
 crbug.com/982194 touchadjustment/touch-links-two-finger-tap.html [ Crash Failure ]
-crbug.com/982194 transforms/container-transform-crash.html [ Crash ]
+crbug.com/982194 transforms/container-transform-crash.html [ Crash Pass ]
 crbug.com/982194 transforms/selection-bounds-in-transformed-view.html [ Crash Pass ]
 crbug.com/982194 transforms/transform-on-inline.html [ Failure ]
 crbug.com/982194 vibration/cancel-vibration-during-pattern-vibrating.html [ Crash Pass ]
@@ -3982,7 +3982,7 @@
 crbug.com/982194 virtual/android/fullscreen/keyboard-focus.html [ Crash Pass ]
 crbug.com/982194 virtual/android/fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash Timeout ]
 crbug.com/982194 virtual/android/fullscreen/model/fully-exit-fullscreen-nested.html [ Crash Pass ]
-crbug.com/982194 virtual/android/fullscreen/rendering/backdrop-iframe.html [ Crash Pass ]
+crbug.com/982194 virtual/android/fullscreen/rendering/backdrop-iframe.html [ Crash Pass Timeout ]
 crbug.com/982194 virtual/android/fullscreen/rendering/overflow-root.html [ Crash Pass ]
 crbug.com/982194 virtual/android/fullscreen/rendering/overflow.html [ Crash Pass ]
 crbug.com/982194 virtual/android/rootscroller/keyboard-scroll-document-not-root-scroller.html [ Crash Pass ]
@@ -4005,7 +4005,7 @@
 crbug.com/982194 ietestcenter/css3/namespaces/syntax-018.xml [ Failure Pass ]
 crbug.com/982194 virtual/audio-service/media/autoplay/document-user-activation.html [ Crash Pass ]
 crbug.com/982194 virtual/audio-service/media/autoplay/webaudio-audio-context-init.html [ Crash Pass ]
-crbug.com/908347 virtual/audio-service/media/autoplay/webaudio-audio-context-resume.html [ Crash Pass ]
+crbug.com/908347 virtual/audio-service/media/autoplay/webaudio-audio-context-resume.html [ Crash Failure Pass ]
 crbug.com/982194 virtual/audio-service/media/autoplay/webaudio-node-start.html [ Crash Pass ]
 crbug.com/942951 virtual/audio-service/media/controls/controls-layout-in-different-size.html [ Crash ]
 crbug.com/982194 virtual/audio-service/media/controls/overflow-menu-animation.html [ Crash ]
@@ -4024,7 +4024,7 @@
 crbug.com/982194 virtual/audio-service/media/track/track-cue-rendering-position-auto.html [ Failure Pass ]
 crbug.com/982194 virtual/audio-service/media/video-controls-attribute-fullscreen.html [ Crash Pass ]
 crbug.com/982194 virtual/audio-service/media/video-controls-overflow-menu-closed-captions-list-hide-on-click-outside.html [ Crash Pass ]
-crbug.com/988248 virtual/audio-service/media/video-persistence.html [ Crash Pass ]
+crbug.com/988248 virtual/audio-service/media/video-persistence.html [ Crash Failure Pass ]
 crbug.com/982194 virtual/audio-service/media/video-prefixed-fullscreen.html [ Crash Pass ]
 crbug.com/982194 virtual/audio-service/media/video-src-blob.html [ Timeout ]
 crbug.com/982194 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/udate-bytecheck.https.html [ Timeout ]
@@ -4039,11 +4039,11 @@
 crbug.com/980290 virtual/composite-after-paint/scrollingcoordinator/non-fast-scrollable-visibility-change.html [ Crash ]
 crbug.com/982194 virtual/compositor_threaded_scrollbar_scrolling/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash Pass ]
 
-crbug.com/982194 animations/state-at-end-event.html [ Crash ]
-crbug.com/982194 animations/timing/keyframe-timing-functions.html [ Crash ]
-crbug.com/982194 animations/timing/keyframe-timing-functions2.html [ Crash ]
-crbug.com/982194 compositing/absolute-position-changed-with-composited-parent-layer.html [ Crash ]
-crbug.com/982194 compositing/geometry/partial-layout-update.html [ Crash ]
+crbug.com/982194 animations/state-at-end-event.html [ Crash Pass ]
+crbug.com/982194 animations/timing/keyframe-timing-functions.html [ Crash Pass ]
+crbug.com/982194 animations/timing/keyframe-timing-functions2.html [ Crash Pass ]
+crbug.com/982194 compositing/absolute-position-changed-with-composited-parent-layer.html [ Crash Pass ]
+crbug.com/982194 compositing/geometry/partial-layout-update.html [ Crash Pass ]
 crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-composited-scrolled-late-composite.html [ Failure ]
 crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-scrolled.html [ Failure ]
 crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe.html [ Failure ]
@@ -4070,7 +4070,7 @@
 crbug.com/982194 compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled.html [ Failure ]
 crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-scaled-document.html [ Failure ]
 crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-scaledY.html [ Failure ]
-crbug.com/982194 compositing/scissor-out-of-viewport.html [ Crash ]
+crbug.com/982194 compositing/scissor-out-of-viewport.html [ Crash Pass ]
 crbug.com/982194 compositing/shadows/shadow-drawing.html [ Failure ]
 crbug.com/982194 css1/box_properties/clear.html [ Failure ]
 crbug.com/982194 css1/box_properties/float_margin.html [ Failure ]
@@ -4097,13 +4097,13 @@
 crbug.com/982194 css2.1/t090501-c5525-flt-r-00-b-g.html [ Failure ]
 crbug.com/982194 css3/blending/background-blend-mode-overlapping-accelerated-elements.html [ Failure ]
 crbug.com/982194 css3/filters/null-effect-check.html [ Failure ]
-crbug.com/982194 css3/flexbox/flex-align-baseline.html [ Crash ]
-crbug.com/982194 css3/flexbox/flex-align-stretch.html [ Crash ]
-crbug.com/982194 css3/flexbox/flexitem.html [ Crash ]
-crbug.com/982194 css3/flexbox/line-wrapping.html [ Crash ]
-crbug.com/982194 css3/flexbox/mozilla/flexbox-inlinecontent-horiz-5.xhtml [ Crash ]
-crbug.com/982194 css3/flexbox/relayout-image-load.html [ Crash ]
-crbug.com/982194 css3/flexbox/relpos-with-percentage-top.html [ Crash ]
+crbug.com/982194 css3/flexbox/flex-align-baseline.html [ Crash Pass ]
+crbug.com/982194 css3/flexbox/flex-align-stretch.html [ Crash Pass ]
+crbug.com/982194 css3/flexbox/flexitem.html [ Crash Pass ]
+crbug.com/982194 css3/flexbox/line-wrapping.html [ Crash Pass ]
+crbug.com/982194 css3/flexbox/mozilla/flexbox-inlinecontent-horiz-5.xhtml [ Crash Failure Pass ]
+crbug.com/982194 css3/flexbox/relayout-image-load.html [ Crash Pass ]
+crbug.com/982194 css3/flexbox/relpos-with-percentage-top.html [ Crash Pass ]
 crbug.com/982194 css3/selectors3/xml/css3-modsel-170a.xml [ Failure Pass ]
 crbug.com/982194 css3/selectors3/xml/css3-modsel-181.xml [ Failure Pass ]
 crbug.com/982194 css3/selectors3/xml/css3-modsel-63.xml [ Failure Pass ]
@@ -4141,142 +4141,143 @@
 crbug.com/982194 external/wpt/css/CSS2/floats/floats-placement-003.html [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/floats/floats-placement-vertical-003.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/floats/remove-block-between-inline-and-float.html [ Failure ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-009.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-010.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-016.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-017.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-023.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-024.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-030.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-031.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-011.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-025.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-032.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-039.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-053.xht [ Crash ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-067.xht [ Crash ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-009.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-010.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-016.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-017.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-023.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-024.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-030.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-height-031.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-011.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-025.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-032.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-039.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-053.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/absolute-replaced-width-067.xht [ Crash Pass ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/positioning-float-001.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/positioning-float-002.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/text/white-space-mixed-002.xht [ Failure ]
-crbug.com/982194 external/wpt/css/css-backgrounds/background-repeat/background-repeat-repeat-x.xht [ Crash ]
-crbug.com/982194 external/wpt/css/css-backgrounds/background-repeat/background-repeat-repeat-y.xht [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-backgrounds/background-repeat/background-repeat-repeat-x.xht [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-backgrounds/background-repeat/background-repeat-repeat-y.xht [ Crash Failure Pass ]
 crbug.com/982194 external/wpt/css/css-backgrounds/css3-background-origin-border-box.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-backgrounds/css3-background-origin-content-box.html [ Crash Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-layout-flexbox-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-contain/contain-size-flexbox-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-contain/contain-size-scrollbars-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-001-inline.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-001-none.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-flex-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-display/display-none-inline-img.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-flexbox/css-box-justify-content.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-flexbox/dynamic-change-simplified-layout.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-flexbox/flex-basis-009.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_rowspan-overflow-automatic.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_rowspan-overflow.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-contain/contain-layout-flexbox-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-size-flexbox-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-size-scrollbars-002.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-001-inline.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-001-none.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-flex-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-none-inline-img.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/css-box-justify-content.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/dynamic-change-simplified-layout.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-basis-009.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_rowspan-overflow-automatic.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_rowspan-overflow.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_visibility-collapse-line-wrapping.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/percentage-widths-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/abspos/absolute-positioning-definite-sizes-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-column-axis-self-baseline-synthesized-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-fit-content-tracks-dont-stretch-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-005.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-006.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-007.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-008.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-009.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-010.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-011.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-012.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-013.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-014.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-015.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-016.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-005.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-006.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-007.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-008.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-009.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-010.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-011.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-012.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-013.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-014.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-015.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-016.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-005.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-006.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-007.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-008.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-009.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-010.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-011.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-012.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-013.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-014.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-015.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-016.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-baseline-not-applied-if-sizing-cyclic-dependency-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-baseline-not-applied-if-sizing-cyclic-dependency-003.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-rows-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-023.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-025.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/grid-layout-properties.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-flexbox/percentage-widths-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/abspos/absolute-positioning-definite-sizes-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-column-axis-self-baseline-synthesized-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-fit-content-tracks-dont-stretch-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-005.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-006.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-007.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-008.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-009.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-010.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-011.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-012.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-013.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-014.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-015.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-016.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-005.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-006.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-007.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-008.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-009.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-010.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-011.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-012.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-013.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-014.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-015.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-lr-016.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-005.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-006.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-007.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-008.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-009.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-010.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-011.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-012.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-013.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-014.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-015.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-stretch-vertical-rl-016.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-baseline-not-applied-if-sizing-cyclic-dependency-002.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-baseline-not-applied-if-sizing-cyclic-dependency-003.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-rows-001.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-002.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-023.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-minimum-size-grid-items-025.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-layout-properties.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-floats-no-intrude-001.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-content-distribution-must-account-for-track-sizing-004.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-percent-rows-filled-shrinkwrap-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-percent-rows-spanned-shrinkwrap-001.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-content-distribution-must-account-for-track-sizing-004.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-percent-rows-filled-shrinkwrap-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-grid/layout-algorithm/grid-percent-rows-spanned-shrinkwrap-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-intrinsic-size/intrinsic-size-015.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-layout-api/box-tree-unregistered.https.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-lists/list-marker-symbol-bidi.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-005a.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-017.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-017.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-022.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-abspos-table-dynamic.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-overflow-002.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position-table-cell.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-replaced-minmax.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-position/position-sticky-rendering.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-scroll-anchoring/clamp-negative-overflow.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-scroll-snap/scroll-margin.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-abspos-table-dynamic.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-overflow-002.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position-table-cell.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-replaced-minmax.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-sticky-rendering.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-scroll-anchoring/clamp-negative-overflow.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-scroll-snap/scroll-margin.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-000.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-013.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-015.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-016.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-shapes/shape-outside/values/shape-outside-inset-0010.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-sizing/range-percent-intrinsic-size-1.html [ Crash ]
-crbug.com/982194 external/wpt/css/css-tables/dynamic-table-cell-height.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-sizing/range-percent-intrinsic-size-1.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/css-tables/dynamic-table-cell-height.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/css-tables/visibility-collapse-rowspan-005.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-012.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-writing-modes/float-rgt-orthog-htb-in-vrl-003.xht [ Failure ]
 crbug.com/982194 external/wpt/css/css-writing-modes/float-rgt-orthog-vlr-in-htb-003.xht [ Failure ]
 crbug.com/982194 external/wpt/css/css-writing-modes/float-rgt-orthog-vrl-in-htb-003.xht [ Failure ]
-crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-border-box.html [ Crash ]
+crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-border-box.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-fallback-justify-content-001.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-self-001.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-margin-001.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-containing-block-001.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-block-004.html [ Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-004.xhtml [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-005.xhtml [ Crash ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-004.xhtml [ Crash Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-005.xhtml [ Crash Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-001.xhtml [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-rtl-004.xhtml [ Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-003.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-004.html [ Crash ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-003.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-004.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Crash ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Crash Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-wrap-horiz-002.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-wrap-vert-001.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-wrap-vert-002.html [ Failure ]
@@ -4290,21 +4291,22 @@
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-010.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-011.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-012.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-013.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-014.html [ Crash ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-015.html [ Crash ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-010.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-011.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-012.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-013.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-014.html [ Crash Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-015.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/class-id-attr-selector-invalidation-01.html [ Failure Pass ]
-crbug.com/982194 external/wpt/feature-policy/experimental-features/document-write.tentative.html [ Crash ]
+crbug.com/982194 external/wpt/feature-policy/experimental-features/document-write.tentative.html [ Crash Pass ]
+crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-19.html [ Pass ]
 crbug.com/982194 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ]
 crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-3q.html [ Pass ]
 crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-3s.html [ Pass ]
 crbug.com/982194 external/wpt/html/semantics/forms/form-submission-0/implicit-submission.optional.html [ Crash Failure ]
 crbug.com/982194 external/wpt/html/semantics/forms/historical-search-event.html [ Failure ]
 crbug.com/982194 external/wpt/infrastructure/testdriver/actions/multiTouchPoints.html [ Crash Pass ]
-crbug.com/982194 external/wpt/intersection-observer/containing-block.html [ Crash ]
+crbug.com/982194 external/wpt/intersection-observer/containing-block.html [ Crash Pass ]
 crbug.com/982194 external/wpt/largest-contentful-paint/element-only-when-fully-active.html [ Timeout ]
 crbug.com/982194 external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html [ Timeout ]
 crbug.com/982194 external/wpt/largest-contentful-paint/toJSON.html [ Timeout ]
@@ -4319,8 +4321,8 @@
 crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.worker.html [ Crash Pass ]
 crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemWriter.tentative.https.any.html [ Crash Pass ]
 crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemWriter.tentative.https.any.worker.html [ Crash ]
-crbug.com/982194 external/wpt/svg/coordinate-systems/abspos.html [ Crash ]
-crbug.com/982194 external/wpt/svg/layout/svg-with-precent-dimensions-relayout.html [ Crash ]
+crbug.com/982194 external/wpt/svg/coordinate-systems/abspos.html [ Crash Pass ]
+crbug.com/982194 external/wpt/svg/layout/svg-with-precent-dimensions-relayout.html [ Crash Pass ]
 crbug.com/982194 fast/block/basic/020.html [ Failure ]
 crbug.com/982194 fast/block/basic/adding-near-anonymous-block.html [ Failure ]
 crbug.com/982194 fast/block/float/001.html [ Failure ]
@@ -4338,7 +4340,7 @@
 crbug.com/982194 fast/block/float/editable-text-overlapping-float.html [ Failure ]
 crbug.com/982194 fast/block/float/fit_line_below_floats.html [ Failure ]
 crbug.com/982194 fast/block/float/float-avoidance.html [ Failure ]
-crbug.com/982194 fast/block/float/float-not-removed-crash2.html [ Crash ]
+crbug.com/982194 fast/block/float/float-not-removed-crash2.html [ Crash Pass ]
 crbug.com/982194 fast/block/float/float-on-line-obeys-container-padding.html [ Failure ]
 crbug.com/982194 fast/block/float/float-should-dirty-line-even-when-it-doesnt-intersect-it.html [ Failure ]
 crbug.com/982194 fast/block/float/floats-and-text-indent-rl.html [ Failure ]
@@ -4356,56 +4358,57 @@
 crbug.com/982194 fast/block/float/trailing-float.html [ Failure ]
 crbug.com/982194 fast/block/float/vertical-move-relayout.html [ Failure ]
 crbug.com/982194 fast/block/margin-collapse/empty-clear-blocks.html [ Failure ]
-crbug.com/982194 fast/block/positioning/complex-positioned-movement.html [ Crash ]
-crbug.com/982194 fast/block/positioning/flex-positioned-movement-layout-of-content-when-height-changes.html [ Crash ]
-crbug.com/982194 fast/block/positioning/positioned-container-changes-block-direction-border-with-positioned-descendant.html [ Crash ]
-crbug.com/982194 fast/block/positioning/positioned-movement-layout-when-height-changes-and-descendant-dependent-on-height.html [ Crash ]
-crbug.com/982194 fast/block/positioning/positioned-movement-layout-when-height-changes-and-positioned-descendant-dependent-on-height.html [ Crash ]
-crbug.com/982194 fast/block/positioning/positioned-movement-layout-when-height-changes.html [ Crash ]
-crbug.com/982194 fast/block/positioning/positioned-movement-layout-when-width-changes.html [ Crash ]
-crbug.com/982194 fast/block/positioning/pref-width-change.html [ Crash ]
+crbug.com/982194 fast/block/positioning/complex-positioned-movement.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/flex-positioned-movement-layout-of-content-when-height-changes.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/positioned-container-changes-block-direction-border-with-positioned-descendant.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/positioned-movement-layout-when-height-changes-and-descendant-dependent-on-height.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/positioned-movement-layout-when-height-changes-and-positioned-descendant-dependent-on-height.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/positioned-movement-layout-when-height-changes.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/positioned-movement-layout-when-width-changes.html [ Crash Pass ]
+crbug.com/982194 fast/block/positioning/pref-width-change.html [ Crash Pass ]
+crbug.com/982194 fast/borders/border-image-fill-inline-no-border.html [ Failure Pass ]
 crbug.com/982194 fast/borders/outline-rounded-border.html [ Failure ]
 crbug.com/982194 fast/box-sizing/box-sizing.html [ Failure ]
-crbug.com/982194 fast/canvas/canvas-overflow-hidden-animation.html [ Crash ]
+crbug.com/982194 fast/canvas/canvas-overflow-hidden-animation.html [ Crash Pass ]
 crbug.com/982194 fast/css-generated-content/003.html [ Failure ]
 crbug.com/982194 fast/css-generated-content/008.html [ Failure ]
 crbug.com/982194 fast/css-generated-content/012.html [ Failure ]
 crbug.com/982194 fast/css-generated-content/after-order.html [ Failure Pass ]
-crbug.com/982194 fast/css-grid-layout/flex-and-intrinsic-sizes.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/flex-and-minmax-content-resolution-rows.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-align-justify-stretch-with-orthogonal-flows.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-auto-columns-rows-update.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-automatic-minimum-for-auto-columns.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-automatic-minimum-for-auto-rows.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-baseline-margins-1.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-container-percentage-rows.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-content-sized-columns-resolution.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-dynamic-updates-relayout.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-grow-tracks-to-their-max.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-gutters-as-percentage.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-indefinite-calculated-height-crash.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-item-addition-track-breadth-update.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-item-multiple-minmax-content-resolution.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-item-removal-auto-placement-update.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-item-removal-track-breadth-update.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-item-stretching-must-not-depend-on-previous-layouts.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-item-with-percent-height-in-auto-height-grid-resolution.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/grid-self-baseline-and-relative-sized-items-crash.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/min-content-row-must-shrink-when-column-grows.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/min-height-border-box.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/minmax-max-content-resolution-rows.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/minmax-min-content-column-resolution-rows.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/minmax-spanning-resolution-rows.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/negative-growth-share-as-infinity-crash.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/percent-intrinsic-track-breadth.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/percent-of-indefinite-track-size-in-auto.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/percent-of-indefinite-track-size.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/percent-track-breadths-regarding-container-size.html [ Crash ]
-crbug.com/982194 fast/css-grid-layout/positioned-grid-container-percentage-tracks.html [ Crash ]
-crbug.com/982194 fast/css-intrinsic-dimensions/intrinsic-sized-flex-items.html [ Crash ]
+crbug.com/982194 fast/css-grid-layout/flex-and-intrinsic-sizes.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/flex-and-minmax-content-resolution-rows.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-align-justify-stretch-with-orthogonal-flows.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-auto-columns-rows-update.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-automatic-minimum-for-auto-columns.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-automatic-minimum-for-auto-rows.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-baseline-margins-1.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-container-percentage-rows.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-content-sized-columns-resolution.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-dynamic-updates-relayout.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-grow-tracks-to-their-max.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-gutters-as-percentage.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-indefinite-calculated-height-crash.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-item-addition-track-breadth-update.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-item-multiple-minmax-content-resolution.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-item-removal-auto-placement-update.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-item-removal-track-breadth-update.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-item-stretching-must-not-depend-on-previous-layouts.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-item-with-percent-height-in-auto-height-grid-resolution.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/grid-self-baseline-and-relative-sized-items-crash.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/min-content-row-must-shrink-when-column-grows.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/min-height-border-box.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/minmax-max-content-resolution-rows.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/minmax-min-content-column-resolution-rows.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/minmax-spanning-resolution-rows.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/negative-growth-share-as-infinity-crash.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/percent-intrinsic-track-breadth.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/percent-of-indefinite-track-size-in-auto.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/percent-of-indefinite-track-size.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/percent-track-breadths-regarding-container-size.html [ Crash Pass ]
+crbug.com/982194 fast/css-grid-layout/positioned-grid-container-percentage-tracks.html [ Crash Pass ]
+crbug.com/982194 fast/css-intrinsic-dimensions/intrinsic-sized-flex-items.html [ Crash Pass ]
 crbug.com/982194 fast/css-intrinsic-dimensions/width.html [ Failure ]
 crbug.com/982194 fast/css/color-correction-on-backgrounds.html [ Failure ]
-crbug.com/982194 fast/css/display-inline-block-scrollbar.html [ Crash ]
+crbug.com/982194 fast/css/display-inline-block-scrollbar.html [ Crash Pass ]
 crbug.com/982194 fast/css/first-letter-float-after-float.html [ Failure ]
 crbug.com/982194 fast/css/first-letter-float.html [ Failure ]
 crbug.com/982194 fast/css/object-position-with-fit-contain.html [ Failure ]
@@ -4413,7 +4416,7 @@
 crbug.com/982194 fast/css/object-position-with-fit-none.html [ Failure ]
 crbug.com/982194 fast/css/object-position.html [ Failure ]
 crbug.com/982194 fast/css/word-space-extra.html [ Failure ]
-crbug.com/982194 fast/deprecated-flexbox/order-iterator-crash.html [ Crash ]
+crbug.com/982194 fast/deprecated-flexbox/order-iterator-crash.html [ Crash Pass ]
 crbug.com/982194 fast/dynamic/002.html [ Failure ]
 crbug.com/982194 fast/dynamic/dirty-float-in-clean-line.html [ Failure ]
 crbug.com/982194 fast/dynamic/float-from-empty-line.html [ Failure ]
@@ -4433,7 +4436,7 @@
 crbug.com/982194 fast/lists/list-marker-before-float-nested.html [ Failure ]
 crbug.com/982194 fast/lists/list-marker-before-float-rtl.html [ Failure ]
 crbug.com/982194 fast/lists/list-marker-before-float.html [ Failure ]
-crbug.com/982194 fast/multicol/abspos-new-width-rebalance.html [ Crash ]
+crbug.com/982194 fast/multicol/abspos-new-width-rebalance.html [ Crash Pass ]
 crbug.com/982194 fast/multicol/span/abspos-containing-block-outside-spanner.html [ Failure ]
 crbug.com/982194 fast/multicol/span/spanner-first.html [ Failure ]
 crbug.com/982194 fast/multicol/vertical-lr/column-break-with-balancing.html [ Pass ]
@@ -4444,16 +4447,16 @@
 crbug.com/982194 fast/overflow/trailing-float-linebox.html [ Failure ]
 crbug.com/982194 fast/replaced/002.html [ Failure ]
 crbug.com/982194 fast/replaced/003.html [ Failure ]
-crbug.com/982194 fast/replaced/percentage-height-when-height-specified-by-top-bottom.html [ Crash ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-dynamic-shape.html [ Crash ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon.html [ Crash ]
+crbug.com/982194 fast/replaced/percentage-height-when-height-specified-by-top-bottom.html [ Crash Pass ]
+crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-dynamic-shape.html [ Crash Pass ]
+crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon.html [ Crash Pass ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-different-writing-modes-border-box.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-different-writing-modes-content-box.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-different-writing-modes-padding-box.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-000.html [ Failure ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-bottom.html [ Crash ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left.html [ Crash ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right.html [ Crash ]
+crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-bottom.html [ Crash Pass ]
+crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left.html [ Crash Pass ]
+crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right.html [ Crash Pass ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-bottom-left.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-bottom-right.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-large-radius.html [ Failure ]
@@ -4462,224 +4465,227 @@
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-stacked-000.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-stacked-001.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-stacked-002.html [ Failure ]
-crbug.com/982194 fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer.html [ Crash ]
-crbug.com/982194 fast/table/caption-position.html [ Crash ]
-crbug.com/982194 fast/table/percent-height-content-in-percent-height-cell-and-percent-height-table.html [ Crash ]
+crbug.com/982194 fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer.html [ Crash Pass ]
+crbug.com/982194 fast/table/caption-position.html [ Crash Pass ]
+crbug.com/982194 fast/table/percent-height-content-in-percent-height-cell-and-percent-height-table.html [ Crash Pass ]
 crbug.com/982194 fast/table/percent-height-overflow-auto-content-in-cell.html [ Crash Pass ]
-crbug.com/982194 fast/table/percent-height-overflow-hidden-content-in-cell.html [ Crash ]
-crbug.com/982194 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Crash ]
-crbug.com/982194 fast/table/percent-height-overflow-visible-content-in-cell.html [ Crash ]
-crbug.com/982194 fast/table/relayout-out-of-flow-with-border-spacing.html [ Crash ]
+crbug.com/982194 fast/table/percent-height-overflow-hidden-content-in-cell.html [ Crash Pass ]
+crbug.com/982194 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Crash Pass ]
+crbug.com/982194 fast/table/percent-height-overflow-visible-content-in-cell.html [ Crash Pass ]
+crbug.com/982194 fast/table/relayout-out-of-flow-with-border-spacing.html [ Crash Pass ]
 crbug.com/982194 fast/writing-mode/english-rl-text.html [ Failure ]
 crbug.com/982194 fragmentation/fragmented-table-cell.html [ Failure ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/application-panel/app-manifest-view-a11y-test.js [ Crash ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/application-panel/clear-storage-a11y-test.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/application-panel/service-worker-view-a11y-test.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/memory/heap-profiler-a11y-test.js [ Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/application-panel/app-manifest-view-a11y-test.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/application-panel/clear-storage-a11y-test.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/application-panel/service-worker-view-a11y-test.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/memory/heap-profiler-a11y-test.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/a11y-axe-core/network/network-condition-a11y-test.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/dom-breakpoints-pane-a11y-test.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/global-listeners-sidebar-a11y-test.js [ Crash ]
-crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/xhr-breakpoints-sidebar-a11y-test.js [ Crash ]
-crbug.com/982194 http/tests/devtools/appcache/appcache-iframe-manifests.js [ Crash ]
-crbug.com/982194 http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js [ Crash ]
-crbug.com/982194 http/tests/devtools/appcache/appcache-swap.js [ Crash ]
-crbug.com/982194 http/tests/devtools/application-panel/resources-panel-idb-clear-for-origin.js [ Crash ]
-crbug.com/982194 http/tests/devtools/application-panel/resources-panel-iframe-idb.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/application-panel/resources-panel-on-navigation.js [ Crash ]
-crbug.com/982194 http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Crash ]
-crbug.com/982194 http/tests/devtools/application-panel/resources-panel-selection-on-reload.js [ Crash ]
-crbug.com/982194 http/tests/devtools/application-panel/storage-view-reports-quota.js [ Crash ]
-crbug.com/982194 http/tests/devtools/audits/audits-emulate-run.js [ Crash ]
-crbug.com/982194 http/tests/devtools/audits/audits-flags-run.js [ Crash ]
-crbug.com/982194 http/tests/devtools/audits/audits-limited-run.js [ Crash ]
-crbug.com/982194 http/tests/devtools/audits/audits-prevent-run.js [ Crash ]
-crbug.com/982194 http/tests/devtools/audits/audits-successful-run.js [ Crash ]
-crbug.com/982194 http/tests/devtools/audits/audits-view-trace-run.js [ Crash ]
-crbug.com/982194 http/tests/devtools/background-services/background-services-panel.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/contentscripts-navigator-multiple-frames.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/dynamic-navigator-frame-attach-detach.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/jssourcemap-navigator-overlapping-sources.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/navigator-frame-navigate.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/navigator-main-frame-navigated.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/navigator-multiple-frames.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/shadowdom-navigator.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/sourcemap-navigator-multiple-frames.js [ Crash ]
-crbug.com/982194 http/tests/devtools/bindings/suspendtarget-navigator.js [ Crash ]
-crbug.com/982194 http/tests/devtools/cache-storage/cache-data.js [ Crash ]
-crbug.com/982194 http/tests/devtools/cache-storage/cache-deletion.js [ Crash ]
-crbug.com/982194 http/tests/devtools/cache-storage/cache-entry-deletion.js [ Crash ]
-crbug.com/982194 http/tests/devtools/cache-storage/cache-live-update-cache-content.js [ Crash ]
-crbug.com/982194 http/tests/devtools/cache-storage/cache-live-update-list.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/cache-storage/cache-names.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/dom-breakpoints-pane-a11y-test.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/global-listeners-sidebar-a11y-test.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/sources/xhr-breakpoints-sidebar-a11y-test.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/appcache/appcache-iframe-manifests.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/appcache/appcache-swap.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/application-panel/resources-panel-idb-clear-for-origin.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/application-panel/resources-panel-iframe-idb.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/application-panel/resources-panel-on-navigation.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/application-panel/resources-panel-selection-on-reload.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/application-panel/storage-view-reports-quota.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/audits/audits-emulate-run.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/audits/audits-flags-run.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/audits/audits-limited-run.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/audits/audits-prevent-run.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/audits/audits-successful-run.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/audits/audits-view-trace-run.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/background-services/background-services-panel.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/contentscripts-navigator-multiple-frames.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/dynamic-navigator-frame-attach-detach.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/jssourcemap-navigator-overlapping-sources.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/navigator-frame-navigate.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/navigator-main-frame-navigated.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/navigator-multiple-frames.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/shadowdom-navigator.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/sourcemap-navigator-multiple-frames.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/bindings/suspendtarget-navigator.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/cache-storage/cache-data.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/cache-storage/cache-deletion.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/cache-storage/cache-entry-deletion.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/cache-storage/cache-live-update-cache-content.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/cache-storage/cache-live-update-list.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/cache-storage/cache-names.js [ Crash Pass Timeout ]
 crbug.com/982194 http/tests/devtools/console/console-format-collections.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/console/console-group-click.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-export.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-repeated-per-function.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-repeated.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-suspended-per-function.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-suspended.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-view-filter-per-function.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-view-filter.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-view-per-function.js [ Crash ]
-crbug.com/982194 http/tests/devtools/coverage/coverage-view.js [ Crash ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-code-folding.js [ Crash ]
-crbug.com/982194 http/tests/devtools/indexeddb/database-refresh-view.js [ Crash ]
-crbug.com/982194 http/tests/devtools/indexeddb/delete-entry.js [ Crash ]
-crbug.com/982194 http/tests/devtools/indexeddb/live-update-indexeddb-content.js [ Crash ]
-crbug.com/982194 http/tests/devtools/layers/layers-3d-view-after-update.js [ Crash ]
-crbug.com/982194 http/tests/devtools/layers/layers-3d-view-hit-testing.js [ Crash ]
-crbug.com/982194 http/tests/devtools/layers/layers-panel-mouse-events.js [ Crash ]
-crbug.com/982194 http/tests/devtools/oopif/oopif-navigator.js [ Crash ]
-crbug.com/982194 http/tests/devtools/oopif/oopif-storage.js [ Crash ]
+crbug.com/982194 http/tests/devtools/console/console-group-click.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-export.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-repeated-per-function.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-repeated.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-suspended-per-function.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-suspended.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-view-filter-per-function.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-view-filter.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-view-per-function.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/coverage/coverage-view.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-code-folding.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/extensions/extensions-panel.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/indexeddb/database-refresh-view.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/indexeddb/delete-entry.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/indexeddb/live-update-indexeddb-content.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/layers/layers-3d-view-after-update.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/layers/layers-3d-view-hit-testing.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/layers/layers-panel-mouse-events.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-navigator.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-storage.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/persistence/persistence-sync-content-nodejs.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/profiler/cpu-profiler-profile-removal.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/cpu-profiler-profiling.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/cpu-profiler-save-load.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-profiler-profiling.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-dom-groups-change.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-expansion-preserved-when-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-show-all.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-show-next.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-shown-node-count-preserved-when-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-expansion-preserved-when-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-show-all.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-show-next.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-shown-node-count-preserved-when-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-event-listeners.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-inspect-dom-wrapper.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-loader.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-location.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-orphan-nodes.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-statistics.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-expand-collapse.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-expansion-preserved-when-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-retainers.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-search-by-id.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-search.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-show-all.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-show-next.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-show-ranges.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-shown-node-count-preserved-when-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-sorting-fields.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-sorting-instances.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-weak-dominator.js [ Crash ]
-crbug.com/982194 http/tests/devtools/profiler/heap-snapshot.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/iframe-main-resource.js [ Crash ]
+crbug.com/982194 http/tests/devtools/profiler/cpu-profiler-profile-removal.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/cpu-profiler-profiling.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/cpu-profiler-save-load.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-profiler-profiling.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-dom-groups-change.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-expansion-preserved-when-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-show-all.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-show-next.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-shown-node-count-preserved-when-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-comparison-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-expansion-preserved-when-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-show-all.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-show-next.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-shown-node-count-preserved-when-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-containment-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-event-listeners.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-inspect-dom-wrapper.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-loader.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-location.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-orphan-nodes.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-statistics.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-expand-collapse.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-expansion-preserved-when-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-retainers.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-search-by-id.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-search.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-show-all.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-show-next.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-show-ranges.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-shown-node-count-preserved-when-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-sorting-fields.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-sorting-instances.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-summary-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-weak-dominator.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/profiler/heap-snapshot.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/iframe-main-resource.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/resource-tree/resource-metadata.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-request-content-after-loading-and-clearing-cache.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-request-content-while-loading.js [ Crash ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-request-content-after-loading-and-clearing-cache.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-request-content-while-loading.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-crafted-frame-add.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-document-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-add.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-in-crafted-frame.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-htmlimports.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-invalid-mime-type-css-content.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-no-xhrs.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-non-unique-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-reload.js [ Crash ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-document-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-add.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-in-crafted-frame.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-htmlimports.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-invalid-mime-type-css-content.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-no-xhrs.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-non-unique-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-reload.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/search/search-in-non-existing-resource.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/search/search-in-resource.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/search/search-in-sourcemap.js [ Crash Timeout ]
+crbug.com/982194 http/tests/devtools/search/search-in-sourcemap.js [ Crash Pass Timeout ]
 crbug.com/982194 http/tests/devtools/search/search-in-static.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/search/sources-search-scope-many-projects.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/lazy-addeventlisteners.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-worker-agents.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-worker-manager.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-worker-pause.js [ Crash Timeout ]
-crbug.com/982194 http/tests/devtools/service-workers/service-workers-bypass-for-network-cors.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-workers-bypass-for-network-navigation.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-workers-force-update-on-page-load.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-workers-navigation-preload.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-workers-redundant.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/service-workers-view.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/sw-navigate-useragent.js [ Crash ]
-crbug.com/982194 http/tests/devtools/service-workers/user-agent-override.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/css-sourcemaps-toggle-enabled.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await1.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-async/async-callstack-events.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-async/async-callstack-get-as-string.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-async/async-callstack-scripted-scroll.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-async/async-callstack-set-interval.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/debugger-set-breakpoint-regex.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-after-suspension.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-script-first-stmt.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-webaudio.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/picture-in-picture-event-listener-breakpoints.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-break-program.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-exceptions.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-frameworks/frameworks-with-async-callstack.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-frameworks/frameworks-with-worker.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-pause/debugger-pause-on-debugger-statement.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-pause/debugger-pause-with-overrides.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-pause/function-name-in-callstack.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-pause/pause-on-elements-panel.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/sources-search-scope-many-projects.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/lazy-addeventlisteners.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-worker-agents.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-worker-manager.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-worker-pause.js [ Crash Pass Timeout ]
+crbug.com/982194 http/tests/devtools/service-workers/service-workers-bypass-for-network-cors.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-workers-bypass-for-network-navigation.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-workers-force-update-on-page-load.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-workers-navigation-preload.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-workers-redundant.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/service-workers-view.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/sw-navigate-useragent.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/service-workers/user-agent-override.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/css-sourcemaps-toggle-enabled.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await1.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-async/async-callstack-events.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-async/async-callstack-get-as-string.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-async/async-callstack-scripted-scroll.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-async/async-callstack-set-interval.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/debugger-set-breakpoint-regex.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-after-suspension.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-script-first-stmt.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-webaudio.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-breakpoints/picture-in-picture-event-listener-breakpoints.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-break-program.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-exceptions.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-frameworks/frameworks-with-async-callstack.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-frameworks/frameworks-with-worker.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-pause/debugger-pause-on-debugger-statement.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-pause/debugger-pause-with-overrides.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-pause/function-name-in-callstack.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-pause/pause-on-elements-panel.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-in-ignore-injected-script.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-in.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-out-across-timeouts.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-out.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-over.js [ Crash ]
+crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-in.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-out-across-timeouts.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-out.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-step/debugger-step-over.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/sources/debugger-step/step-through-event-listeners.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/sources/debugger-ui/break-on-empty-event-listener.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-ui/break-on-set-timeout-with-syntax-error.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-ui/function-display-name-call-stack.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-ui/last-execution-context.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-ui/scripts-panel.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-ui/scripts-sorting.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-ui/scripts-with-same-source-url.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger-ui/switch-file.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger/async-callstack-fetch.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger/debugger-compile-and-run.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger/debugger-cyclic-reference.js [ Crash ]
+crbug.com/982194 http/tests/devtools/sources/debugger-ui/break-on-empty-event-listener.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-ui/break-on-set-timeout-with-syntax-error.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-ui/function-display-name-call-stack.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-ui/last-execution-context.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-ui/scripts-panel.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-ui/scripts-sorting.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-ui/scripts-with-same-source-url.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger-ui/switch-file.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger/async-callstack-fetch.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger/debugger-compile-and-run.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger/debugger-cyclic-reference.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/sources/debugger/debugger-return-value.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/sources/debugger/dynamic-script-tag.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/sources/debugger/dynamic-scripts.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger/extract-javascript-identifiers.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger/navigator-view.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger/network-uisourcecode-provider.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger/pause-in-removed-frame.js [ Crash ]
+crbug.com/982194 http/tests/devtools/sources/debugger/dynamic-scripts.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger/extract-javascript-identifiers.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger/navigator-view.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger/network-uisourcecode-provider.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger/pause-in-removed-frame.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/sources/debugger/script-collected.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/sources/debugger/worker-debugging-script-mapping.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/debugger/worker-debugging.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/event-listener-breakpoints-script-fst-stmt-for-module.js [ Crash ]
+crbug.com/982194 http/tests/devtools/sources/debugger/worker-debugging-script-mapping.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/debugger/worker-debugging.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/event-listener-breakpoints-script-fst-stmt-for-module.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/sources/inline-styles-scripts-locations.js [ Crash Pass ]
-crbug.com/982194 http/tests/devtools/sources/js-sourcemaps-toggle-enabled.js [ Crash ]
-crbug.com/982194 http/tests/devtools/sources/navigator-view-content-scripts.js [ Crash ]
-crbug.com/982194 http/tests/devtools/storage-panel-dom-storage-update.js [ Crash ]
-crbug.com/982194 http/tests/devtools/storage-panel-dom-storage.js [ Crash ]
-crbug.com/982194 http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Crash ]
-crbug.com/982194 http/tests/shapes/shape-outside-dynamic-shape-image-threshold.html [ Crash ]
+crbug.com/982194 http/tests/devtools/sources/js-sourcemaps-toggle-enabled.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/sources/navigator-view-content-scripts.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/storage-panel-dom-storage-update.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/storage-panel-dom-storage.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.js [ Crash Pass ]
+crbug.com/982194 http/tests/devtools/tracing/timeline-time/timeline-time.js [ Crash Pass ]
+crbug.com/982194 http/tests/shapes/shape-outside-dynamic-shape-image-threshold.html [ Crash Pass ]
 crbug.com/982194 images/color-profile-svg-fill-text.html [ Failure ]
 crbug.com/982194 images/content-url-image-with-alt-text-dynamic.html [ Failure Pass ]
 crbug.com/982194 images/content-url-image-with-alt-text.html [ Failure Pass ]
 crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-captureSnapshot-paintOrder.js [ Crash Pass ]
-crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-paintOrder.js [ Crash ]
-crbug.com/982194 media/controls/immersive-cast-button.html [ Crash ]
-crbug.com/982194 media/controls/immersive-mode-adds-css-class.html [ Crash ]
-crbug.com/982194 media/controls/volumechange-muted-attribute.html [ Failure ]
-crbug.com/982194 media/video-aspect-ratio.html [ Crash ]
+crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-paintOrder.js [ Crash Pass ]
+crbug.com/982194 media/controls/immersive-cast-button.html [ Crash Pass ]
+crbug.com/982194 media/controls/immersive-mode-adds-css-class.html [ Crash Pass ]
+crbug.com/982194 media/controls/volumechange-muted-attribute.html [ Failure Pass ]
+crbug.com/982194 media/video-aspect-ratio.html [ Crash Pass ]
 crbug.com/982194 media/video-canvas-draw.html [ Failure ]
-crbug.com/982194 overflow/overflow-basic-003.html [ Crash ]
+crbug.com/982194 overflow/overflow-basic-003.html [ Crash Pass ]
 crbug.com/982194 paint/background/background-clip-text-descendants.html [ Failure ]
-crbug.com/982194 paint/invalidation/bugzilla-6388.html [ Crash ]
+crbug.com/982194 paint/invalidation/bugzilla-6388.html [ Crash Pass ]
 crbug.com/982194 paint/invalidation/clip/caret-ancestor-clip-change.html [ Failure ]
-crbug.com/982194 paint/invalidation/compositing/become-overlay-composited-layer.html [ Crash ]
-crbug.com/982194 paint/invalidation/compositing/content-into-overflow.html [ Crash ]
-crbug.com/982194 paint/invalidation/compositing/invalidations-with-large-negative-margin.html [ Crash ]
-crbug.com/982194 paint/invalidation/compositing/layer-repaint-rects.html [ Crash ]
-crbug.com/982194 paint/invalidation/compositing/overflow-into-content.html [ Crash ]
+crbug.com/982194 paint/invalidation/compositing/become-overlay-composited-layer.html [ Crash Pass ]
+crbug.com/982194 paint/invalidation/compositing/content-into-overflow.html [ Crash Pass ]
+crbug.com/982194 paint/invalidation/compositing/invalidations-with-large-negative-margin.html [ Crash Pass ]
+crbug.com/982194 paint/invalidation/compositing/layer-repaint-rects.html [ Crash Pass ]
+crbug.com/982194 paint/invalidation/compositing/overflow-into-content.html [ Crash Pass ]
 crbug.com/982194 paint/invalidation/forms/select-option-background-color.html [ Failure ]
 crbug.com/982194 paint/invalidation/multi-layout-one-frame.html [ Failure ]
-crbug.com/982194 paint/invalidation/position/absolute-margin-change-repaint.html [ Crash ]
-crbug.com/982194 paint/invalidation/position/positioned-list-offset-change-repaint.html [ Crash ]
+crbug.com/982194 paint/invalidation/position/absolute-margin-change-repaint.html [ Crash Pass ]
+crbug.com/982194 paint/invalidation/position/positioned-list-offset-change-repaint.html [ Crash Pass ]
 crbug.com/982194 paint/invalidation/scroll/caret-invalidation-in-overflow-scroll.html [ Failure ]
-crbug.com/982194 paint/invalidation/scroll/repaint-composited-child-in-scrolled-container.html [ Crash ]
+crbug.com/982194 paint/invalidation/scroll/repaint-composited-child-in-scrolled-container.html [ Crash Pass ]
 crbug.com/982194 paint/invalidation/selection/selection-in-composited-scrolling-container.html [ Failure ]
 crbug.com/982194 paint/invalidation/selection/selection-in-non-composited-scrolling-container.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/add-outline-property-on-root.html [ Failure ]
@@ -4687,14 +4693,14 @@
 crbug.com/982194 paint/invalidation/svg/modify-transferred-listitem-different-attr.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/outline-offset-text.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/remove-outline-property-on-root.html [ Failure ]
-crbug.com/982194 paint/invalidation/svg/svg-layout-root-style-attr-update.html [ Crash ]
+crbug.com/982194 paint/invalidation/svg/svg-layout-root-style-attr-update.html [ Crash Pass ]
 crbug.com/982194 paint/invalidation/svg/text-match-svg.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/text-pattern-update-2.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/text-pattern-update.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/transform-text-element.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/tspan-pattern-update.html [ Failure ]
-crbug.com/982194 paint/invalidation/transform/invalidation-with-scale-transform.html [ Crash ]
-crbug.com/982194 scrollbars/overflow-auto-infinite-loop.html [ Crash ]
+crbug.com/982194 paint/invalidation/transform/invalidation-with-scale-transform.html [ Crash Pass ]
+crbug.com/982194 scrollbars/overflow-auto-infinite-loop.html [ Crash Pass ]
 crbug.com/982194 svg/as-image/default-font-settings-external.html [ Failure ]
 crbug.com/982194 svg/as-image/default-font-size.html [ Failure ]
 crbug.com/982194 svg/as-image/default-monospace-font.html [ Failure ]
@@ -4703,7 +4709,7 @@
 crbug.com/982194 svg/custom/getscreenctm-in-scrollable-div-area-nested.xhtml [ Failure ]
 crbug.com/982194 svg/custom/getscreenctm-in-scrollable-div-area.xhtml [ Failure ]
 crbug.com/982194 svg/custom/getscreenctm-in-scrollable-svg-area.xhtml [ Failure ]
-crbug.com/982194 svg/custom/inline-svg-use-available-width.html [ Crash ]
+crbug.com/982194 svg/custom/inline-svg-use-available-width.html [ Crash Pass ]
 crbug.com/982194 svg/custom/invisible-text-after-scrolling.xhtml [ Failure ]
 crbug.com/982194 svg/custom/junk-data.svg [ Failure ]
 crbug.com/982194 svg/custom/load-non-wellformed.svg [ Failure ]
@@ -4763,30 +4769,30 @@
 crbug.com/982194 tables/mozilla/bugs/bug120364.html [ Failure ]
 crbug.com/982194 tables/mozilla/bugs/bug16252.html [ Failure ]
 crbug.com/982194 tables/mozilla/bugs/bug23299.html [ Failure ]
-crbug.com/982194 tables/mozilla/bugs/bug32205-2.html [ Crash ]
+crbug.com/982194 tables/mozilla/bugs/bug32205-2.html [ Crash Pass ]
 crbug.com/982194 tables/mozilla/bugs/bug4093.html [ Failure ]
 crbug.com/982194 tables/mozilla/marvin/tables_align_left.html [ Failure ]
 crbug.com/982194 tables/mozilla/marvin/tables_align_right.html [ Failure ]
 crbug.com/982194 transforms/identity-matrix.html [ Failure ]
-crbug.com/982194 transitions/interrupted-all-transition.html [ Crash ]
+crbug.com/982194 transitions/interrupted-all-transition.html [ Crash Pass ]
 crbug.com/982194 virtual/android/fullscreen/model/fully-exit-fullscreen-single.html [ Crash Pass ]
 crbug.com/982194 virtual/android/url-bar/bottom-and-top-fixed-sticks-to-top.html [ Crash Failure ]
-crbug.com/982194 virtual/android/url-bar/bottom-fixed-adjusted-when-showing-url-bar.html [ Crash ]
-crbug.com/982194 virtual/audio-service/media/controls/immersive-cast-button.html [ Crash ]
-crbug.com/982194 virtual/audio-service/media/controls/immersive-mode-adds-css-class.html [ Crash ]
-crbug.com/982194 virtual/audio-service/media/video-aspect-ratio.html [ Crash ]
+crbug.com/982194 virtual/android/url-bar/bottom-fixed-adjusted-when-showing-url-bar.html [ Crash Failure ]
+crbug.com/982194 virtual/audio-service/media/controls/immersive-cast-button.html [ Crash Pass ]
+crbug.com/982194 virtual/audio-service/media/controls/immersive-mode-adds-css-class.html [ Crash Pass ]
+crbug.com/982194 virtual/audio-service/media/video-aspect-ratio.html [ Crash Pass ]
 crbug.com/982194 virtual/audio-service/media/video-canvas-draw.html [ Failure ]
 crbug.com/982194 virtual/composite-after-paint/compositing/gestures/gesture-tapHighlight-simple-scaledY.html [ Failure ]
 crbug.com/982194 virtual/composite-after-paint/paint/background/background-clip-text-descendants.html [ Failure ]
 crbug.com/982194 virtual/composite-after-paint/paint/background/scrolling-background-with-negative-z-child.html [ Pass ]
-crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance.html [ Crash Pass ]
 crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-suggestion-picker-appearance-with-scrollbar.html [ Failure Pass ]
 crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-suggestion-picker-appearance.html [ Failure Pass ]
-crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance.html [ Crash Pass ]
 crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/file/file-appearance-basic.html [ Failure ]
-crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance.html [ Crash Pass ]
 crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/suggestion-picker/date-suggestion-picker-appearance.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/suggestion-picker/month-suggestion-picker-appearance.html [ Failure ]
@@ -4796,16 +4802,16 @@
 crbug.com/982194 virtual/controls-refresh/calendar-picker/date-picker-month-appearance.html [ Timeout ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/button/button-appearance-basic.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/checkbox/checkbox-appearance-basic.html [ Failure ]
-crbug.com/982194 virtual/controls-refresh/color-scheme/color/color-picker-appearance.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh/color-scheme/color/color-picker-appearance.html [ Crash Pass ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/color/color-suggestion-picker-appearance-with-scrollbar.html [ Failure Pass ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/color/color-suggestion-picker-appearance.html [ Failure Pass ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/date/date-appearance-basic.html [ Failure ]
-crbug.com/982194 virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance.html [ Crash Pass ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/datetimelocal/datetimelocal-appearance-basic.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/file/file-appearance-basic.html [ Failure ]
-crbug.com/982194 virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance.html [ Crash Pass ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/month/month-appearance-basic.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/radio/radio-appearance-basic.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/range/range-appearance-basic.html [ Failure ]
@@ -4818,72 +4824,72 @@
 crbug.com/982194 virtual/controls-refresh/color-scheme/text/input-basic-box-appearance-basic.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/time/time-appearance-basic.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/week/week-appearance-basic.html [ Failure ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-accelerated-keyboard-navigation.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-click.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-edge-no-down-movement.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-drag.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-after-drag.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-edge-no-left-movement.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-edge-no-right-movement.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-top-edge-no-up-movement.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hex-format.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hsl-format.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-click.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-no-left-movement.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-no-vertical-movement.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-no-right-movement.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-imperfect-match.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-manual-color-change.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-set-type.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-set-value.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-value-attribute.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-zoom125.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-zoom200.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-color-well-selection-ring-no-scroll.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-enter-submission.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-escape-cancellation.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-keyboard-up-down-space-format-toggle.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-no-tab-character.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-tab-navigation.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/color/color-picker-zoom150-bottom-edge-no-nan.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-accelerated-keyboard-navigation.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-click.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-edge-no-down-movement.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-drag.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-after-drag.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-edge-no-left-movement.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-edge-no-right-movement.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-top-edge-no-up-movement.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hex-format.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hsl-format.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-click.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-no-left-movement.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-no-vertical-movement.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-no-right-movement.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-imperfect-match.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-manual-color-change.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-set-type.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-set-value.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-value-attribute.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-zoom125.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-appearance-zoom200.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-color-well-selection-ring-no-scroll.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-enter-submission.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-escape-cancellation.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-keyboard-up-down-space-format-toggle.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-no-tab-character.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-tab-navigation.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/color/color-picker-zoom150-bottom-edge-no-nan.html [ Crash Pass ]
 crbug.com/982194 virtual/controls-refresh/color/color-suggestion-picker-appearance-empty-list.html [ Failure Pass ]
 crbug.com/982194 virtual/controls-refresh/color/color-suggestion-picker-appearance-one-row.html [ Failure Pass ]
 crbug.com/982194 virtual/controls-refresh/color/color-suggestion-picker-appearance-two-rows.html [ Failure Pass ]
 crbug.com/982194 virtual/controls-refresh/color/color-suggestion-picker-appearance-value-attribute.html [ Failure Pass ]
 crbug.com/982194 virtual/controls-refresh/color/color-suggestion-picker-appearance-zoom125.html [ Failure Pass ]
 crbug.com/982194 virtual/controls-refresh/color/color-suggestion-picker-appearance-zoom200.html [ Failure Pass ]
-crbug.com/982194 virtual/controls-refresh/datetimelocal-picker/datetimelocal-cancel-select-value.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/datetimelocal-picker/datetimelocal-select-value.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/month-picker/month-picker-appearance-rtl.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval.html [ Crash ]
-crbug.com/982194 virtual/controls-refresh/month-picker/month-picker-appearance-zoom150.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh/datetimelocal-picker/datetimelocal-cancel-select-value.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/datetimelocal-picker/datetimelocal-select-value.html [ Crash Failure ]
+crbug.com/982194 virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/month-picker/month-picker-appearance-rtl.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval.html [ Crash Pass ]
+crbug.com/982194 virtual/controls-refresh/month-picker/month-picker-appearance-zoom150.html [ Crash Pass ]
 crbug.com/982194 virtual/controls-refresh/range/slider-vertical-no-shadow-root.html [ Crash Pass ]
 crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/OffscreenCanvas-copyImage.html [ Failure Pass ]
-crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/canvas-overflow-hidden-animation.html [ Crash ]
+crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/canvas-overflow-hidden-animation.html [ Crash Pass ]
 crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/webgl/draw-webgl-to-canvas-2d-after-to-data-url-without-context.html [ Crash ]
 crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Crash ]
 crbug.com/982194 virtual/exotic-color-space/images/55.html [ Failure ]
@@ -4900,7 +4906,7 @@
 crbug.com/982194 virtual/exotic-color-space/images/image-map-multiple-xhtml.xhtml [ Crash ]
 crbug.com/982194 virtual/exotic-color-space/images/image-map-multiple.html [ Crash ]
 crbug.com/982194 virtual/exotic-color-space/images/png-suite/test.html [ Failure ]
-crbug.com/982194 virtual/exotic-color-space/images/server-side-imagemap.html [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/server-side-imagemap.html [ Crash Pass ]
 crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-avoids-document-and-body.html [ Failure ]
 crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-button-negative-tabindex.html [ Failure ]
 crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-checkbox-radio.html [ Failure ]
@@ -4945,10 +4951,10 @@
 crbug.com/982194 virtual/gpu-rasterization/images/image-map-multiple.html [ Crash ]
 crbug.com/956736 virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Pass ]
 crbug.com/982194 virtual/gpu-rasterization/images/png-suite/test.html [ Failure ]
-crbug.com/982194 virtual/gpu-rasterization/images/server-side-imagemap.html [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/server-side-imagemap.html [ Crash Pass ]
 crbug.com/982194 virtual/gpu/fast/canvas/OffscreenCanvas-zero-size-readback.html [ Crash ]
-crbug.com/982194 virtual/gpu/fast/canvas/canvas-overflow-hidden-animation.html [ Crash ]
-crbug.com/866850 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Pass ]
+crbug.com/982194 virtual/gpu/fast/canvas/canvas-overflow-hidden-animation.html [ Crash Pass ]
+crbug.com/866850 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Failure Pass ]
 crbug.com/982194 virtual/gpu/fast/canvas/webgl/draw-webgl-to-canvas-2d-after-to-data-url-without-context.html [ Crash ]
 crbug.com/982194 virtual/gpu/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Crash ]
 crbug.com/982194 virtual/isolated_world_csp/http/tests/security/isolatedWorld/events.html [ Failure ]
@@ -5021,7 +5027,7 @@
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Crash ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-between-out-of-flow.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-into-content.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/relayout-abspos-in-relpos-spanner.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/relayout-abspos-in-relpos-spanner.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset-complex-tree.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/fixedpos-child-becomes-static.html [ Pass ]
@@ -5153,20 +5159,20 @@
 crbug.com/982194 virtual/layout_ng_block_frag/printing/viewport-size-dependant-iframe-with-multicol-crash.html [ Crash ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-016.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-017.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-flexbox-001.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-002.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-011.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-012.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-flexbox-001.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-002.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-011.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-012.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-020.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-021.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-024.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-024.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-056.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-flexbox-001.html [ Crash Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-005.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-005.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-scrollbars-002.html [ Crash Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-layout-ignored-cases-ib-split-001.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-layout-ignored-cases-ib-split-001.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-layout-overflow-002.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ib-split-001.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ib-split-001.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-containing-block-001.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-block-004.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-fieldset-002.html [ Failure ]
@@ -5175,158 +5181,158 @@
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-formatting-context.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-float.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_fieldset/fast/forms/fieldset/fieldset-disabled.html [ Crash Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/crash-removing-out-of-flow-child.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/flex-align-baseline.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/flex-align-stretch.html [ Crash ]
-crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/flexbox-baseline.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/flexitem.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/line-wrapping.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/crash-removing-out-of-flow-child.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/flex-align-baseline.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/flex-align-stretch.html [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/flexbox-baseline.html [ Crash Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/flexitem.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/line-wrapping.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/multiline-shrink-to-fit.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/percentage-height-replaced-element.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/relayout-image-load.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/relpos-with-percentage-top.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/percentage-height-replaced-element.html [ Crash Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/relayout-image-load.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/relpos-with-percentage-top.html [ Crash Failure ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/css-flexbox-column-reverse-wrap-reverse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/css-flexbox-column-reverse-wrap.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/css-flexbox-column-reverse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/css-flexbox-column-wrap-reverse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/css-flexbox-column-wrap.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/css-flexbox-column.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-basis-009.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-basis-009.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-box-wrap.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-flow-007.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-flow-010.html [ Crash Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-flow-007.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-flow-010.html [ Crash Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-grow-001.xht [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-row-reverse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-with-row-reverse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-vertical-align-effect.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_align-content-stretch-2.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_align-items-stretch-2.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_align-items-stretch.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-1-unitless-basis.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-N-unitless-basis.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-1-unitless-basis.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-N-unitless-basis.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-0-unitless.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-0.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-N-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-auto-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-basis-shrink.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-basis.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-initial-2.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-initial.html [ Crash Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_align-content-stretch-2.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_align-items-stretch-2.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_align-items-stretch.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-1-unitless-basis.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-N-unitless-basis.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-1-unitless-basis.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-N-unitless-basis.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-1.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-0-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-1.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-1-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-1.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-0-unitless.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-0.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-N-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-auto-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-N-N.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-basis-shrink.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-basis.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-initial-2.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-initial.html [ Crash Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-natural-variable-auto-basis.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-natural-variable-zero-basis.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-natural.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-none.html [ Crash Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-natural.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flex-none.html [ Crash Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flow-column-reverse-wrap-reverse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flow-column-reverse-wrap.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flow-column-wrap-reverse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_flow-column-wrap.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_generated.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-center.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-flex-end.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-flex-start.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-negative.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-only.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-negative.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-only.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_margin-auto-overflow-2.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_margin-auto-overflow.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_margin-auto.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_margin-left-ex.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_object.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_rowspan-overflow-automatic.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_rowspan-overflow.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Crash Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-center.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-flex-end.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-flex-start.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-negative.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-only.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-negative.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-only.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_margin-auto-overflow-2.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_margin-auto-overflow.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_margin-auto.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_margin-left-ex.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_object.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_rowspan-overflow-automatic.html [ Crash Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_rowspan-overflow.html [ Crash Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_rtl-flow-reverse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_rtl-flow.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_visibility-collapse-line-wrapping.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/hittest-overlapping-margin.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/overflow-top-left.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/percentage-heights-002.html [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/percentage-heights-004.html [ Crash Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/overflow-top-left.html [ Crash Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/percentage-heights-002.html [ Crash Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/percentage-heights-004.html [ Crash Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-center.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-end.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-space-around.html [ Failure ]
@@ -5458,7 +5464,7 @@
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousedown-inside-dragstart-should-not-cause-crash.html [ Crash Failure ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseenter-mouseleave-on-drag.html [ Crash Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousemove-after-drag-over-scrollbar.html [ Crash Failure ]
-crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-button.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-button.html [ Crash Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-mouseout.html [ Crash Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-mouseout2.html [ Crash Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseup-outside-button.html [ Crash Pass ]
@@ -5472,7 +5478,7 @@
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/open-window-from-another-frame.html [ Crash Timeout ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/page-scaled-mouse-click-iframe.html [ Crash ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/page-scaled-mouse-click.html [ Crash Pass ]
-crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointer-events-2.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointer-events-2.html [ Crash Failure ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointer-events.html [ Crash Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-node-remove.html [ Failure ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-on-object.html [ Crash ]
@@ -5594,7 +5600,7 @@
 crbug.com/982194 virtual/not-site-per-process/external/wpt/html/user-activation/message-event-activation-api-iframe-cross-origin.sub.tentative.html [ Timeout ]
 crbug.com/982194 virtual/not-site-per-process/http/tests/devtools/debugger/fetch-breakpoints.js [ Crash Timeout ]
 crbug.com/902685 virtual/not-site-per-process/http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Crash Pass ]
-crbug.com/982194 virtual/not-site-per-process/http/tests/devtools/oopif/oopif-storage.js [ Crash ]
+crbug.com/982194 virtual/not-site-per-process/http/tests/devtools/oopif/oopif-storage.js [ Crash Pass ]
 crbug.com/982194 virtual/not-site-per-process/http/tests/local/drag-over-remote-content.html [ Crash Timeout ]
 crbug.com/982194 virtual/not-site-per-process/http/tests/media/autoplay/webaudio-autoplay-iframe-with-gesture.html [ Crash Timeout ]
 crbug.com/982194 virtual/not-site-per-process/http/tests/webaudio/autoplay-crossorigin.html [ Crash Timeout ]
@@ -5606,11 +5612,11 @@
 crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html [ Timeout ]
 crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html [ Timeout ]
 crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/window-open.tentative.https.sub.html [ Timeout ]
-crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/ancestor-overflow.html [ Crash ]
-crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/get-transform-from-non-box-container.html [ Crash ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/ancestor-overflow.html [ Crash Pass ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/get-transform-from-non-box-container.html [ Crash Pass ]
 crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-children-do-not-paint-comp-scroll-phase.html [ Failure ]
 crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ Crash Failure ]
-crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-auto-infinite-loop.html [ Crash ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-auto-infinite-loop.html [ Crash Pass ]
 crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash Pass ]
 crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash Pass ]
 crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-middleclick-nopaste.html [ Crash Pass ]
@@ -5620,10 +5626,10 @@
 crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash Failure ]
 crbug.com/982194 virtual/scalefactor200/css3/filters/filtered-inline.html [ Failure ]
 crbug.com/982194 virtual/scalefactor200/css3/filters/null-effect-check.html [ Failure ]
-crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-001.html [ Crash ]
-crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-002.html [ Crash ]
-crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-003.html [ Crash ]
-crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filtered-inline-is-container.html [ Crash ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-001.html [ Crash Pass ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-002.html [ Crash Pass ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-003.html [ Crash Pass ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filtered-inline-is-container.html [ Crash Failure ]
 crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filters-test-brightness-003.html [ Pass ]
 crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ]
 crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/css-generated-text.html [ Timeout ]
@@ -5714,7 +5720,7 @@
 crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Crash Pass ]
 crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/subframe-interrupted-scroll.html [ Failure ]
 crbug.com/982194 virtual/scroll_customization/fast/scrolling/hashtag-autoscroll.html [ Crash Pass ]
-crbug.com/982194 virtual/scroll_customization/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Crash Pass ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Crash Failure Pass ]
 crbug.com/982194 virtual/scroll_customization/fast/scrolling/scroll-into-view-ignores-invisible-selection.html [ Crash Pass ]
 crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Failure ]
 crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-overried-inherited-visibility-hidden.html [ Failure ]
@@ -5749,33 +5755,33 @@
 crbug.com/982194 virtual/stable/http/tests/navigation/redirect-preserves-referrer.html [ Crash Timeout ]
 crbug.com/982194 virtual/stable/http/tests/navigation/same-document-scroll-position-restore.html [ Crash Timeout ]
 crbug.com/982194 virtual/stable/media/stable/video-object-fit-stable.html [ Pass ]
-crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-cert-not-found.js [ Crash Timeout ]
-crbug.com/874695 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-disable-cache.js [ Crash ]
-crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation-fail.js [ Crash ]
-crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation-redirect.js [ Crash ]
-crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation.js [ Crash ]
-crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch-fail.js [ Crash Timeout ]
-crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch.js [ Crash ]
-crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-transfer-size.js [ Crash ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-cert-not-found.js [ Crash Pass Timeout ]
+crbug.com/874695 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-disable-cache.js [ Crash Pass ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation-fail.js [ Crash Pass ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation-redirect.js [ Crash Pass ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation.js [ Crash Pass ]
+crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch-fail.js [ Crash Pass Timeout ]
+crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch.js [ Crash Failure ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-transfer-size.js [ Crash Pass ]
 crbug.com/982194 virtual/sxg-with-network-service/http/tests/loading/sxg/sxg-subresource-origin-trial.https.html [ Failure Pass ]
 crbug.com/982194 virtual/text-antialias/emphasis-vertical.html [ Failure ]
-crbug.com/982194 virtual/text-antialias/setData-dirty-lines.html [ Crash ]
+crbug.com/982194 virtual/text-antialias/setData-dirty-lines.html [ Crash Pass ]
 crbug.com/982194 virtual/text-antialias/softHyphen.html [ Failure ]
-crbug.com/982194 virtual/text-antialias/splitText-dirty-lines.html [ Crash ]
+crbug.com/982194 virtual/text-antialias/splitText-dirty-lines.html [ Crash Pass ]
 crbug.com/982194 virtual/text-antialias/whitespace-created-when-siblings-added-back-to-front.html [ Failure ]
 crbug.com/982194 virtual/text-antialias/whitespace/nowrap-clear-float.html [ Failure ]
 crbug.com/982194 virtual/text-antialias/word-break-run-rounding.html [ Failure ]
 crbug.com/982194 virtual/text-antialias/word-break.html [ Failure ]
 crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/inline-transform.html [ Failure ]
 crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/rotate-transform-equivalent.html [ Failure ]
-crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/state-at-end-event.html [ Crash ]
+crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/state-at-end-event.html [ Crash Pass ]
 crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/timing/animation-duration-infinite.html [ Failure Pass ]
-crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/timing/keyframe-timing-functions.html [ Crash ]
-crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/timing/keyframe-timing-functions2.html [ Crash ]
+crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/timing/keyframe-timing-functions.html [ Crash Pass ]
+crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/timing/keyframe-timing-functions2.html [ Crash Pass ]
 crbug.com/243871 virtual/threaded-prefer-compositing/fast/scroll-behavior/middleclick-autoscroll-use-count.html [ Crash Pass ]
 crbug.com/243871 virtual/threaded-prefer-compositing/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Crash Pass ]
 crbug.com/982194 virtual/threaded-prefer-compositing/fast/scrolling/hashtag-autoscroll.html [ Crash Pass ]
-crbug.com/982194 virtual/threaded-prefer-compositing/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Failure ]
+crbug.com/982194 virtual/threaded-prefer-compositing/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Failure Pass ]
 crbug.com/982194 virtual/threaded-prefer-compositing/fast/scrolling/scroll-into-view-ignores-invisible-selection.html [ Crash Pass ]
 crbug.com/982194 virtual/threaded-prefer-compositing/fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Failure ]
 crbug.com/982194 virtual/threaded-prefer-compositing/fast/scrolling/scrollable-area-frame-overried-inherited-visibility-hidden.html [ Failure ]
@@ -5787,7 +5793,7 @@
 crbug.com/982194 virtual/threaded-prefer-compositing/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash Pass ]
 crbug.com/982194 virtual/threaded/external/wpt/css/css-animations/animation-pseudo-dynamic-001.html [ Crash Pass ]
 crbug.com/982194 virtual/threaded/external/wpt/css/css-scroll-snap/scroll-margin.html [ Crash Pass ]
-crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/document-write.tentative.html [ Crash ]
+crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/document-write.tentative.html [ Crash Pass ]
 crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/focus-without-user-activation-tentative.sub.html [ Crash Pass ]
 crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html [ Pass ]
 crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Pass ]
@@ -5797,17 +5803,17 @@
 crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html [ Failure ]
 crbug.com/874695 virtual/threaded/http/tests/devtools/tracing/console-timeline.js [ Crash Pass ]
 crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/hit-test.js [ Failure ]
-crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-end-to-end.js [ Crash ]
-crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-no-url-end-to-end.js [ Crash ]
+crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-end-to-end.js [ Crash Pass ]
+crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-no-url-end-to-end.js [ Crash Pass ]
 crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile.js [ Crash Pass ]
 crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-event-causes.js [ Crash Failure ]
 crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-event-dispatch.js [ Pass Timeout ]
-crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Crash ]
+crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Crash Pass ]
 crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.js [ Crash Pass ]
 crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-time/timeline-usertiming.js [ Crash Pass ]
 crbug.com/982194 virtual/threaded/printing/return-from-printing-mode.html [ Failure ]
-crbug.com/982194 virtual/threaded/transitions/interrupted-all-transition.html [ Crash ]
-crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/document-write.tentative.html [ Crash ]
+crbug.com/982194 virtual/threaded/transitions/interrupted-all-transition.html [ Crash Pass ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/document-write.tentative.html [ Crash Pass ]
 crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/focus-without-user-activation-tentative.sub.html [ Crash Pass ]
 crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html [ Pass ]
 crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Pass ]
diff --git a/third_party/blink/web_tests/OWNERS b/third_party/blink/web_tests/OWNERS
index b68dbd2..72e8ffc 100644
--- a/third_party/blink/web_tests/OWNERS
+++ b/third_party/blink/web_tests/OWNERS
@@ -1,4 +1 @@
 *
-
-per-file SmokeTests=set noparent
-per-file SmokeTests=file://third_party/blink/tools/OWNERS
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index dc41f73..c135618 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1681,7 +1681,9 @@
 crbug.com/520611 [ Debug ] fast/filesystem/workers/file-writer-events-shared-worker.html [ Failure Pass ]
 crbug.com/520194 http/tests/xmlhttprequest/timeout/xmlhttprequest-timeout-worker-overridesexpires.html [ Failure Pass ]
 
-crbug.com/771233 [ Win10 ] http/tests/devtools/audits/ [ Skip ]
+# Temporarily disable to land Audits Panel changes in DevTools
+crbug.com/772558 http/tests/devtools/audits/ [ Pass Failure ]
+# crbug.com/771233 [ Win10 ] http/tests/devtools/audits/ [ Skip ]
 
 crbug.com/410974 fast/scroll-behavior/scroll-customization/scrollstate-basic.html [ Pass Failure ]
 crbug.com/410974 fast/scroll-behavior/scroll-customization/scrollstate-consume-deltas.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-008.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-008.html
new file mode 100644
index 0000000..732f941
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-008.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>Fixed indefinite heights</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#definite-sizes">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="" />
+<meta name="assert" content="Percent height flex items in a nested column flexbox have height resolved to auto." />
+
+<style>
+.column-flexbox {
+  display: flex;
+  flex-direction: column;
+}
+
+#percent-height-item {
+  height: 50%;
+  background: red;
+}
+
+#fixed-height-item {
+  height: 100px;
+  width: 100px;
+  background: green;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div class=column-flexbox>
+  <div class=column-flexbox>
+    <div id=fixed-height-item></div>
+    <div id=percent-height-item></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-009.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-009.html
new file mode 100644
index 0000000..b3de595
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-009.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>height: 100% should not be considered indefinite on a second flex item (triggers an obscure bug in Blink)</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#definite-sizes" />
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1019138" />
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
+<style type="text/css">
+.container {
+  height: 100px;
+  width: 100px;
+}
+.flexbox {
+  background: red;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+.first-item {
+  background: green;
+  display: flex;
+}
+.second-item {
+  /* This should not be considered indefinite */
+  height: 100%;
+  background: green;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+  <div class="flexbox">
+    <div class="first-item">
+      <div style="width: 100px; height: 20px;"></div>
+    </div>
+    <div class="second-item">
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-padding-001.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-padding-001.html
new file mode 100644
index 0000000..8bba5d60
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-padding-001.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='/resources/check-layout-th.js'></script>
+<link rel="author" title="David Grogan" href="dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-physical" title="Percentages line">
+<meta name="flags" content="" />
+<meta name="assert" content="item's padding is resolved against parent's size, not item's" />
+
+<style>
+x-flexbox {
+  display: flex;
+  height: 50px;
+  width: 500px;
+}
+
+x-item {
+  padding-left: 10%;
+  background: blue;
+  position: relative; /* Just so offsetLeft returns distance between x-item and div */
+}
+
+div {
+  height: 50px;
+  width: 50px;
+  background: orange;
+}
+</style>
+
+If the item's % padding is calculated correctly, there is a blue square on the left and an orange square on the right, both 50x50.
+
+<x-flexbox>
+  <x-item>
+    <div data-offset-x=50></div>
+  </x-item>
+</x-flexbox>
+
+<script>
+checkLayout('x-flexbox');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/dom/nodes/aria-element-reflection.tentative.html b/third_party/blink/web_tests/external/wpt/dom/nodes/aria-element-reflection.tentative.html
index 84882881..7c8e690 100644
--- a/third_party/blink/web_tests/external/wpt/dom/nodes/aria-element-reflection.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/dom/nodes/aria-element-reflection.tentative.html
@@ -8,118 +8,109 @@
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
   </head>
+
   <div id="activedescendant" aria-activedescendant="x"></div>
 
-  <div id="parent-listbox" role="listbox" aria-activedescendant="i1">
+  <div id="parentListbox" role="listbox" aria-activedescendant="i1">
     <div role="option" id="i1">Item 1</div>
     <div role="option" id="i2">Item 2</div>
   </div>
 
   <script>
   test(function(t) {
-    const ancestor = document.getElementById("parent-listbox");
     assert_equals(activedescendant.ariaActiveDescendantElement, null,
                   "invalid ID for relationship returns null");
 
-    const descendant1 = document.getElementById("i1");
-    const descendant2 = document.getElementById("i2");
-
     // Element reference should be set if the content attribute was included.
-    assert_equals(ancestor.getAttribute("aria-activedescendant"), "i1", "check content attribute after parsing.");
-    assert_equals(ancestor.ariaActiveDescendantElement, i1, "check idl attribute after parsing.");
+    assert_equals(parentListbox.getAttribute("aria-activedescendant"), "i1", "check content attribute after parsing.");
+    assert_equals(parentListbox.ariaActiveDescendantElement, i1, "check idl attribute after parsing.");
 
     // If we set the content attribute, the element reference should reflect this.
-    ancestor.setAttribute("aria-activedescendant", "i2");
-    assert_equals(ancestor.ariaActiveDescendantElement, descendant2, "setting the content attribute updates the element reference.");
+    parentListbox.setAttribute("aria-activedescendant", "i2");
+    assert_equals(parentListbox.ariaActiveDescendantElement, i2, "setting the content attribute updates the element reference.");
 
     // Setting the element reference should be reflected in the content attribute.
-    ancestor.ariaActiveDescendantElement = descendant1;
-    assert_equals(ancestor.ariaActiveDescendantElement, descendant1, "getter should return the right element reference.");
-    assert_equals(ancestor.getAttribute("aria-activedescendant"), "i1", "content attribute should reflect the element reference.");
+    parentListbox.ariaActiveDescendantElement = i1;
+    assert_equals(parentListbox.ariaActiveDescendantElement, i1, "getter should return the right element reference.");
+    assert_equals(parentListbox.getAttribute("aria-activedescendant"), "i1", "content attribute should reflect the element reference.");
 
     // Both content and IDL attribute should be nullable.
-    ancestor.ariaActiveDescendantElement = null;
-    assert_equals(ancestor.ariaActiveDescendantElement, null);
-    assert_false(ancestor.hasAttribute("aria-activedescendant"));
-    assert_equals(ancestor.getAttribute("aria-activedescendant"), null, "nullifying the idl attribute removes the content attribute.");
+    parentListbox.ariaActiveDescendantElement = null;
+    assert_equals(parentListbox.ariaActiveDescendantElement, null);
+    assert_false(parentListbox.hasAttribute("aria-activedescendant"));
+    assert_equals(parentListbox.getAttribute("aria-activedescendant"), null, "nullifying the idl attribute removes the content attribute.");
 
     // Setting content attribute to non-existent or non compatible element should nullify the IDL attribute.
     // Reset the element to an existant one.
-    ancestor.setAttribute("aria-activedescendant", "i1");
-    assert_equals(ancestor.ariaActiveDescendantElement, i1, "reset attribute.");
+    parentListbox.setAttribute("aria-activedescendant", "i1");
+    assert_equals(parentListbox.ariaActiveDescendantElement, i1, "reset attribute.");
 
-    ancestor.setAttribute("aria-activedescendant", "non-existent-element");
-    assert_equals(ancestor.getAttribute("aria-activedescendant"), "non-existent-element");
-    assert_equals(ancestor.ariaActiveDescendantElement, null,"non-DOM content attribute should null the element reference");
+    parentListbox.setAttribute("aria-activedescendant", "non-existent-element");
+    assert_equals(parentListbox.getAttribute("aria-activedescendant"), "non-existent-element");
+    assert_equals(parentListbox.ariaActiveDescendantElement, null,"non-DOM content attribute should null the element reference");
   }, "aria-activedescendant element reflection");
   </script>
 
-  <div id="parent-listbox-2" role="listbox" aria-activedescendant="option1">
+  <div id="parentListbox2" role="listbox" aria-activedescendant="option1">
     <div role="option" id="option1">Item 1</div>
     <div role="option" id="option2">Item 2</div>
   </div>
 
   <script>
   test(function(t) {
-    const ancestor = document.getElementById("parent-listbox-2");
     const option1 = document.getElementById("option1");
     const option2 = document.getElementById("option2");
-    assert_equals(ancestor.ariaActiveDescendantElement, option1);
-
+    assert_equals(parentListbox2.ariaActiveDescendantElement, option1);
     option1.removeAttribute("id");
     option2.setAttribute("id", "option1");
     const option2Duplicate = document.getElementById("option1");
     assert_equals(option2, option2Duplicate);
 
-    assert_equals(ancestor.ariaActiveDescendantElement, option2);
+    assert_equals(parentListbox2.ariaActiveDescendantElement, option2);
   }, "If the content attribute is set directly, the IDL attribute getter always returns the first element whose ID matches the content attribute.");
   </script>
 
-  <div id="blank-id-parent" role="listbox">
+  <div id="blankIdParent" role="listbox">
     <div role="option" id="multiple-id"></div>
     <div role="option" id="multiple-id"></div>
   </div>
 
   <script>
   test(function(t) {
-    const ancestor = document.getElementById("blank-id-parent");
-
     // Get second child of parent. This violates the setting of a reflected element
     // as it will not be the first child of the parent with that ID, which should
     // result in an empty string for the content attribute.
-    ancestor.ariaActiveDescendantElement = ancestor.children[1];
-    assert_true(ancestor.hasAttribute("aria-activedescendant"));
-    assert_equals(ancestor.getAttribute("aria-activedescendant"), "");
-    assert_equals(ancestor.ariaActiveDescendantElement, ancestor.children[1]);
+    blankIdParent.ariaActiveDescendantElement = blankIdParent.children[1];
+    assert_true(blankIdParent.hasAttribute("aria-activedescendant"));
+    assert_equals(blankIdParent.getAttribute("aria-activedescendant"), "");
+    assert_equals(blankIdParent.ariaActiveDescendantElement, blankIdParent.children[1]);
   }, "Setting the IDL attribute to an element which is not the first element in DOM order with its ID causes the content attribute to be an empty string");
   </script>
 
-  <div id="outer-container">
-    <p id="light-paragraph">Hello world!</p>
-    <span class="shadow-host">
+  <div id="outerContainer">
+    <p id="lightParagraph">Hello world!</p>
+    <span id="shadowHost">
     </span>
   </div>
 
   <script>
   test(function(t) {
-    const shadowElement = document.querySelector(".shadow-host");
-    const shadow = shadowElement.attachShadow({mode: "open"});
+    const shadow = shadowHost.attachShadow({mode: "open"});
     const link = document.createElement("a");
     shadow.appendChild(link);
 
-    const lightPara = document.getElementById("light-paragraph");
-    assert_equals(lightPara.ariaActiveDescendantElement, null);
+    assert_equals(lightParagraph.ariaActiveDescendantElement, null);
 
     // The given element crosses a shadow dom boundary, so it cannot be
     // set as an element reference.
-    lightPara.ariaActiveDescendantElement = link;
-    assert_equals(lightPara.ariaActiveDescendantElement, null);
+    lightParagraph.ariaActiveDescendantElement = link;
+    assert_equals(lightParagraph.ariaActiveDescendantElement, null);
 
     // The given element crosses a shadow dom boundary (upwards), so
     // can be used as an element reference, but the content attribute
     // should reflect the empty string.
-    link.ariaActiveDescendantElement = lightPara;
-    assert_equals(link.ariaActiveDescendantElement, lightPara);
+    link.ariaActiveDescendantElement = lightParagraph;
+    assert_equals(link.ariaActiveDescendantElement, lightParagraph);
     assert_equals(link.getAttribute("aria-activedescendant"), "");
   }, "Setting an element reference that crosses into a shadow tree is disallowed, but setting one that is in a shadow inclusive ancestor is allowed.");
   </script>
@@ -129,18 +120,15 @@
 
   <script>
   test(function(t) {
-    const inputElement = document.getElementById("startTime");
-    const errorMessage = document.getElementById("errorMessage");
+    startTime.ariaErrorMessageElement = errorMessage;
+    assert_equals(startTime.getAttribute("aria-errormessage"), "errorMessage");
 
-    inputElement.ariaErrorMessageElement = errorMessage;
-    assert_equals(inputElement.getAttribute("aria-errormessage"), "errorMessage");
+    startTime.ariaErrorMessageElement = null;
+    assert_equals(startTime.ariaErrorMessageElement, null, "blah");
+    assert_false(startTime.hasAttribute("aria-errormessage"));
 
-    inputElement.ariaErrorMessageElement = null;
-    assert_equals(inputElement.ariaErrorMessageElement, null, "blah");
-    assert_false(inputElement.hasAttribute("aria-errormessage"));
-
-    inputElement.setAttribute("aria-errormessage", "errorMessage");
-    assert_equals(inputElement.ariaErrorMessageElement, errorMessage);
+    startTime.setAttribute("aria-errormessage", "errorMessage");
+    assert_equals(startTime.ariaErrorMessageElement, errorMessage);
 
   }, "aria-errormessage");
 
@@ -148,74 +136,62 @@
 
   <label>
     Password:
-    <input id="password-field" type="password" aria-details="pw">
+    <input id="passwordField" type="password" aria-details="pw">
   </label>
 
   <ul>
-    <li id="list-item-1">First description.</li>
-    <li id="list-item-2">Second description.</li>
+    <li id="listItem1">First description.</li>
+    <li id="listItem2">Second description.</li>
   </ul>
 
   <script>
 
   test(function(t) {
-    const inputElement = document.getElementById("password-field");
-    const ul1 = document.getElementById("list-item-1");
-    const ul2 = document.getElementById("list-item-2");
+    assert_equals(passwordField.ariaDetailsElement, null);
+    passwordField.ariaDetailsElement = listItem1;
+    assert_equals(passwordField.getAttribute("aria-details"), "listItem1");
 
-    assert_equals(inputElement.ariaDetailsElement, null);
-    inputElement.ariaDetailsElement = ul1;
-    assert_equals(inputElement.getAttribute("aria-details"), "list-item-1");
-
-    inputElement.ariaDetailsElement = ul2;
-    assert_equals(inputElement.getAttribute("aria-details"), "list-item-2");
+    passwordField.ariaDetailsElement = listItem2;
+    assert_equals(passwordField.getAttribute("aria-details"), "listItem2");
   }, "aria-details");
   </script>
 
-  <div id="old-parent" role="listbox" aria-activedescendant="content-attr-element">
-    <div role="option" id="content-attr-element">Item 1</div>
-    <div role="option" id="idl-attr-element">Item 2</div>
+  <div id="deletionParent" role="listbox" aria-activedescendant="contentAttrElement">
+    <div role="option" id="contentAttrElement">Item 1</div>
+    <div role="option" id="idlAttrElement">Item 2</div>
   </div>
 
   <script>
 
   test(function(t) {
-    const deletionParent = document.getElementById("old-parent");
-
-    const descendant1 = document.getElementById("content-attr-element");
-    const descendant2 = document.getElementById("idl-attr-element");
-
     // Deleting an element set via the content attribute.
-    assert_equals(deletionParent.getAttribute("aria-activedescendant"), "content-attr-element");
-    assert_equals(deletionParent.ariaActiveDescendantElement, descendant1);
+    assert_equals(deletionParent.getAttribute("aria-activedescendant"), "contentAttrElement");
+    assert_equals(deletionParent.ariaActiveDescendantElement, contentAttrElement);
 
-    deletionParent.removeChild(descendant1);
-    assert_equals(deletionParent.getAttribute("aria-activedescendant"), "content-attr-element");
+    deletionParent.removeChild(contentAttrElement);
+    assert_equals(deletionParent.getAttribute("aria-activedescendant"), "contentAttrElement");
     assert_equals(deletionParent.ariaActiveDescendantElement, null);
 
     // Deleting an element set via the IDL attribute.
-    deletionParent.ariaActiveDescendantElement = descendant2;
-    assert_equals(deletionParent.getAttribute("aria-activedescendant"), "idl-attr-element");
+    deletionParent.ariaActiveDescendantElement = idlAttrElement;
+    assert_equals(deletionParent.getAttribute("aria-activedescendant"), "idlAttrElement");
 
-    deletionParent.removeChild(descendant2);
+    deletionParent.removeChild(idlAttrElement);
     assert_equals(deletionParent.ariaActiveDescendantElement, null);
 
     // The content attribute will still reflect the id.
-    assert_equals(deletionParent.getAttribute("aria-activedescendant"), "idl-attr-element");
+    assert_equals(deletionParent.getAttribute("aria-activedescendant"), "idlAttrElement");
   }, "Deleting a reflected element should return null for the IDL attribute and cause the content attribute to become stale.");
   </script>
 
-  <div id="parent" role="listbox" aria-activedescendant="original">
-    <div role="option" id="original">Item 1</div>
-    <div role="option" id="element-with-persistant-id">Item 2</div>
+  <div id="parentNode" role="listbox" aria-activedescendant="changingIdElement">
+    <div role="option" id="changingIdElement">Item 1</div>
+    <div role="option" id="persistantIDElement">Item 2</div>
   </div>
 
   <script>
   test(function(t) {
-    const parentNode = document.getElementById("parent");
-    const changingIdElement = document.getElementById("original");
-    const persistantIDElement = document.getElementById("element-with-persistant-id");
-
+    const changingIdElement = document.getElementById("changingIdElement");
     assert_equals(parentNode.ariaActiveDescendantElement, changingIdElement);
 
     // Modify the id attribute.
@@ -223,7 +199,7 @@
 
     // The content attribute still reflects the old id, and we expect the
     // Element reference to be null as there is no DOM node with id "original"
-    assert_equals(parentNode.getAttribute("aria-activedescendant"), "original");
+    assert_equals(parentNode.getAttribute("aria-activedescendant"), "changingIdElement");
     assert_equals(parentNode.ariaActiveDescendantElement, null, "Element set via content attribute with a changed id will return null on getting");
 
     parentNode.ariaActiveDescendantElement = changingIdElement;
@@ -238,57 +214,48 @@
   }, "Changing the ID of an element causes the content attribute to become out of sync.");
   </script>
 
-  <div id="light-parent" role="listbox">
-    <div role="option" id="light-element">Hello world!</div>
+  <div id="lightParent" role="listbox">
+    <div role="option" id="lightElement">Hello world!</div>
   </div>
-  <div id="shadowHost"></div>
+  <div id="shadowHostElement"></div>
 
   <script>
   test(function(t) {
-    const shadowElement = document.getElementById("shadowHost");
-    const shadowHost = shadowElement.attachShadow({mode: "open"});
-    const lightParent = document.getElementById("light-parent");
-    const optionElement = document.getElementById("light-element");
+    const lightElement = document.getElementById("lightElement");
+    const shadowRoot = shadowHostElement.attachShadow({mode: "open"});
 
-    lightParent.ariaActiveDescendantElement = optionElement;
-    assert_equals(lightParent.ariaActiveDescendantElement, optionElement);
+    lightParent.ariaActiveDescendantElement = lightElement;
+    assert_equals(lightParent.ariaActiveDescendantElement, lightElement);
 
     // Move the referenced element into shadow DOM.
-    shadowHost.appendChild(optionElement);
+    shadowRoot.appendChild(lightElement);
     assert_equals(lightParent.ariaActiveDescendantElement, null);
-    assert_equals(lightParent.getAttribute("aria-activedescendant"), "light-element");
+    assert_equals(lightParent.getAttribute("aria-activedescendant"), "lightElement");
 
     // Move the referenced element back into light DOM.
-    lightParent.appendChild(optionElement);
-    assert_equals(lightParent.ariaActiveDescendantElement, optionElement);
+    lightParent.appendChild(lightElement);
+    assert_equals(lightParent.ariaActiveDescendantElement, lightElement);
   }, "Reparenting an element into a descendant shadow scope nullifies the element reference.");
   </script>
 
-  <div id="myBillingId">Billing</div>
-
+  <div id="billingElement">Billing</div>
   <div>
-      <div id="myNameId">Name</div>
-      <input type="text" id="input1" aria-labelledby="myBillingId myNameId"/>
+      <div id="nameElement">Name</div>
+      <input type="text" id="input1" aria-labelledby="billingElement nameElement"/>
   </div>
   <div>
-      <div id="myAddressId">Address</div>
+      <div id="addressElement">Address</div>
       <input type="text" id="input2"/>
   </div>
 
   <script>
   test(function(t) {
-    const billingElement = document.getElementById("myBillingId");
-    const nameElement = document.getElementById("myNameId");
-    const addressElement = document.getElementById("myAddressId");
-    const input1 = document.getElementById("input1");
-    const input2 = document.getElementById("input2");
-
     assert_array_equals(input1.ariaLabelledByElements, [billingElement, nameElement], "parsed content attribute sets element references.");
     assert_equals(input2.ariaLabelledByElements, null, "Testing empty content attribute after parsing.");
 
     input2.ariaLabelledByElements = [billingElement, addressElement];
     assert_array_equals(input2.ariaLabelledByElements, [billingElement, addressElement], "Testing IDL setter/getter.");
-    assert_equals(input2.getAttribute("aria-labelledby"), "myBillingId myAddressId");
+    assert_equals(input2.getAttribute("aria-labelledby"), "billingElement addressElement");
 
     billingElement.remove();
     assert_array_equals(input2.ariaLabelledByElements, [addressElement]);
@@ -312,10 +279,6 @@
 
   <script>
   test(function(t) {
-    const link1 = document.getElementById("link1");
-    const link2 = document.getElementById("link2");
-    const panel1 = document.getElementById("panel1");
-    const panel2 = document.getElementById("panel2");
     assert_array_equals(link1.ariaControlsElements, [panel1]);
     assert_equals(link2.ariaControlsElements, null);
 
@@ -333,60 +296,56 @@
   }, "aria-controls.");
   </script>
 
-  <a id="described-link" aria-describedby="description1 description2">Fruit</a>
+  <a id="describedLink" aria-describedby="description1 description2">Fruit</a>
   <div id="description1">Delicious</div>
   <div id="description2">Nutritious</div>
 
   <script>
   test(function(t) {
-    const link = document.getElementById("described-link");
-    const description1 = document.getElementById("description1");
-    const description2 = document.getElementById("description2");
-    assert_array_equals(link.ariaDescribedByElements, [description1, description2]);
+    assert_array_equals(describedLink.ariaDescribedByElements, [description1, description2]);
 
-    link.ariaDescribedByElements = [description1, description2];
-    assert_equals(link.getAttribute("aria-describedby"), "description1 description2");
+    describedLink.ariaDescribedByElements = [description1, description2];
+    assert_equals(describedLink.getAttribute("aria-describedby"), "description1 description2");
 
-    link.ariaDescribedByElements = [];
-    assert_equals(link.getAttribute("aria-describedby"), "");
+    describedLink.ariaDescribedByElements = [];
+    assert_equals(describedLink.getAttribute("aria-describedby"), "");
 
-    link.setAttribute("aria-describedby", "description1");
-    assert_array_equals(link.ariaDescribedByElements, [description1]);
+    describedLink.setAttribute("aria-describedby", "description1");
+    assert_array_equals(describedLink.ariaDescribedByElements, [description1]);
 
-    link.removeAttribute("aria-describedby");
-    assert_equals(link.ariaDescribedByElements, null);
+    describedLink.removeAttribute("aria-describedby");
+    assert_equals(describedLink.ariaDescribedByElements, null);
   }, "aria-describedby.");
   </script>
 
-  <h2 id="title-heading" aria-flowto="article1 article2">Title</h2>
+  <h2 id="titleHeading" aria-flowto="article1 article2">Title</h2>
   <div>Next</div>
   <article id="article2">Content2</article>
   <article id="article1">Content1</article>
 
   <script>
   test(function(t) {
-    const heading = document.getElementById("title-heading");
     const article1 = document.getElementById("article1");
     const article2 = document.getElementById("article2");
 
-    assert_array_equals(heading.ariaFlowToElements, [article1, article2]);
+    assert_array_equals(titleHeading.ariaFlowToElements, [article1, article2]);
 
-    heading.ariaFlowToElements = [article1, article2];
-    assert_equals(heading.getAttribute("aria-flowto"), "article1 article2");
+    titleHeading.ariaFlowToElements = [article1, article2];
+    assert_equals(titleHeading.getAttribute("aria-flowto"), "article1 article2");
 
-    heading.ariaFlowToElements = [];
-    assert_equals(heading.getAttribute("aria-flowto"), "");
+    titleHeading.ariaFlowToElements = [];
+    assert_equals(titleHeading.getAttribute("aria-flowto"), "");
 
-    heading.setAttribute("aria-flowto", "article1");
-    assert_array_equals(heading.ariaFlowToElements, [article1]);
+    titleHeading.setAttribute("aria-flowto", "article1");
+    assert_array_equals(titleHeading.ariaFlowToElements, [article1]);
 
-    heading.removeAttribute("aria-flowto");
-    assert_equals(heading.ariaFlowToElements, null);
+    titleHeading.removeAttribute("aria-flowto");
+    assert_equals(titleHeading.ariaFlowToElements, null);
   }, "aria-flowto.");
   </script>
 
   <ul>
-    <li id="li-owner" aria-owns="child1 child2">Parent</li>
+    <li id="listItemOwner" aria-owns="child1 child2">Parent</li>
   </ul>
   <ul>
     <li id="child1">Child 1</li>
@@ -394,51 +353,41 @@
   </ul>
   <script>
   test(function(t) {
-    const owner = document.getElementById("li-owner");
-    const child1 = document.getElementById("child1");
-    const child2 = document.getElementById("child2");
+    assert_array_equals(listItemOwner.ariaOwnsElements, [child1, child2]);
 
-    assert_array_equals(owner.ariaOwnsElements, [child1, child2]);
+    listItemOwner.removeAttribute("aria-owns");
+    assert_equals(listItemOwner.ariaOwnsElements, null);
 
-    owner.removeAttribute("aria-owns");
-    assert_equals(owner.ariaOwnsElements, null);
+    listItemOwner.ariaOwnsElements = [child1, child2];
+    assert_equals(listItemOwner.getAttribute("aria-owns"), "child1 child2");
 
-    owner.ariaOwnsElements = [child1, child2];
-    assert_equals(owner.getAttribute("aria-owns"), "child1 child2");
+    listItemOwner.ariaOwnsElements = [];
+    assert_equals(listItemOwner.getAttribute("aria-owns"), "");
 
-    owner.ariaOwnsElements = [];
-    assert_equals(owner.getAttribute("aria-owns"), "");
-
-    owner.setAttribute("aria-owns", "child1");
-    assert_array_equals(owner.ariaOwnsElements, [child1]);
+    listItemOwner.setAttribute("aria-owns", "child1");
+    assert_array_equals(listItemOwner.ariaOwnsElements, [child1]);
   }, "aria-owns.");
   </script>
 
-  <div id="light-dom-container">
-    <h2 id="light-dom-heading" aria-flowto="shadow-child-1 shadow-child-2">Light DOM Heading</h2>
-    <div id="shadow-dom-host"></div>
-    <p id="light-dom-text-1">Light DOM text</p>
-    <p id="light-dom-text-2">Light DOM text</p>
+  <div id="lightDomContainer">
+    <h2 id="lightDomHeading" aria-flowto="shadowChild1 shadowChild2">Light DOM Heading</h2>
+    <div id="host"></div>
+    <p id="lightDomText1">Light DOM text</p>
+    <p id="lightDomText2">Light DOM text</p>
   </div>
 
   <script>
   test(function(t) {
-    const shadowHost = document.getElementById("shadow-dom-host");
-    const lightDomHeading = document.getElementById("light-dom-heading");
-    const lightDomText1 = document.getElementById("light-dom-text-1");
-    const lightDomText2 = document.getElementById("light-dom-text-2");
-
-    const shadowRoot = shadowHost.attachShadow({mode: "open"});
+    const shadowRoot = host.attachShadow({mode: "open"});
     const shadowChild1 = document.createElement("article");
-    shadowChild1.setAttribute("id", "shadow-child-1");
+    shadowChild1.setAttribute("id", "shadowChild1");
     shadowRoot.appendChild(shadowChild1);
     const shadowChild2 = document.createElement("article");
-    shadowChild2.setAttribute("id", "shadow-child-1");
+    shadowChild2.setAttribute("id", "shadowChild1");
     shadowRoot.appendChild(shadowChild2);
 
     // The elements in the content attribute are in a "darker" tree - they
-    // enter a shadow encapsulation boundary, so should reflect null for
-    // the content attribute.
+    // enter a shadow encapsulation boundary, so not be associated any more.
     assert_equals(lightDomHeading.ariaFlowToElements, null);
 
     // These elements are in a shadow including ancestor, i.e "lighter" tree.
@@ -448,14 +397,14 @@
 
     // These IDs belong to a different scope, so the attr-associated-element
     // cannot be computed.
-    shadowChild2.setAttribute("aria-flowto", "light-dom-text-1 light-dom-text-2");
+    shadowChild2.setAttribute("aria-flowto", "lightDomText1 lightDomText2");
     assert_equals(shadowChild2.ariaFlowToElements, null);
 
     // Elements that cross into shadow DOM are dropped, only reflect the valid
     // elements in IDL and in the content attribute.
     lightDomHeading.ariaFlowToElements = [shadowChild1, shadowChild2, lightDomText1, lightDomText2];
     assert_array_equals(lightDomHeading.ariaFlowToElements, [lightDomText1, lightDomText2]);
-    assert_equals(lightDomHeading.getAttribute("aria-flowto"), "light-dom-text-1 light-dom-text-2", "empty content attribute if any given elements cross shadow boundaries");
+    assert_equals(lightDomHeading.getAttribute("aria-flowto"), "lightDomText1 lightDomText2", "empty content attribute if any given elements cross shadow boundaries");
 
     // Using a mixture of elements in the same scope and in a shadow including
     // ancestor should set the IDL attribute, but should reflect the empty
@@ -466,4 +415,124 @@
 
   }, "shadow DOM behaviour for FrozenArray element reflection.");
   </script>
+
+  <div id="describedButtonContainer">
+    <div id="buttonDescription1">Delicious</div>
+    <div id="buttonDescription2">Nutritious</div>
+    <div id="outerShadowHost"></div>
+  </div>
+
+  <script>
+  test(function(t) {
+    const description1 = document.getElementById("buttonDescription1");
+    const description2 = document.getElementById("buttonDescription2");
+    const outerShadowRoot = outerShadowHost.attachShadow({mode: "open"});
+    const innerShadowHost = document.createElement("div");
+    outerShadowRoot.appendChild(innerShadowHost);
+    const innerShadowRoot = innerShadowHost.attachShadow({mode: "open"});
+
+    // Create an element, add some attr associated light DOM elements and append it to the outer shadow root.
+    const describedElement = document.createElement("button");
+    describedButtonContainer.appendChild(describedElement);
+    describedElement.ariaDescribedByElements = [description1, description2];
+
+    // All elements were in the same scope, so elements are gettable and the content attribute reflects the ids.
+    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2]);
+    assert_equals(describedElement.getAttribute("aria-describedby"), "buttonDescription1 buttonDescription2");
+
+    outerShadowRoot.appendChild(describedElement);
+
+    // Explicitly set attr-associated-elements should still be gettable because we are referencing elements in a lighter scope.
+    // The content attr still reflects the ids from the explicit elements because they were in a valid scope at the time of setting.
+    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2]);
+    assert_equals(describedElement.getAttribute("aria-describedby"), "buttonDescription1 buttonDescription2");
+
+    // Move the explicitly set elements into a deeper shadow DOM to test the relationship should not be gettable.
+    innerShadowRoot.appendChild(description1);
+    innerShadowRoot.appendChild(description2);
+
+    // Explicitly set elements are still present, but are not retrieved.
+    // content attribute is still stale because all elements were in a valid scope when they were set.
+    assert_array_equals(describedElement.ariaDescribedByElements, []);
+    assert_equals(describedElement.getAttribute("aria-describedby"), "buttonDescription1 buttonDescription2");
+
+    // Move into the same shadow scope as the explicitly set elements to test that the elements are gettable
+    // and reflect the correct IDs onto the content attribute.
+    innerShadowRoot.appendChild(describedElement);
+    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2]);
+    assert_equals(describedElement.getAttribute("aria-describedby"), "buttonDescription1 buttonDescription2");
+  }, "Moving explicitly set elements across shadow DOM boundaries.");
+  </script>
+
+  <div id="sameScopeContainer">
+    <div id="headingLabel1">Wonderful</div>
+    <div id="headingLabel2">Fantastic</div>
+
+    <div id="headingShadowHost"></div>
+  </div>
+
+    <script>
+    test(function(t) {
+      const shadowRoot = headingShadowHost.attachShadow({mode: "open"});
+      const headingElement = document.createElement("h1");
+      const headingLabel1 = document.getElementById("headingLabel1")
+      const headingLabel2 = document.getElementById("headingLabel2")
+      shadowRoot.appendChild(headingElement);
+
+      // Explicitly set elements are in a lighter shadow DOM, so that's ok.
+      headingElement.ariaLabelledByElements = [headingLabel1, headingLabel2];
+      assert_array_equals(headingElement.ariaLabelledByElements, [headingLabel1, headingLabel2], "Lighter elements are gettable when explicitly set.");
+      assert_equals(headingElement.getAttribute("aria-labelledby"), "", "Crosses shadow DOM boundary, so content attribute should be empty string.");
+
+      // Move into Light DOM, explicitly set elements should still be gettable.
+      // Note that the content attribute still reflects the element ids - when scope changes it becomes stale.
+      sameScopeContainer.appendChild(headingElement);
+      assert_array_equals(headingElement.ariaLabelledByElements, [headingLabel1, headingLabel2], "Elements are all in same scope, so gettable.");
+      assert_equals(headingElement.getAttribute("aria-labelledby"), "", "Content attribute is empty, as on setting the explicitly set elements they were in a different scope.");
+
+      // Reset the association, to update the content attribute.
+      headingElement.ariaLabelledByElements = [headingLabel1, headingLabel2];
+      assert_equals(headingElement.getAttribute("aria-labelledby"), "headingLabel1 headingLabel2", "Elements are set again, so the content attribute is updated.");
+
+      // Remove the referring element from the DOM, elements are not gettable.
+      // This behaviour is still under discussion.
+      headingElement.remove();
+      assert_array_equals(headingElement.ariaLabelledByElements, [], "Element is no longer in the document, so references should not be gettable.");
+      assert_equals(headingElement.getAttribute("aria-labelledby"), "headingLabel1 headingLabel2");
+
+      // Insert it back in.
+      sameScopeContainer.appendChild(headingElement);
+      assert_array_equals(headingElement.ariaLabelledByElements, [headingLabel1, headingLabel2]);
+      assert_equals(headingElement.getAttribute("aria-labelledby"), "headingLabel1 headingLabel2");
+
+      // Remove everything from the DOM, nothing should be gettable.
+      headingLabel1.remove();
+      headingLabel2.remove();
+      assert_array_equals(headingElement.ariaLabelledByElements, []);
+      assert_equals(headingElement.getAttribute("aria-labelledby"), "headingLabel1 headingLabel2");
+      assert_equals(document.getElementById("headingLabel1"), null);
+      assert_equals(document.getElementById("headingLabel2"), null);
+
+      // Reset the association to update the content attribute.
+      headingElement.ariaLabelledByElements = [headingLabel1, headingLabel2];
+      assert_array_equals(headingElement.ariaLabelledByElements, []);
+      assert_equals(headingElement.getAttribute("aria-labelledby"), "");
+    }, "Moving explicitly set elements around within the same scope, and removing from the DOM.");
+    </script>
+
+  <input id="input">
+    <optgroup>
+      <option id="first">First option</option>
+      <option id="second">Second option</option>
+    </optgroup>
+
+  <script>
+    test(function(t) {
+      input.ariaActiveDescendantElement = first;
+      first.parentElement.appendChild(first);
+
+      // This behaviour is currently under discussion by WHATWG.
+      // See: https://github.com/whatwg/html/pull/3917#issuecomment-527263562
+      assert_equals(input.ariaActiveDescendantElement, first);
+    }, "Reparenting.");
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
index ffb7f87..653dcac 100644
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
@@ -144,9 +144,20 @@
       // Find and return the first successful result.
       for (let i = 0; i < results.length; i++) {
         if (results[i].session) {
+          // Construct a dummy metrics recorder
+          let metricsRecorderPtr = new device.mojom.XRSessionMetricsRecorderPtr();
+          let metricsRecorderRequest = mojo.makeRequest(metricsRecorderPtr);
+          let metricsRecorderBinding = new mojo.Binding(
+              device.mojom.XRSessionMetricsRecorder, new MockXRSessionMetricsRecorder(), metricsRecorderRequest);
+
+          let success = {
+            session: results[i].session,
+            metricsRecorder: metricsRecorderPtr,
+          };
+
           return {
             result: {
-              session : results[i].session,
+              success : success,
               $tag :  0
             }
           };
@@ -628,6 +639,12 @@
   };
 }
 
+class MockXRSessionMetricsRecorder {
+  reportFeatureUsed(feature) {
+    // Do nothing
+  }
+}
+
 class MockXRInputSource {
   constructor(fakeInputSourceInit, id, pairedDevice) {
     this.source_id_ = id;
diff --git a/third_party/blink/web_tests/external/wpt/streams/piping/throwing-options.any.js b/third_party/blink/web_tests/external/wpt/streams/piping/throwing-options.any.js
new file mode 100644
index 0000000..6fab32c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/streams/piping/throwing-options.any.js
@@ -0,0 +1,64 @@
+// META: global=worker,jsshell
+
+class ThrowingOptions {
+  constructor(whatShouldThrow) {
+    this.whatShouldThrow = whatShouldThrow;
+    this.touched = [];
+  }
+
+  get preventClose() {
+    this.maybeThrow('preventClose');
+    return false;
+  }
+
+  get preventAbort() {
+    this.maybeThrow('preventAbort');
+    return false;
+  }
+
+  get preventCancel() {
+    this.maybeThrow('preventCancel');
+    return false;
+  }
+
+  get signal() {
+    this.maybeThrow('signal');
+    return undefined;
+  }
+
+  maybeThrow(forWhat) {
+    this.touched.push(forWhat);
+    if (this.whatShouldThrow === forWhat) {
+      throw new Error(this.whatShouldThrow);
+    }
+  }
+}
+
+const checkOrder = ['preventClose', 'preventAbort', 'preventCancel', 'signal'];
+
+for (let i = 0; i < checkOrder.length; ++i) {
+  const whatShouldThrow = checkOrder[i];
+  const whatShouldBeTouched = checkOrder.slice(0, i + 1);
+
+  promise_test(t => {
+    const options = new ThrowingOptions(whatShouldThrow);
+    return promise_rejects(
+               t, new Error(),
+               new ReadableStream().pipeTo(new WritableStream(), options),
+               'pipeTo should reject')
+        .then(() => assert_array_equals(
+            options.touched, whatShouldBeTouched,
+            'options should be touched in the right order'));
+  }, `pipeTo should stop after getting ${whatShouldThrow} throws`);
+
+  test(() => {
+    const options = new ThrowingOptions(whatShouldThrow);
+    assert_throws(
+        new Error(),
+        () => new ReadableStream().pipeThrough(new TransformStream(), options),
+        'pipeThrough should throw');
+    assert_array_equals(
+        options.touched, whatShouldBeTouched,
+        'options should be touched in the right order');
+  }, `pipeThrough should stop after getting ${whatShouldThrow} throws`);
+}
diff --git a/third_party/blink/web_tests/external/wpt/svg/animations/short-simple-duration-and-fractional-repeatcount.html b/third_party/blink/web_tests/external/wpt/svg/animations/short-simple-duration-and-fractional-repeatcount.html
new file mode 100644
index 0000000..025dd509
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/animations/short-simple-duration-and-fractional-repeatcount.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<title>Short simple duration and fractional repeatCount does not hang</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<svg>
+  <rect width="100" height="100" fill="blue">
+    <animate attributeName="fill" from="red" to="orange"
+             begin="-10ms" dur="0.001ms" repeatCount="0.5"/>
+  </rect>
+</svg>
+<script>
+  async_test(t => {
+    onload = t.step_func(() => {
+      requestAnimationFrame(t.step_func(() => {
+        requestAnimationFrame(t.step_func_done(() => {
+          let rect = document.querySelector("rect");
+          assert_equals(getComputedStyle(rect).fill, 'rgb(0, 0, 255)');
+        }));
+      }));
+    });
+  });
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/tools/OWNERS b/third_party/blink/web_tests/external/wpt/tools/OWNERS
index e1a1c69..1cfc2ba5 100644
--- a/third_party/blink/web_tests/external/wpt/tools/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/tools/OWNERS
@@ -2,9 +2,8 @@
 # Almost all changes should be made in the upstream repository at
 # https://github.com/web-platform-tests/wpt and then be imported into the
 # Chromium repo.
-# Team alias: ecosystem-infra@chromium.org
-set noparent
 foolip@chromium.org
 lpz@chromium.org
 robertma@chromium.org
 
+# Team alias: ecosystem-infra@chromium.org
diff --git a/third_party/blink/web_tests/fast/spatial-navigation/snav-disappear-after-hover.html b/third_party/blink/web_tests/fast/spatial-navigation/snav-disappear-after-hover.html
new file mode 100644
index 0000000..9b4ab5a3
--- /dev/null
+++ b/third_party/blink/web_tests/fast/spatial-navigation/snav-disappear-after-hover.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<style>
+  #btn1:hover {
+    visibility: hidden;
+  }
+
+  #btn2:hover {
+    display: none;
+  }
+</style>
+
+<button id="btn0">Button 0</button>
+<button id="btn1">Button 1</button>
+<button id="btn2">Button 2</button>
+
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="resources/snav-testharness.js"></script>
+<script>
+  var resultMap = [
+    ["Right", "btn0"],
+    ["Right", "btn1"],
+    ["Right", "btn2"]
+  ];
+
+  snav.assertFocusMoves(resultMap);
+</script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/publickeycredential-basics.html b/third_party/blink/web_tests/http/tests/credentialmanager/publickeycredential-basics.html
index 165a519c..4a76b66 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/publickeycredential-basics.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/publickeycredential-basics.html
@@ -13,6 +13,7 @@
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
+<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <script>
 
diff --git a/third_party/blink/web_tests/http/tests/images/gif-animated-partial-load-expected.png b/third_party/blink/web_tests/http/tests/images/gif-animated-partial-load-expected.png
index 23d531b..0e8289cc 100644
--- a/third_party/blink/web_tests/http/tests/images/gif-animated-partial-load-expected.png
+++ b/third_party/blink/web_tests/http/tests/images/gif-animated-partial-load-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/mojo/document-interface-broker-override.html b/third_party/blink/web_tests/http/tests/mojo/document-interface-broker-override.html
new file mode 100644
index 0000000..930f4a2
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/mojo/document-interface-broker-override.html
@@ -0,0 +1,43 @@
+<body>
+<script src="/js-test-resources/document-interface-broker-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
+<script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
+<script src="/gen/url/mojom/url.mojom-lite.js"></script>
+<script src="/gen/third_party/blink/public/mojom/frame/frame_host_test_interface.mojom-lite.js"></script>
+<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
+<script>
+'use strict';
+
+promise_test(async t => {
+  // Create a test implementation of FrameHostTestInterface
+  const frameHostTestImpl = new blink.mojom.FrameHostTestInterfaceCallbackRouter;
+  frameHostTestImpl.getName.addListener(() => ({ name: 'TestFrameHostTestImpl' }));
+
+  const broker = new blink.mojom.DocumentInterfaceBrokerRemote(
+      Mojo.getDocumentInterfaceBrokerHandle());
+
+  const testInterfaceBeforeOverride = new blink.mojom.FrameHostTestInterfaceRemote;
+  broker.getFrameHostTestInterface(testInterfaceBeforeOverride.$.bindNewPipeAndPassReceiver());
+
+  setDocumentInterfaceBrokerOverrides({ getFrameHostTestInterface: request => {
+    frameHostTestImpl.$.bindHandle(request.handle);
+  }});
+
+  const testInterfaceAfterOverride = new blink.mojom.FrameHostTestInterfaceRemote;
+  broker.getFrameHostTestInterface(testInterfaceAfterOverride.$.bindNewPipeAndPassReceiver());
+
+  // Verify that RenderFrameHostImpl's implementation gets called without an override
+  let reply = await testInterfaceBeforeOverride.getName();
+  assert_equals(reply.name, 'RenderFrameHostImpl');
+
+  // Verify that the test implementation gets called after the override
+  reply = await testInterfaceAfterOverride.getName();
+  assert_equals(reply.name, 'TestFrameHostTestImpl');
+},
+'Appropriate DocumentInterfaceBroker implementations are called before and after overriding');
+
+</script>
+ </body>
+ </html>
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 12996e81..c1f2a4f 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -834,6 +834,8 @@
     static method createDataPipe
     static method createMessagePipe
     static method createSharedBuffer
+    static method getDocumentInterfaceBrokerHandle
+    static method replaceDocumentInterfaceBrokerForTesting
     attribute @@toStringTag
     attribute RESULT_ABORTED
     attribute RESULT_ALREADY_EXISTS
diff --git a/third_party/blink/web_tests/resources/document-interface-broker-helpers.js b/third_party/blink/web_tests/resources/document-interface-broker-helpers.js
new file mode 100644
index 0000000..6cc6e88
--- /dev/null
+++ b/third_party/blink/web_tests/resources/document-interface-broker-helpers.js
@@ -0,0 +1,30 @@
+'use strict';
+
+/**
+ * Allows to override specific interface request handlers for
+ * DocumentInterfaceBroker for testing purposes
+ * @param {Object} overrides an object where the keys are names of
+ *     DocumentInterfaceBroker's methods and the values are corresponding handler
+ *     functions taking a request parameter and binding its handle to the relevant
+ *     testing implementation.
+ * Example:
+ *   const testFooImpl = new FooInterfaceCallbackRouter;
+ *   ... override FooInterface methods ...
+ *   setDocumentInterfaceBrokerOverrides({getFooInterface: request => {
+ *     testFooImpl.$.bindHandle(request.handle);
+ *   }});
+ */
+function setDocumentInterfaceBrokerOverrides(overrides) {
+  const {handle0, handle1} = Mojo.createMessagePipe();
+  const realBrokerRemote = new blink.mojom.DocumentInterfaceBrokerRemote(
+      Mojo.replaceDocumentInterfaceBrokerForTesting(handle0));
+
+  for (const method of Object.keys(overrides)) {
+    realBrokerRemote[method] = overrides[method];
+  }
+
+  // Use the real broker (with overrides) as the implementation of the JS-side broker
+  const testBrokerReceiver =
+    new blink.mojom.DocumentInterfaceBrokerReceiver(realBrokerRemote);
+  testBrokerReceiver.$.bindHandle(handle1);
+}
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 37974b2..f826dfe2 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -806,6 +806,8 @@
 [Worker]     static method createDataPipe
 [Worker]     static method createMessagePipe
 [Worker]     static method createSharedBuffer
+[Worker]     static method getDocumentInterfaceBrokerHandle
+[Worker]     static method replaceDocumentInterfaceBrokerForTesting
 [Worker]     attribute @@toStringTag
 [Worker]     attribute RESULT_ABORTED
 [Worker]     attribute RESULT_ALREADY_EXISTS
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 b1d280a4..531b4df 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
@@ -4987,6 +4987,8 @@
     static method createDataPipe
     static method createMessagePipe
     static method createSharedBuffer
+    static method getDocumentInterfaceBrokerHandle
+    static method replaceDocumentInterfaceBrokerForTesting
     attribute @@toStringTag
     attribute RESULT_ABORTED
     attribute RESULT_ALREADY_EXISTS
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index f9e3191..1e2f3bc5 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -788,6 +788,8 @@
 [Worker]     static method createDataPipe
 [Worker]     static method createMessagePipe
 [Worker]     static method createSharedBuffer
+[Worker]     static method getDocumentInterfaceBrokerHandle
+[Worker]     static method replaceDocumentInterfaceBrokerForTesting
 [Worker]     attribute @@toStringTag
 [Worker]     attribute RESULT_ABORTED
 [Worker]     attribute RESULT_ALREADY_EXISTS
diff --git a/third_party/breakpad/BUILD.gn b/third_party/breakpad/BUILD.gn
index 225a6bae..5c87c790fe 100644
--- a/third_party/breakpad/BUILD.gn
+++ b/third_party/breakpad/BUILD.gn
@@ -1048,6 +1048,10 @@
     ]
 
     deps = [
+      # Breakpad includes its own copy of GTMLogger (in the file
+      # breakpad/src/common/mac/GTMLogger.m). As Chromium links
+      # to both on iOS, do not use the copy shipped with breakpad
+      # but instead use the version from google_toolbox_for_mac.
       "//third_party/google_toolbox_for_mac",
     ]
 
diff --git a/third_party/chaijs/README.chromium b/third_party/chaijs/README.chromium
index 06eaf936..003b132 100644
--- a/third_party/chaijs/README.chromium
+++ b/third_party/chaijs/README.chromium
@@ -1,9 +1,9 @@
 Name: Chai Assertion Library
 Short Name: chai
 URL: https://github.com/chaijs/chai
-Version: 3.4.1
-Revision: 12bfdd17648e2b3e11d64e5b926007a6d84bfbe8
-Date: Mon Nov 23 17:06:02 2015 +0000
+Version: 3.5.0
+Revision: 4ca0218391cf947c6cfac2d1a7424a63a4b4c232
+Date: Thu Jan 28 11:54:31 2016 +0000
 License: MIT
 License File: NOT_SHIPPED
 Security Critical: no
@@ -13,4 +13,8 @@
 paired with any testing framework.
 
 Local Modifications:
-Copied license text out of README.md.
+ - Copied license text out of README.md.
+ - Externs file from
+https://github.com/google/closure-compiler/tree/master/contrib/externs
+ - Add mising assert.notStrictEqual
+ - Add missing export of chai.expect
diff --git a/third_party/chaijs/chai.js b/third_party/chaijs/chai.js
index 431fea3..1d30296 100644
--- a/third_party/chaijs/chai.js
+++ b/third_party/chaijs/chai.js
@@ -15,7 +15,7 @@
  * Chai version
  */
 
-exports.version = '3.4.1';
+exports.version = '3.5.0';
 
 /*!
  * Assertion Error
@@ -324,6 +324,7 @@
    * - same
    *
    * @name language chains
+   * @namespace BDD
    * @api public
    */
 
@@ -347,6 +348,7 @@
    *       .and.not.equal('bar');
    *
    * @name not
+   * @namespace BDD
    * @api public
    */
 
@@ -371,6 +373,7 @@
    *     expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42);
    *
    * @name deep
+   * @namespace BDD
    * @api public
    */
 
@@ -387,6 +390,7 @@
    *     expect(foo).to.have.any.keys('bar', 'baz');
    *
    * @name any
+   * @namespace BDD
    * @api public
    */
 
@@ -405,6 +409,7 @@
    *     expect(foo).to.have.all.keys('bar', 'baz');
    *
    * @name all
+   * @namespace BDD
    * @api public
    */
 
@@ -440,6 +445,7 @@
    * @alias an
    * @param {String} type
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -477,6 +483,7 @@
    * @alias contains
    * @param {Object|String|Number} obj
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -532,6 +539,7 @@
    *     expect(null).to.not.be.ok;
    *
    * @name ok
+   * @namespace BDD
    * @api public
    */
 
@@ -551,6 +559,7 @@
    *     expect(1).to.not.be.true;
    *
    * @name true
+   * @namespace BDD
    * @api public
    */
 
@@ -572,6 +581,7 @@
    *     expect(0).to.not.be.false;
    *
    * @name false
+   * @namespace BDD
    * @api public
    */
 
@@ -593,6 +603,7 @@
    *     expect(undefined).to.not.be.null;
    *
    * @name null
+   * @namespace BDD
    * @api public
    */
 
@@ -613,6 +624,7 @@
    *     expect(null).to.not.be.undefined;
    *
    * @name undefined
+   * @namespace BDD
    * @api public
    */
 
@@ -632,6 +644,7 @@
    *     expect(4).not.to.be.NaN;
    *
    * @name NaN
+   * @namespace BDD
    * @api public
    */
 
@@ -657,6 +670,7 @@
    *     expect(baz).to.not.exist;
    *
    * @name exist
+   * @namespace BDD
    * @api public
    */
 
@@ -681,6 +695,7 @@
    *     expect({}).to.be.empty;
    *
    * @name empty
+   * @namespace BDD
    * @api public
    */
 
@@ -712,6 +727,7 @@
    *
    * @name arguments
    * @alias Arguments
+   * @namespace BDD
    * @api public
    */
 
@@ -747,6 +763,7 @@
    * @alias deep.equal
    * @param {Mixed} value
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -783,6 +800,7 @@
    * @alias eqls
    * @param {Mixed} value
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -821,6 +839,7 @@
    * @alias greaterThan
    * @param {Number} value
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -869,6 +888,7 @@
    * @alias gte
    * @param {Number} value
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -917,6 +937,7 @@
    * @alias lessThan
    * @param {Number} value
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -965,6 +986,7 @@
    * @alias lte
    * @param {Number} value
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1012,6 +1034,7 @@
    * @param {Number} start lowerbound inclusive
    * @param {Number} finish upperbound inclusive
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1051,6 +1074,7 @@
    * @param {Constructor} constructor
    * @param {String} message _optional_
    * @alias instanceOf
+   * @namespace BDD
    * @api public
    */
 
@@ -1135,6 +1159,7 @@
    * @param {Mixed} value (optional)
    * @param {String} message _optional_
    * @returns value of property for chaining
+   * @namespace BDD
    * @api public
    */
 
@@ -1190,6 +1215,7 @@
    * @alias haveOwnProperty
    * @param {String} name
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1222,6 +1248,7 @@
    * @param {String} name
    * @param {Object} descriptor _optional_
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1274,6 +1301,7 @@
    * switched to use `lengthOf(value)` instead.
    *
    * @name length
+   * @namespace BDD
    * @api public
    */
 
@@ -1289,6 +1317,7 @@
    * @name lengthOf
    * @param {Number} length
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1325,6 +1354,7 @@
    * @alias matches
    * @param {RegExp} RegularExpression
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
   function assertMatch(re, msg) {
@@ -1350,6 +1380,7 @@
    * @name string
    * @param {String} string
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1401,6 +1432,7 @@
    * @name keys
    * @alias key
    * @param {...String|Array|Object} keys
+   * @namespace BDD
    * @api public
    */
 
@@ -1520,6 +1552,7 @@
    * @param {String} message _optional_
    * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
    * @returns error for chaining (null if no error)
+   * @namespace BDD
    * @api public
    */
 
@@ -1663,6 +1696,7 @@
    * @alias respondsTo
    * @param {String} method
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1697,6 +1731,7 @@
    *     expect(Foo).itself.not.to.respondTo('baz');
    *
    * @name itself
+   * @namespace BDD
    * @api public
    */
 
@@ -1715,6 +1750,7 @@
    * @alias satisfies
    * @param {Function} matcher
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1746,6 +1782,7 @@
    * @param {Number} expected
    * @param {Number} delta
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1797,6 +1834,7 @@
    * @name members
    * @param {Array} set
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1846,6 +1884,7 @@
    * @name oneOf
    * @param {Array<*>} list
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1875,7 +1914,7 @@
    *     var fn = function() { obj.val += 3 };
    *     var noChangeFn = function() { return 'foo' + 'bar'; }
    *     expect(fn).to.change(obj, 'val');
-   *     expect(noChangFn).to.not.change(obj, 'val')
+   *     expect(noChangeFn).to.not.change(obj, 'val')
    *
    * @name change
    * @alias changes
@@ -1883,6 +1922,7 @@
    * @param {String} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1920,6 +1960,7 @@
    * @param {String} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1957,6 +1998,7 @@
    * @param {String} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace BDD
    * @api public
    */
 
@@ -1995,6 +2037,7 @@
    *     expect(frozenObject).to.not.be.extensible;
    *
    * @name extensible
+   * @namespace BDD
    * @api public
    */
 
@@ -2036,6 +2079,7 @@
    *     expect({}).to.not.be.sealed;
    *
    * @name sealed
+   * @namespace BDD
    * @api public
    */
 
@@ -2075,6 +2119,7 @@
    *     expect({}).to.not.be.frozen;
    *
    * @name frozen
+   * @namespace BDD
    * @api public
    */
 
@@ -2135,6 +2180,7 @@
    * @param {Mixed} expression to test for truthiness
    * @param {String} message to display on error
    * @name assert
+   * @namespace Assert
    * @api public
    */
 
@@ -2157,6 +2203,7 @@
    * @param {Mixed} expected
    * @param {String} message
    * @param {String} operator
+   * @namespace Assert
    * @api public
    */
 
@@ -2181,6 +2228,7 @@
    * @alias ok
    * @param {Mixed} object to test
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2200,6 +2248,7 @@
    * @alias notOk
    * @param {Mixed} object to test
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2218,6 +2267,7 @@
    * @param {Mixed} actual
    * @param {Mixed} expected
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2244,6 +2294,7 @@
    * @param {Mixed} actual
    * @param {Mixed} expected
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2270,6 +2321,7 @@
    * @param {Mixed} actual
    * @param {Mixed} expected
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2288,6 +2340,7 @@
    * @param {Mixed} actual
    * @param {Mixed} expected
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2306,6 +2359,7 @@
    * @param {Mixed} actual
    * @param {Mixed} expected
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2324,6 +2378,7 @@
    * @param {Mixed} actual
    * @param {Mixed} expected
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2342,6 +2397,7 @@
    * @param {Mixed} valueToCheck
    * @param {Mixed} valueToBeAbove
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2361,6 +2417,7 @@
    * @param {Mixed} valueToCheck
    * @param {Mixed} valueToBeAtLeast
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2379,6 +2436,7 @@
    * @param {Mixed} valueToCheck
    * @param {Mixed} valueToBeBelow
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2398,6 +2456,7 @@
    * @param {Mixed} valueToCheck
    * @param {Mixed} valueToBeAtMost
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2416,6 +2475,7 @@
    * @name isTrue
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2434,6 +2494,7 @@
    * @name isNotTrue
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2452,6 +2513,7 @@
    * @name isFalse
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2470,6 +2532,7 @@
    * @name isNotFalse
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2487,6 +2550,7 @@
    * @name isNull
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2505,6 +2569,7 @@
    * @name isNotNull
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2521,6 +2586,7 @@
    * @name isNaN
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2537,6 +2603,7 @@
    * @name isNotNaN
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
   assert.isNotNaN = function (val, msg) {
@@ -2554,6 +2621,7 @@
    * @name isUndefined
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2572,6 +2640,7 @@
    * @name isDefined
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2590,6 +2659,7 @@
    * @name isFunction
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2608,6 +2678,7 @@
    * @name isNotFunction
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2618,8 +2689,8 @@
   /**
    * ### .isObject(value, [message])
    *
-   * Asserts that `value` is an object (as revealed by
-   * `Object.prototype.toString`).
+   * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`).
+   * _The assertion does not match subclassed objects._
    *
    *     var selection = { name: 'Chai', serve: 'with spices' };
    *     assert.isObject(selection, 'tea selection is an object');
@@ -2627,6 +2698,7 @@
    * @name isObject
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2637,7 +2709,7 @@
   /**
    * ### .isNotObject(value, [message])
    *
-   * Asserts that `value` is _not_ an object.
+   * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`).
    *
    *     var selection = 'chai'
    *     assert.isNotObject(selection, 'tea selection is not an object');
@@ -2646,6 +2718,7 @@
    * @name isNotObject
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2664,6 +2737,7 @@
    * @name isArray
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2682,6 +2756,7 @@
    * @name isNotArray
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2700,6 +2775,7 @@
    * @name isString
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2718,6 +2794,7 @@
    * @name isNotString
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2736,6 +2813,7 @@
    * @name isNumber
    * @param {Number} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2754,6 +2832,7 @@
    * @name isNotNumber
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2775,6 +2854,7 @@
    * @name isBoolean
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2796,6 +2876,7 @@
    * @name isNotBoolean
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2820,6 +2901,7 @@
    * @param {Mixed} value
    * @param {String} name
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2839,6 +2921,7 @@
    * @param {Mixed} value
    * @param {String} typeof name
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2860,6 +2943,7 @@
    * @param {Object} object
    * @param {Constructor} constructor
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2881,6 +2965,7 @@
    * @param {Object} object
    * @param {Constructor} constructor
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2901,6 +2986,7 @@
    * @param {Array|String} haystack
    * @param {Mixed} needle
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2921,6 +3007,7 @@
    * @param {Array|String} haystack
    * @param {Mixed} needle
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2939,6 +3026,7 @@
    * @param {Mixed} value
    * @param {RegExp} regexp
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2957,6 +3045,7 @@
    * @param {Mixed} value
    * @param {RegExp} regexp
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2975,6 +3064,7 @@
    * @param {Object} object
    * @param {String} property
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -2993,6 +3083,7 @@
    * @param {Object} object
    * @param {String} property
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3012,6 +3103,7 @@
    * @param {Object} object
    * @param {String} property
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3031,6 +3123,7 @@
    * @param {Object} object
    * @param {String} property
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3051,6 +3144,7 @@
    * @param {String} property
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3071,6 +3165,7 @@
    * @param {String} property
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3092,6 +3187,7 @@
    * @param {String} property
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3113,6 +3209,7 @@
    * @param {String} property
    * @param {Mixed} value
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3132,6 +3229,7 @@
    * @param {Mixed} object
    * @param {Number} length
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3160,6 +3258,7 @@
    * @param {RegExp} regexp
    * @param {String} message
    * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+   * @namespace Assert
    * @api public
    */
 
@@ -3188,6 +3287,7 @@
    * @param {RegExp} regexp
    * @param {String} message
    * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+   * @namespace Assert
    * @api public
    */
 
@@ -3213,6 +3313,7 @@
    * @param {String} operator
    * @param {Mixed} val2
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3265,6 +3366,7 @@
    * @param {Number} expected
    * @param {Number} delta
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3284,6 +3386,7 @@
    * @param {Number} expected
    * @param {Number} delta
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3303,6 +3406,7 @@
    * @param {Array} set1
    * @param {Array} set2
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3322,6 +3426,7 @@
    * @param {Array} set1
    * @param {Array} set2
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3341,6 +3446,7 @@
    * @param {Array} superset
    * @param {Array} subset
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3349,6 +3455,27 @@
   }
 
   /**
+   * ### .includeDeepMembers(superset, subset, [message])
+   *
+   * Asserts that `subset` is included in `superset` - using deep equality checking.
+   * Order is not taken into account.
+   * Duplicates are ignored.
+   *
+   *     assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1}, {b: 2} ], 'include deep members');
+   *
+   * @name includeDeepMembers
+   * @param {Array} superset
+   * @param {Array} subset
+   * @param {String} message
+   * @namespace Assert
+   * @api public
+   */
+
+  assert.includeDeepMembers = function (superset, subset, msg) {
+    new Assertion(superset, msg).to.include.deep.members(subset);
+  }
+
+  /**
    * ### .oneOf(inList, list, [message])
    *
    * Asserts that non-object, non-array value `inList` appears in the flat array `list`.
@@ -3359,6 +3486,7 @@
    * @param {*} inList
    * @param {Array<*>} list
    * @param {String} message
+   * @namespace Assert
    * @api public
    */
 
@@ -3380,6 +3508,7 @@
    * @param {Object} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3401,6 +3530,7 @@
    * @param {Object} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3422,6 +3552,7 @@
    * @param {Object} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3443,6 +3574,7 @@
    * @param {Object} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3464,6 +3596,7 @@
    * @param {Object} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3485,6 +3618,7 @@
    * @param {Object} object
    * @param {String} property name
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3504,6 +3638,7 @@
    *
    * @name ifError
    * @param {Object} object
+   * @namespace Assert
    * @api public
    */
 
@@ -3524,6 +3659,7 @@
    * @alias extensible
    * @param {Object} object
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3548,6 +3684,7 @@
    * @alias notExtensible
    * @param {Object} object
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3571,6 +3708,7 @@
    * @alias sealed
    * @param {Object} object
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3589,6 +3727,7 @@
    * @alias notSealed
    * @param {Object} object
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3609,6 +3748,7 @@
    * @alias frozen
    * @param {Object} object
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3627,6 +3767,7 @@
    * @alias notFrozen
    * @param {Object} object
    * @param {String} message _optional_
+   * @namespace Assert
    * @api public
    */
 
@@ -3676,6 +3817,7 @@
    * @param {Mixed} expected
    * @param {String} message
    * @param {String} operator
+   * @namespace Expect
    * @api public
    */
 
@@ -3740,6 +3882,7 @@
      * @param {Mixed} expected
      * @param {String} message
      * @param {String} operator
+     * @namespace Should
      * @api public
      */
 
@@ -3752,14 +3895,67 @@
       }, should.fail);
     };
 
+    /**
+     * ### .equal(actual, expected, [message])
+     *
+     * Asserts non-strict equality (`==`) of `actual` and `expected`.
+     *
+     *     should.equal(3, '3', '== coerces values to strings');
+     *
+     * @name equal
+     * @param {Mixed} actual
+     * @param {Mixed} expected
+     * @param {String} message
+     * @namespace Should
+     * @api public
+     */
+
     should.equal = function (val1, val2, msg) {
       new Assertion(val1, msg).to.equal(val2);
     };
 
+    /**
+     * ### .throw(function, [constructor/string/regexp], [string/regexp], [message])
+     *
+     * Asserts that `function` will throw an error that is an instance of
+     * `constructor`, or alternately that it will throw an error with message
+     * matching `regexp`.
+     *
+     *     should.throw(fn, 'function throws a reference error');
+     *     should.throw(fn, /function throws a reference error/);
+     *     should.throw(fn, ReferenceError);
+     *     should.throw(fn, ReferenceError, 'function throws a reference error');
+     *     should.throw(fn, ReferenceError, /function throws a reference error/);
+     *
+     * @name throw
+     * @alias Throw
+     * @param {Function} function
+     * @param {ErrorConstructor} constructor
+     * @param {RegExp} regexp
+     * @param {String} message
+     * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+     * @namespace Should
+     * @api public
+     */
+
     should.Throw = function (fn, errt, errs, msg) {
       new Assertion(fn, msg).to.Throw(errt, errs);
     };
 
+    /**
+     * ### .exist
+     *
+     * Asserts that the target is neither `null` nor `undefined`.
+     *
+     *     var foo = 'hi';
+     *
+     *     should.exist(foo, 'foo exists');
+     *
+     * @name exist
+     * @namespace Should
+     * @api public
+     */
+
     should.exist = function (val, msg) {
       new Assertion(val, msg).to.exist;
     }
@@ -3767,14 +3963,63 @@
     // negation
     should.not = {}
 
+    /**
+     * ### .not.equal(actual, expected, [message])
+     *
+     * Asserts non-strict inequality (`!=`) of `actual` and `expected`.
+     *
+     *     should.not.equal(3, 4, 'these numbers are not equal');
+     *
+     * @name not.equal
+     * @param {Mixed} actual
+     * @param {Mixed} expected
+     * @param {String} message
+     * @namespace Should
+     * @api public
+     */
+
     should.not.equal = function (val1, val2, msg) {
       new Assertion(val1, msg).to.not.equal(val2);
     };
 
+    /**
+     * ### .throw(function, [constructor/regexp], [message])
+     *
+     * Asserts that `function` will _not_ throw an error that is an instance of
+     * `constructor`, or alternately that it will not throw an error with message
+     * matching `regexp`.
+     *
+     *     should.not.throw(fn, Error, 'function does not throw');
+     *
+     * @name not.throw
+     * @alias not.Throw
+     * @param {Function} function
+     * @param {ErrorConstructor} constructor
+     * @param {RegExp} regexp
+     * @param {String} message
+     * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+     * @namespace Should
+     * @api public
+     */
+
     should.not.Throw = function (fn, errt, errs, msg) {
       new Assertion(fn, msg).to.not.Throw(errt, errs);
     };
 
+    /**
+     * ### .not.exist
+     *
+     * Asserts that the target is neither `null` nor `undefined`.
+     *
+     *     var bar = null;
+     *
+     *     should.not.exist(bar, 'bar does not exist');
+     *
+     * @name not.exist
+     * @namespace Should
+     * @api public
+     */
+
     should.not.exist = function (val, msg) {
       new Assertion(val, msg).to.not.exist;
     }
@@ -3844,6 +4089,7 @@
  * @param {String} name of method to add
  * @param {Function} method function to be used for `name`, when called
  * @param {Function} chainingBehavior function to be called every time the property is accessed
+ * @namespace Utils
  * @name addChainableMethod
  * @api public
  */
@@ -3932,6 +4178,7 @@
  * @param {Object} ctx object to which the method is added
  * @param {String} name of method to add
  * @param {Function} method function to be used for name
+ * @namespace Utils
  * @name addMethod
  * @api public
  */
@@ -3978,6 +4225,7 @@
  * @param {Object} ctx object to which the property is added
  * @param {String} name of property to add
  * @param {Function} getter function to be used for name
+ * @namespace Utils
  * @name addProperty
  * @api public
  */
@@ -4012,6 +4260,7 @@
  *
  * @param {Mixed} obj constructed Assertion
  * @param {Array} type A list of allowed types for this assertion
+ * @namespace Utils
  * @name expectTypes
  * @api public
  */
@@ -4060,6 +4309,7 @@
  * @param {Object} object constructed Assertion
  * @param {String} key
  * @param {Mixed} value (optional)
+ * @namespace Utils
  * @name flag
  * @api private
  */
@@ -4087,6 +4337,8 @@
  *
  * @param {Object} object (constructed Assertion)
  * @param {Arguments} chai.Assertion.prototype.assert arguments
+ * @namespace Utils
+ * @name getActual
  */
 
 module.exports = function (obj, args) {
@@ -4108,6 +4360,7 @@
  *
  * @param {Object} object
  * @returns {Array}
+ * @namespace Utils
  * @name getEnumerableProperties
  * @api public
  */
@@ -4150,6 +4403,7 @@
  *
  * @param {Object} object (constructed Assertion)
  * @param {Arguments} chai.Assertion.prototype.assert arguments
+ * @namespace Utils
  * @name getMessage
  * @api public
  */
@@ -4165,9 +4419,9 @@
   if(typeof msg === "function") msg = msg();
   msg = msg || '';
   msg = msg
-    .replace(/#{this}/g, objDisplay(val))
-    .replace(/#{act}/g, objDisplay(actual))
-    .replace(/#{exp}/g, objDisplay(expected));
+    .replace(/#\{this\}/g, function () { return objDisplay(val); })
+    .replace(/#\{act\}/g, function () { return objDisplay(actual); })
+    .replace(/#\{exp\}/g, function () { return objDisplay(expected); });
 
   return flagMsg ? flagMsg + ': ' + msg : msg;
 };
@@ -4185,6 +4439,8 @@
  * Gets the name of a function, in a cross-browser way.
  *
  * @param {Function} a function (usually a constructor)
+ * @namespace Utils
+ * @name getName
  */
 
 module.exports = function (func) {
@@ -4220,6 +4476,7 @@
  * @param {String} path
  * @param {Object} object
  * @returns {Object} info
+ * @namespace Utils
  * @name getPathInfo
  * @api public
  */
@@ -4342,13 +4599,14 @@
  * @param {String} path
  * @param {Object} object
  * @returns {Object} value or `undefined`
+ * @namespace Utils
  * @name getPathValue
  * @api public
  */
 module.exports = function(path, obj) {
   var info = getPathInfo(path, obj);
   return info.value;
-}; 
+};
 
 },{"./getPathInfo":18}],20:[function(require,module,exports){
 /*!
@@ -4365,6 +4623,7 @@
  *
  * @param {Object} object
  * @returns {Array}
+ * @namespace Utils
  * @name getProperties
  * @api public
  */
@@ -4416,7 +4675,7 @@
  *     hasProperty('str', obj);  // true
  *     hasProperty('constructor', obj);  // true
  *     hasProperty('bar', obj);  // false
- *     
+ *
  *     hasProperty('length', obj.str); // true
  *     hasProperty(1, obj.str);  // true
  *     hasProperty(5, obj.str);  // false
@@ -4428,6 +4687,7 @@
  * @param {Objuect} object
  * @param {String|Number} name
  * @returns {Boolean} whether it exists
+ * @namespace Utils
  * @name getPathInfo
  * @api public
  */
@@ -4604,6 +4864,8 @@
  * @param {Number} depth Depth in which to descend in object. Default is 2.
  * @param {Boolean} colors Flag to turn on ANSI escape codes to color the
  *    output. Default is false (no coloring).
+ * @namespace Utils
+ * @name inspect
  */
 function inspect(obj, showHidden, depth, colors) {
   var ctx = {
@@ -4942,6 +5204,7 @@
  *
  * @param {Mixed} javascript object to inspect
  * @name objDisplay
+ * @namespace Utils
  * @api public
  */
 
@@ -5005,6 +5268,7 @@
  * @param {String} name of method / property to overwrite
  * @param {Function} method function that returns a function to be used for name
  * @param {Function} chainingBehavior function that returns a function to be used for property
+ * @namespace Utils
  * @name overwriteChainableMethod
  * @api public
  */
@@ -5061,6 +5325,7 @@
  * @param {Object} ctx object whose method is to be overwritten
  * @param {String} name of method to overwrite
  * @param {Function} method function that returns a function to be used for name
+ * @namespace Utils
  * @name overwriteMethod
  * @api public
  */
@@ -5114,6 +5379,7 @@
  * @param {Object} ctx object whose property is to be overwritten
  * @param {String} name of property to overwrite
  * @param {Function} getter function that returns a getter function to be used for name
+ * @namespace Utils
  * @name overwriteProperty
  * @api public
  */
@@ -5154,6 +5420,8 @@
  *
  * @param {Object} object (constructed Assertion)
  * @param {Arguments} chai.Assertion.prototype.assert arguments
+ * @namespace Utils
+ * @name test
  */
 
 module.exports = function (obj, args) {
@@ -5187,6 +5455,7 @@
  * @param {Assertion} assertion the assertion to transfer the flags from
  * @param {Object} object the object to transfer the flags to; usually a new assertion
  * @param {Boolean} includeAll
+ * @namespace Utils
  * @name transferFlags
  * @api private
  */
diff --git a/third_party/chaijs/externs/chai-3.5.js b/third_party/chaijs/externs/chai-3.5.js
new file mode 100644
index 0000000..8cc1a83
--- /dev/null
+++ b/third_party/chaijs/externs/chai-3.5.js
@@ -0,0 +1,556 @@
+/*
+ * Copyright 2016 The Closure Compiler Authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview Externs definitions for Chai, 3.5 branch.
+ *
+ * This file defines both the BDD and TDD APIs. The BDD API should be complete.
+ *
+ * This file defines some virtual types for the chained methods, please don't
+ * use these types directly, but follow the official API guidelines.
+ *
+ * @externs
+ * @see http://chaijs.com/
+ */
+
+/** @const */
+var chai = {};
+
+/**
+ * @constructor
+ * @param {*} obj
+ * @param {string=} msg
+ * @param {!Function=} ssfi
+ * @param {boolean=} lockSsfi
+ */
+chai.Assertion = function(obj, msg, ssfi, lockSsfi) {};
+
+// Below are the externs for the BDD expect API: http://chaijs.com/api/bdd/
+
+/**
+ * @param {*} subject
+ * @param {string=} opt_description
+ * @return {!chai.Assertion}
+ */
+var expect = function(subject, opt_description) {};
+
+
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.to;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.be;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.been;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.is;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.that;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.which;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.and;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.has;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.have;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.with;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.at;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.of;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.same;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.not;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.deep;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.any;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.all;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.length;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.itself;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.ok;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.true;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.false;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.null;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.undefined;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.NaN;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.exist;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.empty;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.arguments;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.extensible;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.sealed;
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.frozen;
+
+
+/**
+ * @param {string} type
+ * @param {string=} opt_message
+ * @return {!chai.Assertion}
+ */
+chai.Assertion.prototype.a = function(type, opt_message) {};
+
+/**
+ * @param {string} type
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.an = function(type, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.include = function(value, opt_message) {};
+
+/** @type {!chai.Assertion} */ chai.Assertion.prototype.include.all;
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.includes = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.contain = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.contains = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.equal = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.eql = function(value, opt_message) {};
+
+/**
+ * @param {number} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.above = function(value, opt_message) {};
+
+/**
+ * @param {number} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.least = function(value, opt_message) {};
+
+/**
+ * @param {number} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.below = function(value, opt_message) {};
+
+/**
+ * @param {number} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.most = function(value, opt_message) {};
+
+/**
+ * @param {number} start
+ * @param {number} finish
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.within = function(start, finish, opt_message) {};
+
+/**
+ * @param {function(new: Object)} constructor
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.instanceof = function(constructor, opt_message) {};
+
+/**
+ * @param {function(new: Object)} constructor
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.an.instanceof = function(constructor, opt_message) {};
+
+/**
+ * @param {string} name
+ * @param {*=} opt_value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.property = function(name, opt_value, opt_message) {};
+
+/**
+ * @param {string} name
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.ownProperty = function(name, opt_message) {};
+
+/**
+ * @param {string} name
+ * @param {!Object=} opt_descriptor
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.ownPropertyDescriptor = function(
+    name, opt_descriptor, opt_message) {};
+
+/**
+ * @param {number} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.lengthOf = function(value, opt_message) {};
+
+/**
+ * @param {!RegExp} re
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.match = function(re, opt_message) {};
+
+/**
+ * @param {string} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.string = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.keys = function(value, opt_message) {};
+
+/**
+ * Note: incomplete definition because it is tricky.
+ * @param {...*} var_args
+ */
+chai.Assertion.prototype.throw = function(var_args) {};
+
+/**
+ * @param {string} method
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.respondTo = function(method, opt_message) {};
+
+/**
+ * @param {function(*): boolean} matcher
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.satisfy = function(matcher, opt_message) {};
+
+/**
+ * @param {!Array<*>} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.members = function(value, opt_message) {};
+
+/**
+ * @param {!Array<*>} value
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.oneOf = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string} name
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.change = function(value, name, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string} name
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.increase = function(value, name, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string} name
+ * @param {string=} opt_message
+ */
+chai.Assertion.prototype.decrease = function(value, name, opt_message) {};
+
+// Below are the externs for the TDD expect API: http://chaijs.com/api/assert/
+
+/** @const */
+var assert = {};
+
+/**
+ * @param {*} actual
+ * @param {*} expected
+ * @param {string=} opt_message
+ * @param {string=} opt_operator
+ */
+assert.fail = function(actual, expected, opt_message, opt_operator) {};
+
+/**
+ * @param {*} object
+ * @param {string=} opt_message
+ */
+assert.isOk = function(object, opt_message) {};
+
+/**
+ * @param {*} object
+ * @param {string=} opt_message
+ */
+assert.isNotOk = function(object, opt_message) {};
+
+/**
+ * @param {*} actual
+ * @param {*} expected
+ * @param {string=} opt_message
+ */
+assert.equal = function(actual, expected, opt_message) {};
+
+/**
+ * @param {*} actual
+ * @param {*} expected
+ * @param {string=} opt_message
+ */
+assert.strictEqual = function(actual, expected, opt_message) {};
+
+/**
+ * @param {*} actual
+ * @param {*} expected
+ * @param {string=} opt_message
+ */
+assert.notStrictEqual = function(actual, expected, opt_message) {};
+
+/**
+ * @param {*} actual
+ * @param {*} expected
+ * @param {string=} opt_message
+ */
+assert.notEqual = function(actual, expected, opt_message) {};
+
+/**
+ * @param {*} actual
+ * @param {*} expected
+ * @param {string=} opt_message
+ */
+assert.deepEqual = function(actual, expected, opt_message) {};
+
+/**
+ * @param {*} actual
+ * @param {*} expected
+ * @param {string=} opt_message
+ */
+assert.notDeepEqual = function(actual, expected, opt_message) {};
+
+/**
+ * @param {*} valueToCheck
+ * @param {*} valueToBeAbove
+ * @param {string=} opt_message
+ */
+assert.isAbove = function(valueToCheck, valueToBeAbove, opt_message) {};
+
+/**
+ * @param {*} valueToCheck
+ * @param {*} valueToBeBelow
+ * @param {string=} opt_message
+ */
+assert.isBelow = function(valueToCheck, valueToBeBelow, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isTrue = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isNotTrue = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isFalse = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isNotFalse = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isNaN = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isUndefined = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isDefined = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isFunction = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isNotFunction = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} message
+ */
+assert.isNotNull = function(value, message) {}
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.isNull = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.exists = function(value, opt_message) {};
+
+/**
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.notExists = function(value, opt_message) {};
+
+/**
+ * @param {*} object
+ * @param {function(new: Object)} constructor
+ * @param {string=} opt_message
+ */
+assert.instanceOf = function(object, constructor, opt_message) {};
+
+/**
+ * @param {!Array<*>|string} haystack
+ * @param {*} needle
+ * @param {string=} opt_message
+ */
+assert.include = function(haystack, needle, opt_message) {};
+
+/**
+ * @param {!Array<*>|string} haystack
+ * @param {*} needle
+ * @param {string=} opt_message
+ */
+assert.notInclude = function(haystack, needle, opt_message) {};
+
+/**
+ * @param {*} needle
+ * @param {!Array<*>} haystack
+ * @param {string=} opt_message
+ */
+assert.oneOf = function(needle, haystack, opt_message) {};
+
+/**
+ * @param {*} collection
+ * @param {number} length
+ * @param {string=} message
+ */
+assert.lengthOf = function(collection, length, message) {};
+
+/**
+ * @param {*} object
+ * @param {!RegExp} re
+ * @param {string=} opt_message
+ */
+assert.match = function(object, re, opt_message) {};
+
+/**
+ * @param {?Object|undefined} object
+ * @param {string} property
+ * @param {*} value
+ * @param {string=} opt_message
+ */
+assert.propertyVal = function(object, property, value, opt_message) {};
+
+/**
+ * @param {function()} fn
+ * @param {function(new: Object)|string|!RegExp} constructor
+ * @param {string|!RegExp=} opt_regexp
+ * @param {string=} opt_message
+ */
+assert.throws = function(fn, constructor, opt_regexp, opt_message) {};
+
+/**
+ * @param {function()} fn
+ * @param {function(new: Object)|string|!RegExp} constructor
+ * @param {string|!RegExp=} opt_regexp
+ * @param {string=} opt_message
+ */
+assert.doesNotThrow = function(fn, constructor, opt_regexp, opt_message) {};
+
+/**
+ * @param {!Array<*>} set1
+ * @param {!Array<*>} set2
+ * @param {string=} opt_message
+ */
+assert.sameMembers = function(set1, set2, opt_message) {};
+
+/**
+ * @param {!Array<*>} set1
+ * @param {!Array<*>} set2
+ * @param {string=} opt_message
+ */
+assert.sameDeepMembers = function(set1, set2, opt_message) {};
+
+// Below are the externs for the APIs to build custom assertions:
+// http://www.chaijs.com/api/plugins/
+
+/**
+ * @param {string} name
+ * @param {!Function} getter
+ */
+chai.Assertion.addMethod = function(name, getter) {};
+
+/**
+ * @param {string} name
+ * @param {function()} getter
+ */
+chai.Assertion.addProperty = function(name, getter) {};
+
+/** @type {*} */
+chai.Assertion.prototype._obj;
+
+/**
+ * @param {boolean} expr
+ * @param {string} msg
+ * @param {string} negateMsg
+ * @param {*} expected
+ * @param {*=} actual
+ * @param {boolean=} showDiff
+ */
+chai.Assertion.prototype.assert = function(
+    expr, msg, negateMsg, expected, actual, showDiff) {};
+
+/** @const */
+chai.assert = assert;
+
+/** @const */
+chai.expect = expect;
+
+/** @const */
+chai.util = {};
+
+/**
+ * @param {!chai.Assertion} obj
+ * @param {string} key
+ * @param {*=} value
+ */
+chai.util.flag = function(obj, key, value) {};
diff --git a/third_party/crashpad/OWNERS b/third_party/crashpad/OWNERS
index c87635f6..fa76be3f 100644
--- a/third_party/crashpad/OWNERS
+++ b/third_party/crashpad/OWNERS
@@ -8,8 +8,6 @@
 # Crashpad, all changes should first be made in the upstream Crashpad
 # repository, and then imported here. See README.chromium.
 
-set noparent
-
 mark@chromium.org
 rsesek@chromium.org
 scottmg@chromium.org
diff --git a/third_party/inspector_protocol/OWNERS b/third_party/inspector_protocol/OWNERS
index aff2f904..99d226ce 100644
--- a/third_party/inspector_protocol/OWNERS
+++ b/third_party/inspector_protocol/OWNERS
@@ -1,4 +1,3 @@
-set noparent
 alph@chromium.org
 caseq@chromium.org
 dgozman@chromium.org
diff --git a/third_party/pyjson5/src/benchmarks/chromium.linux.json b/third_party/pyjson5/src/benchmarks/chromium.linux.json
index 3ee88ced..3cb4bef4 100644
--- a/third_party/pyjson5/src/benchmarks/chromium.linux.json
+++ b/third_party/pyjson5/src/benchmarks/chromium.linux.json
@@ -4133,15 +4133,15 @@
         }
       },
       {
-        "isolate_name": "devtools_closure_compile",
-        "name": "devtools_closure_compile",
+        "isolate_name": "devtools_lint_check",
+        "name": "devtools_lint_check",
         "swarming": {
           "can_use_on_swarming_builders": true
         }
       },
       {
-        "isolate_name": "devtools_eslint",
-        "name": "devtools_eslint",
+        "isolate_name": "devtools_type_check",
+        "name": "devtools_type_check",
         "swarming": {
           "can_use_on_swarming_builders": true
         }
diff --git a/third_party/widevine/OWNERS b/third_party/widevine/OWNERS
index 5b31ff93..741c7d0 100644
--- a/third_party/widevine/OWNERS
+++ b/third_party/widevine/OWNERS
@@ -1,4 +1,3 @@
-set noparent
 jrummell@chromium.org
 xhwang@chromium.org
 
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl
index b3ac05f..2b5bd1f 100644
--- a/tools/gritsettings/translation_expectations.pyl
+++ b/tools/gritsettings/translation_expectations.pyl
@@ -24,7 +24,6 @@
       "android_webview/ui/aw_strings.grd",
       "ash/ash_strings.grd",
       "ash/components/ash_components_strings.grd",
-      "chrome/android/java/strings/android_chrome_strings.grd",
       "chrome/android/features/vr/java/strings/android_chrome_vr_strings.grd",
       "chrome/android/features/media_router/java/strings/android_chrome_media_router_strings.grd",
       "chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings.grd",
@@ -40,7 +39,7 @@
       "chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings.grd",
       "chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd",
       "chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd",
-      "chrome/browser/ui/android/widget/java/strings/android_ui_widget_strings.grd",
+      "chrome/browser/ui/android/strings/android_chrome_strings.grd",
       "chrome/credential_provider/gaiacp/gaia_resources.grd",
       "chromeos/chromeos_strings.grd",
       "components/autofill/android/java/strings/autofill_strings.grd",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index df21ac0..fc7dd5b 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -5268,7 +5268,7 @@
   <int value="208" label="RFH_CHILD_FRAME_NEEDS_OWNER_ELEMENT_TYPE"/>
   <int value="209" label="OBSOLETE_RFH_INVALID_WEB_REPORTING_CRASH_ID"/>
   <int value="210" label="RFH_DETACH_MAIN_FRAME"/>
-  <int value="211" label="RFH_BROWSER_INTERFACE_BROKER_MISSING"/>
+  <int value="211" label="RFH_DOCUMENT_INTERFACE_BROKER_MISSING"/>
   <int value="212" label="RFPH_POST_MESSAGE_INVALID_SOURCE_ORIGIN"/>
   <int value="213" label="INVALID_INITIATOR_ORIGIN"/>
   <int value="214" label="RFHI_BEGIN_NAVIGATION_MISSING_INITIATOR_ORIGIN"/>
@@ -68008,6 +68008,13 @@
   <int value="8" label="OPENXR_DEVICE_ID"/>
 </enum>
 
+<enum name="XRFeatureRequestStatus">
+  <int value="0" label="NotRequested"/>
+  <int value="1" label="Required"/>
+  <int value="2" label="OptionalAccepted"/>
+  <int value="3" label="OptionalRejected"/>
+</enum>
+
 <enum name="XRReferenceSpaceType">
   <int value="0" label="Viewer"/>
   <int value="1" label="Local"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 7814f71..e57b536 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -5447,6 +5447,22 @@
   </summary>
 </histogram>
 
+<histogram name="Apps.AppListDefaultSearchResultOpenType"
+    enum="AppListSearchResult" expires_after="2020-12-31">
+  <owner>jennyz@chromium.org</owner>
+  <owner>newcomer@chromium.org</owner>
+  <summary>
+    The type of the default result opened by user by pressing ENTER key.
+    Launcher UI shows suggested apps, recent queries, etc when user activates
+    the search box, or shows matched apps (installed apps, play store app
+    results, etc.) and other results (query suggestions, web site, bookmark,
+    files, etc) when user types a query. It will set the focus on the first
+    result as the default. User can open the default result by simply pressing
+    ENTER key. This metrics logs the type of the default result (installed app,
+    play store result, query suggestion, etc) opened by user pressing ENTER key.
+  </summary>
+</histogram>
+
 <histogram name="Apps.AppListDoodleAction" enum="AppListDoodleAction"
     expires_after="2018-01-20">
   <obsolete>
@@ -6942,7 +6958,7 @@
 </histogram>
 
 <histogram name="Arc.PlayAutoInstallRequest.State"
-    enum="ArcPlayAutoInstallRequestState" expires_after="2020-05-03">
+    enum="ArcPlayAutoInstallRequestState" expires_after="2020-12-31">
 <!-- Name completed by histogram_suffixes name="ArcUserTypes" -->
 
   <owner>jhorwich@google.com</owner>
@@ -6951,7 +6967,7 @@
 </histogram>
 
 <histogram name="Arc.PlayAutoInstallRequest.TimeDelta" units="ms"
-    expires_after="2019-12-31">
+    expires_after="2020-12-31">
 <!-- Name completed by histogram_suffixes name="ArcUserTypes" -->
 
   <owner>jhorwich@google.com</owner>
@@ -55669,7 +55685,11 @@
   </summary>
 </histogram>
 
-<histogram name="ImportantFile.TimeToWrite" units="ms">
+<histogram name="ImportantFile.TimeToWrite" units="ms"
+    expires_after="2019-11-05">
+  <obsolete>
+    Removed in 2019-11.
+  </obsolete>
   <owner>mamir@chromium.org</owner>
   <summary>
     Time used to atomically write string into a file using ImportantFileWriter.
@@ -122975,6 +122995,16 @@
   </summary>
 </histogram>
 
+<histogram name="SafeBrowsing.RT.Network.Result"
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2020-08-05">
+  <owner>vakh@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Response or error codes from SafeBrowsing real time URL lookups. Logged on
+    each resource check for which a lookup request is sent to the server.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.RT.ResourceTypes.Checked"
     enum="ContentResourceType2" expires_after="2020-08-05">
   <owner>vakh@chromium.org</owner>
@@ -156486,7 +156516,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeConcurrentTotalTime" units="microseconds"
-    expires_after="M80">
+    expires_after="2020-12-31">
   <owner>bmeurer@chromium.org</owner>
   <owner>mslekova@chromium.org</owner>
   <summary>
@@ -156498,7 +156528,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeExecute" units="microseconds"
-    expires_after="M80">
+    expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156510,7 +156540,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeFinalize" units="microseconds"
-    expires_after="M80">
+    expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156522,7 +156552,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeForOnStackReplacementExecute"
-    units="microseconds" expires_after="M80">
+    units="microseconds" expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156535,7 +156565,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeForOnStackReplacementFinalize"
-    units="microseconds" expires_after="M80">
+    units="microseconds" expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156548,7 +156578,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeForOnStackReplacementPrepare"
-    units="microseconds" expires_after="M80">
+    units="microseconds" expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156561,7 +156591,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeForOnStackReplacementTotalTime"
-    units="microseconds" expires_after="M80">
+    units="microseconds" expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156574,7 +156604,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeNonConcurrentTotalTime"
-    units="microseconds" expires_after="M80">
+    units="microseconds" expires_after="2020-12-31">
   <owner>bmeurer@chromium.org</owner>
   <owner>mslekova@chromium.org</owner>
   <summary>
@@ -156586,7 +156616,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizePrepare" units="microseconds"
-    expires_after="M80">
+    expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156598,7 +156628,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeTotalBackground" units="microseconds"
-    expires_after="M80">
+    expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156610,7 +156640,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeTotalForeground" units="microseconds"
-    expires_after="M80">
+    expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -156622,7 +156652,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeTotalTime" units="microseconds"
-    expires_after="M80">
+    expires_after="2020-12-31">
   <owner>neis@chromium.org</owner>
   <owner>mvstanton@chromium.org</owner>
   <summary>
@@ -159327,6 +159357,16 @@
   </summary>
 </histogram>
 
+<histogram name="Webapp.SyncInitiatedUninstallResult" enum="BooleanSuccess"
+    expires_after="2022-01-01">
+  <owner>alancutter@chromium.org</owner>
+  <owner>loyso@chromium.org</owner>
+  <summary>
+    Records uninstallation result for sync initiated uninstalls in the new
+    USS-based web applications system.
+  </summary>
+</histogram>
+
 <histogram name="Webapp.UninstallDialogAction"
     enum="WebappUninstallDialogAction" expires_after="2019-12-30">
   <owner>benwells@chromium.org</owner>
@@ -171129,7 +171169,12 @@
       label="Triggered by entering overview by fading in from home"/>
   <suffix name="FadeOutOverview"
       label="Triggered by exiting overview by fading into home"/>
-  <affected-histogram name="Apps.StateTransition.AnimationSmoothness"/>
+  <affected-histogram name="Apps.StateTransition.AnimationSmoothness">
+    <obsolete>
+      Removed in 2019-11. Equivalent values are tracked by
+      Apps.HomeLauncherTransition.AnimationSmoothness.* histograms.
+    </obsolete>
+  </affected-histogram>
   <affected-histogram name="KioskNextHome.StateTransition.AnimationSmoothness">
     <obsolete>
       Removed on 2019-07.
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index c781afd..350b00e 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -3945,16 +3945,25 @@
     </summary>
   </metric>
   <metric name="Engagement.IsHigh.Changed">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       Whether the IsHigh bit changed during the current session.
     </summary>
   </metric>
   <metric name="Engagement.IsHigh.Changes">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       Counts of IsHigh changing (from 0 to 1 or 1 to 0).
     </summary>
   </metric>
   <metric name="Engagement.IsPreloaded">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       Whether the origin was preloaded (from the chrome://component) as a high
       engagement origin.
@@ -3969,12 +3978,18 @@
     </summary>
   </metric>
   <metric name="Playbacks.AudioContextTotal">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       The total number of significant media playbacks on this origin that came
       from WebAudio / AudioContext.
     </summary>
   </metric>
   <metric name="Playbacks.Delta">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       The number of significant media playbacks on this origin during this
       session (a visit to an origin on the same tab). A playback is determined
@@ -3983,12 +3998,18 @@
     </summary>
   </metric>
   <metric name="Playbacks.MediaElementTotal">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       The total number of significant media playbacks on this origin that came
       from media elements.
     </summary>
   </metric>
   <metric name="Playbacks.SecondsSinceLast">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       The number of seconds between significant media playback on the last visit
       and significant media playback on the current visit. If there was no
@@ -4007,6 +4028,9 @@
     </summary>
   </metric>
   <metric name="Player.Audible.Total">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       The delta from above but instead of a single visit, the total of all
       deltas for all visits on this origin.
@@ -4020,6 +4044,9 @@
     </summary>
   </metric>
   <metric name="Player.Significant.Total">
+    <obsolete>
+      Deprecated 8/19 as part of https://crbug.com/998685
+    </obsolete>
     <summary>
       The delta from above but instead of a single visit, the total of all
       deltas for all visits on this origin.
@@ -9232,6 +9259,7 @@
   <owner>billorr@chromium.org</owner>
   <owner>bialpio@chromium.org</owner>
   <owner>xr-dev@chromium.org</owner>
+  <owner>cassew@google.com</owner>
   <summary>
     When session ends, records data for a WebXR / WebVR session.
   </summary>
@@ -9251,6 +9279,61 @@
       </history>
     </aggregation>
   </metric>
+  <metric name="FeatureRequest.BoundedFloor" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'bounded-floor' feature request.
+    </summary>
+  </metric>
+  <metric name="FeatureRequest.Local" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'local' feature request.
+    </summary>
+  </metric>
+  <metric name="FeatureRequest.LocalFloor" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'local-floor' feature request.
+    </summary>
+  </metric>
+  <metric name="FeatureRequest.Unbounded" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'unbounded' feature request.
+    </summary>
+  </metric>
+  <metric name="FeatureRequest.Viewer" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'viewer' feature request.
+    </summary>
+  </metric>
+  <metric name="FeatureUse.BoundedFloor" enum="Boolean">
+    <summary>
+      Whether the 'bounded-floor' feature was used during this session,
+      regardless of whether it was used successfully.
+    </summary>
+  </metric>
+  <metric name="FeatureUse.Local" enum="Boolean">
+    <summary>
+      Whether the 'local' feature was used during this session, regardless of
+      whether it was used successfully.
+    </summary>
+  </metric>
+  <metric name="FeatureUse.LocalFloor" enum="Boolean">
+    <summary>
+      Whether the 'local-floor' feature was used during this session, regardless
+      of whether it was used successfully.
+    </summary>
+  </metric>
+  <metric name="FeatureUse.Unbounded" enum="Boolean">
+    <summary>
+      Whether the 'unbounded' feature was used during this session, regardless
+      of whether it was used successfully.
+    </summary>
+  </metric>
+  <metric name="FeatureUse.Viewer" enum="Boolean">
+    <summary>
+      Whether the 'viewer' feature was used during this session, regardless of
+      whether it was used successfully.
+    </summary>
+  </metric>
   <metric name="IsLegacyWebVR" enum="Boolean">
     <summary>
       Boolean value indicating whether a session was created using the legacy
@@ -9282,9 +9365,35 @@
 
 <event name="XR.WebXR.SessionRequest">
   <owner>xr-dev@chromium.org</owner>
+  <owner>cassew@google.com</owner>
   <summary>
     Recorded when promise returned by `requestSession` gets resolved / rejected.
   </summary>
+  <metric name="Feature.BoundedFloor" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'bounded-floor' feature request.
+    </summary>
+  </metric>
+  <metric name="Feature.Local" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'local' feature request.
+    </summary>
+  </metric>
+  <metric name="Feature.LocalFloor" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'local-floor' feature request.
+    </summary>
+  </metric>
+  <metric name="Feature.Unbounded" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'unbounded' feature request.
+    </summary>
+  </metric>
+  <metric name="Feature.Viewer" enum="XRFeatureRequestStatus">
+    <summary>
+      State of the 'viewer' feature request.
+    </summary>
+  </metric>
   <metric name="Mode" enum="XRSessionModeRequest">
     <summary>
       An enum value that indicates that the `requestSession` API was called to
diff --git a/ui/base/ime/win/tsf_text_store.cc b/ui/base/ime/win/tsf_text_store.cc
index 6630958..e18fec3 100644
--- a/ui/base/ime/win/tsf_text_store.cc
+++ b/ui/base/ime/win/tsf_text_store.cc
@@ -929,7 +929,11 @@
           guid, display_attribute_info.GetAddressOf(), nullptr))) {
     return false;
   }
-  return SUCCEEDED(display_attribute_info->GetAttributeInfo(attribute));
+  // Display Attribute can be null so query for attributes only when its
+  // available
+  if (display_attribute_info)
+    return SUCCEEDED(display_attribute_info->GetAttributeInfo(attribute));
+  return false;
 }
 
 bool TSFTextStore::GetCompositionStatus(
diff --git a/ui/color/BUILD.gn b/ui/color/BUILD.gn
index f38c33f..42f18df 100644
--- a/ui/color/BUILD.gn
+++ b/ui/color/BUILD.gn
@@ -30,6 +30,35 @@
   ]
 }
 
+jumbo_component("mixers") {
+  sources = [
+    "color_mixers.h",
+  ]
+
+  defines = [ "IS_COLOR_IMPL" ]
+
+  deps = []
+
+  public_deps = [
+    "//base",
+  ]
+
+  if (is_chromeos) {
+    sources += [ "cros/native_color_mixer.cc" ]
+  } else if (is_linux) {
+    sources += [ "linux/native_color_mixer.cc" ]
+  } else if (is_mac) {
+    sources += [ "mac/native_color_mixer.cc" ]
+  } else if (is_win) {
+    sources += [ "win/native_color_mixer.cc" ]
+
+    deps += [
+      ":color",
+      "//ui/gfx:color_utils",
+    ]
+  }
+}
+
 test("color_unittests") {
   sources = [
     "color_mixer_unittest.cc",
diff --git a/ui/color/color_id.h b/ui/color/color_id.h
index 977eb4e..e4af0bd3 100644
--- a/ui/color/color_id.h
+++ b/ui/color/color_id.h
@@ -5,6 +5,8 @@
 #ifndef UI_COLOR_COLOR_ID_H_
 #define UI_COLOR_COLOR_ID_H_
 
+#include "build/build_config.h"
+
 namespace ui {
 
 // ColorId contains identifiers for all input, intermediary, and output colors
@@ -19,6 +21,40 @@
   // TODO(pkasting): Define this list.
   kColorX = kUiColorsStart,
 
+#if defined(OS_WIN)
+  // Windows native colors
+  kColorNative3dDkShadow,
+  kColorNative3dLight,
+  kColorNativeActiveBorder,
+  kColorNativeActiveCaption,
+  kColorNativeAppWorkspace,
+  kColorNativeBackground,
+  kColorNativeBtnFace,
+  kColorNativeBtnHighlight,
+  kColorNativeBtnShadow,
+  kColorNativeBtnText,
+  kColorNativeCaptionText,
+  kColorNativeGradientActiveCaption,
+  kColorNativeGradientInactiveCaption,
+  kColorNativeGrayText,
+  kColorNativeHighlight,
+  kColorNativeHighlightText,
+  kColorNativeHotlight,
+  kColorNativeInactiveBorder,
+  kColorNativeInactiveCaption,
+  kColorNativeInactiveCaptionText,
+  kColorNativeInfoBk,
+  kColorNativeInfoText,
+  kColorNativeMenu,
+  kColorNativeMenuBar,
+  kColorNativeMenuHilight,
+  kColorNativeMenuText,
+  kColorNativeScrollbar,
+  kColorNativeWindow,
+  kColorNativeWindowFrame,
+  kColorNativeWindowText,
+#endif  // defined(OS_WIN)
+
   // Embedders must start color IDs from this value.
   kUiColorsEnd,
 
@@ -37,7 +73,10 @@
   kUiColorSetsStart = kUiColorsLast + 1,
 
   // TODO(pkasting): Define this list.
-  kColorSetX = kUiColorSetsStart,
+
+  // A set of color IDs whose values match the native platform as closely as
+  // possible.
+  kColorSetNative = kUiColorSetsStart,
 
   // Embedders must start color set IDs from this value.
   kUiColorSetsEnd,
diff --git a/ui/color/color_mixers.h b/ui/color/color_mixers.h
new file mode 100644
index 0000000..3b21755
--- /dev/null
+++ b/ui/color/color_mixers.h
@@ -0,0 +1,26 @@
+// Copyright 2019 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 UI_COLOR_COLOR_MIXERS_H_
+#define UI_COLOR_COLOR_MIXERS_H_
+
+#include "base/component_export.h"
+
+namespace ui {
+
+class ColorProvider;
+
+// Adds native color mixers to |provider| that provide kColorSetNative, as well
+// as mappings from this set to cross-platform IDs.  This function should be
+// implemented on a per-platform basis in relevant subdirectories.
+void AddNativeColorMixers(ui::ColorProvider* provider);
+
+// TODO(pkasting): Other color mixers, e.g.:
+//   * Chrome default colors
+//   * Native/Chrome priority ordering mixer
+//   * All ui/ control and other colors, created from the above
+
+}  // namespace ui
+
+#endif  // UI_COLOR_COLOR_MIXERS_H_
diff --git a/ui/color/cros/native_color_mixer.cc b/ui/color/cros/native_color_mixer.cc
new file mode 100644
index 0000000..964c476e
--- /dev/null
+++ b/ui/color/cros/native_color_mixer.cc
@@ -0,0 +1,15 @@
+// Copyright 2019 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 "ui/color/color_mixers.h"
+
+#include "base/logging.h"
+
+namespace ui {
+
+void AddNativeColorMixers(ui::ColorProvider* provider) {
+  NOTIMPLEMENTED();
+}
+
+}  // namespace ui
diff --git a/ui/color/linux/native_color_mixer.cc b/ui/color/linux/native_color_mixer.cc
new file mode 100644
index 0000000..964c476e
--- /dev/null
+++ b/ui/color/linux/native_color_mixer.cc
@@ -0,0 +1,15 @@
+// Copyright 2019 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 "ui/color/color_mixers.h"
+
+#include "base/logging.h"
+
+namespace ui {
+
+void AddNativeColorMixers(ui::ColorProvider* provider) {
+  NOTIMPLEMENTED();
+}
+
+}  // namespace ui
diff --git a/ui/color/mac/native_color_mixer.cc b/ui/color/mac/native_color_mixer.cc
new file mode 100644
index 0000000..964c476e
--- /dev/null
+++ b/ui/color/mac/native_color_mixer.cc
@@ -0,0 +1,15 @@
+// Copyright 2019 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 "ui/color/color_mixers.h"
+
+#include "base/logging.h"
+
+namespace ui {
+
+void AddNativeColorMixers(ui::ColorProvider* provider) {
+  NOTIMPLEMENTED();
+}
+
+}  // namespace ui
diff --git a/ui/color/win/native_color_mixer.cc b/ui/color/win/native_color_mixer.cc
new file mode 100644
index 0000000..798c087
--- /dev/null
+++ b/ui/color/win/native_color_mixer.cc
@@ -0,0 +1,70 @@
+// Copyright 2019 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 "ui/color/color_mixers.h"
+
+#include <windows.h>
+
+#include "ui/color/color_id.h"
+#include "ui/color/color_mixer.h"
+#include "ui/color/color_provider.h"
+#include "ui/color/color_set.h"
+#include "ui/gfx/color_utils.h"
+
+namespace ui {
+
+void AddMixerForNativeColors(ui::ColorProvider* provider) {
+  // TODO(pkasting): Not clear whether this is really the set of interest.
+  // Maybe there's some way to query colors used by UxTheme.dll, or maybe we
+  // should be hardcoding a list of colors for system light/dark modes based on
+  // reverse-engineering current Windows behavior.  Or maybe the union of all
+  // these.
+#define MAP(chrome, native) {chrome, color_utils::GetSysSkColor(native)}
+  provider->AddMixer()->AddSet(
+      {kColorSetNative,
+       {
+           MAP(kColorNative3dDkShadow, COLOR_3DDKSHADOW),
+           MAP(kColorNative3dLight, COLOR_3DLIGHT),
+           MAP(kColorNativeActiveBorder, COLOR_ACTIVEBORDER),
+           MAP(kColorNativeActiveCaption, COLOR_ACTIVECAPTION),
+           MAP(kColorNativeAppWorkspace, COLOR_APPWORKSPACE),
+           MAP(kColorNativeBackground, COLOR_BACKGROUND),
+           MAP(kColorNativeBtnFace, COLOR_BTNFACE),
+           MAP(kColorNativeBtnHighlight, COLOR_BTNHIGHLIGHT),
+           MAP(kColorNativeBtnShadow, COLOR_BTNSHADOW),
+           MAP(kColorNativeBtnText, COLOR_BTNTEXT),
+           MAP(kColorNativeCaptionText, COLOR_CAPTIONTEXT),
+           MAP(kColorNativeGradientActiveCaption, COLOR_GRADIENTACTIVECAPTION),
+           MAP(kColorNativeGradientInactiveCaption,
+               COLOR_GRADIENTINACTIVECAPTION),
+           MAP(kColorNativeGrayText, COLOR_GRAYTEXT),
+           MAP(kColorNativeHighlight, COLOR_HIGHLIGHT),
+           MAP(kColorNativeHighlightText, COLOR_HIGHLIGHTTEXT),
+           MAP(kColorNativeHotlight, COLOR_HOTLIGHT),
+           MAP(kColorNativeInactiveBorder, COLOR_INACTIVEBORDER),
+           MAP(kColorNativeInactiveCaption, COLOR_INACTIVECAPTION),
+           MAP(kColorNativeInactiveCaptionText, COLOR_INACTIVECAPTIONTEXT),
+           MAP(kColorNativeInfoBk, COLOR_INFOBK),
+           MAP(kColorNativeInfoText, COLOR_INFOTEXT),
+           MAP(kColorNativeMenu, COLOR_MENU),
+           MAP(kColorNativeMenuBar, COLOR_MENUBAR),
+           MAP(kColorNativeMenuHilight, COLOR_MENUHILIGHT),
+           MAP(kColorNativeMenuText, COLOR_MENUTEXT),
+           MAP(kColorNativeScrollbar, COLOR_SCROLLBAR),
+           MAP(kColorNativeWindow, COLOR_WINDOW),
+           MAP(kColorNativeWindowFrame, COLOR_WINDOWFRAME),
+           MAP(kColorNativeWindowText, COLOR_WINDOWTEXT),
+       }});
+}
+
+void AddMixerToMapToCrossPlatformIds(ui::ColorProvider* provider) {
+  // TODO(pkasting): Add recipes
+}
+
+void AddNativeColorMixers(ui::ColorProvider* provider) {
+  AddMixerForNativeColors(provider);
+  AddMixerToMapToCrossPlatformIds(provider);
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc
index c1e8f16..5e55ee8 100644
--- a/ui/ozone/platform/wayland/host/wayland_window.cc
+++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -174,6 +174,9 @@
       break;
   }
 
+  if (xdg_surface_ && !properties.wm_class_class.empty())
+    xdg_surface_->SetAppId(properties.wm_class_class);
+
   connection_->ScheduleFlush();
 
   PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
diff --git a/ui/ozone/platform/wayland/host/xdg_surface_wrapper.h b/ui/ozone/platform/wayland/host/xdg_surface_wrapper.h
index c9736ab..eaa4cec 100644
--- a/ui/ozone/platform/wayland/host/xdg_surface_wrapper.h
+++ b/ui/ozone/platform/wayland/host/xdg_surface_wrapper.h
@@ -59,6 +59,12 @@
 
   // Sets a desired window geometry once wayland requests client to do so.
   virtual void SetWindowGeometry(const gfx::Rect& bounds) = 0;
+
+  // Sets an app id of the native window that is shown as an application name
+  // and hints the compositor that it can group application surfaces together by
+  // their app id. This also helps the compositor to identify application's
+  // .desktop file and use the icon set there.
+  virtual void SetAppId(const std::string& app_id) = 0;
 };
 
 bool CheckIfWlArrayHasValue(struct wl_array* wl_array, uint32_t value);
diff --git a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v5.cc b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v5.cc
index f521953..9681d58 100644
--- a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v5.cc
+++ b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v5.cc
@@ -80,6 +80,10 @@
                                   bounds.width(), bounds.height());
 }
 
+void XDGSurfaceWrapperV5::SetAppId(const std::string& app_id) {
+  xdg_surface_set_app_id(xdg_surface_.get(), app_id.c_str());
+}
+
 // static
 void XDGSurfaceWrapperV5::Configure(void* data,
                                     xdg_surface* obj,
diff --git a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v5.h b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v5.h
index a8e82fc..a91bb5b 100644
--- a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v5.h
+++ b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v5.h
@@ -35,6 +35,7 @@
   void SetTitle(const base::string16& title) override;
   void AckConfigure() override;
   void SetWindowGeometry(const gfx::Rect& bounds) override;
+  void SetAppId(const std::string& app_id) override;
 
   // xdg_surface_listener
   static void Configure(void* data,
diff --git a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v6.cc b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v6.cc
index a6d1b9e..f9b0abd 100644
--- a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v6.cc
+++ b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v6.cc
@@ -116,6 +116,10 @@
                                       bounds.height());
 }
 
+void XDGSurfaceWrapperV6::SetAppId(const std::string& app_id) {
+  zxdg_toplevel_v6_set_app_id(zxdg_toplevel_v6_.get(), app_id.c_str());
+}
+
 // static
 void XDGSurfaceWrapperV6::Configure(void* data,
                                     struct zxdg_surface_v6* zxdg_surface_v6,
diff --git a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v6.h b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v6.h
index 2b49fcf..b35da0c 100644
--- a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v6.h
+++ b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_v6.h
@@ -23,6 +23,7 @@
   XDGSurfaceWrapperV6(WaylandWindow* wayland_window);
   ~XDGSurfaceWrapperV6() override;
 
+  // XDGSurfaceWrapper overrides:
   bool Initialize(WaylandConnection* connection,
                   wl_surface* surface,
                   bool with_toplevel) override;
@@ -36,6 +37,7 @@
   void SetTitle(const base::string16& title) override;
   void AckConfigure() override;
   void SetWindowGeometry(const gfx::Rect& bounds) override;
+  void SetAppId(const std::string& app_id) override;
 
   // xdg_surface_listener
   static void Configure(void* data,
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc
index e30189f7..a439516 100644
--- a/ui/platform_window/x11/x11_window.cc
+++ b/ui/platform_window/x11/x11_window.cc
@@ -82,6 +82,8 @@
   config.wm_role_name = properties.wm_role_name;
   config.activatable = properties.activatable;
   config.visual_id = properties.x_visual_id;
+  config.prefer_dark_theme = properties.prefer_dark_theme;
+  config.background_color = properties.background_color;
   return config;
 }
 
diff --git a/ui/views/controls/webview/web_dialog_view.cc b/ui/views/controls/webview/web_dialog_view.cc
index 2e2baf0..fc3bb0b 100644
--- a/ui/views/controls/webview/web_dialog_view.cc
+++ b/ui/views/controls/webview/web_dialog_view.cc
@@ -310,6 +310,12 @@
   return true;
 }
 
+bool WebDialogView::ShouldCenterDialogTitleText() const {
+  if (delegate_)
+    return delegate_->ShouldCenterDialogTitleText();
+  return false;
+}
+
 bool WebDialogView::ShouldShowCloseButton() const {
   if (delegate_)
     return delegate_->ShouldShowCloseButton();
diff --git a/ui/views/controls/webview/web_dialog_view.h b/ui/views/controls/webview/web_dialog_view.h
index 8c7f6521..e395998 100644
--- a/ui/views/controls/webview/web_dialog_view.h
+++ b/ui/views/controls/webview/web_dialog_view.h
@@ -121,6 +121,7 @@
   void OnCloseContents(content::WebContents* source,
                        bool* out_close_dialog) override;
   bool ShouldShowDialogTitle() const override;
+  bool ShouldCenterDialogTitleText() const override;
   bool HandleContextMenu(content::RenderFrameHost* render_frame_host,
                          const content::ContextMenuParams& params) override;
 
diff --git a/ui/views/widget/widget_delegate.cc b/ui/views/widget/widget_delegate.cc
index 96ee046..603eb02b 100644
--- a/ui/views/widget/widget_delegate.cc
+++ b/ui/views/widget/widget_delegate.cc
@@ -90,6 +90,10 @@
   return true;
 }
 
+bool WidgetDelegate::ShouldCenterWindowTitleText() const {
+  return false;
+}
+
 bool WidgetDelegate::ShouldShowCloseButton() const {
   return true;
 }
diff --git a/ui/views/widget/widget_delegate.h b/ui/views/widget/widget_delegate.h
index 3388f25..82ad156 100644
--- a/ui/views/widget/widget_delegate.h
+++ b/ui/views/widget/widget_delegate.h
@@ -94,6 +94,9 @@
   // Returns true if the window should show a title in the title bar.
   virtual bool ShouldShowWindowTitle() const;
 
+  // Returns true if the title text should be centered. Default is false.
+  virtual bool ShouldCenterWindowTitleText() const;
+
   // Returns true if the window should show a close button in the title bar.
   virtual bool ShouldShowCloseButton() const;
 
diff --git a/ui/views_content_client/views_content_browser_client.cc b/ui/views_content_client/views_content_browser_client.cc
index 36dbea2d..35936ba 100644
--- a/ui/views_content_client/views_content_browser_client.cc
+++ b/ui/views_content_client/views_content_browser_client.cc
@@ -30,7 +30,7 @@
     storage::OptionalQuotaSettingsCallback callback) {
   storage::GetNominalDynamicSettings(
       partition->GetPath(), context->IsOffTheRecord(),
-      storage::GetDefaultDiskInfoHelper(), std::move(callback));
+      storage::GetDefaultDeviceInfoHelper(), std::move(callback));
 }
 
 }  // namespace ui
diff --git a/ui/web_dialogs/web_dialog_delegate.cc b/ui/web_dialogs/web_dialog_delegate.cc
index 0d0e20d60..158d925a 100644
--- a/ui/web_dialogs/web_dialog_delegate.cc
+++ b/ui/web_dialogs/web_dialog_delegate.cc
@@ -32,6 +32,10 @@
   return true;
 }
 
+bool WebDialogDelegate::ShouldCenterDialogTitleText() const {
+  return false;
+}
+
 bool WebDialogDelegate::ShouldShowCloseButton() const {
   return true;
 }
diff --git a/ui/web_dialogs/web_dialog_delegate.h b/ui/web_dialogs/web_dialog_delegate.h
index ba3e5d5..08a4dd5 100644
--- a/ui/web_dialogs/web_dialog_delegate.h
+++ b/ui/web_dialogs/web_dialog_delegate.h
@@ -123,6 +123,10 @@
   // have a title bar.  This is useful when presenting branded interfaces.
   virtual bool ShouldShowDialogTitle() const = 0;
 
+  // A callback to allow the delegate to center title text. Default is
+  // false.
+  virtual bool ShouldCenterDialogTitleText() const;
+
   // Returns true if the dialog should show a close button in the title bar.
   // Default implementation returns true.
   virtual bool ShouldShowCloseButton() const;
diff --git a/ui/webui/resources/css/cros_colors.css b/ui/webui/resources/css/cros_colors.css
new file mode 100644
index 0000000..263b1b9
--- /dev/null
+++ b/ui/webui/resources/css/cros_colors.css
@@ -0,0 +1,15 @@
+/* Copyright 2019 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. */
+
+html {
+  --cros-default-text-color: var(--google-grey-900);
+  --cros-default-text-color-secondary: var(--google-grey-refresh-700);
+
+  --cros-default-bg-color: #fff;
+
+  --cros-default-toolbar-bg-color: #fff;
+  --cros-default-toolbar-search-bg-color: var(--google-grey-refresh-100);
+}
+
+/* TODO(crbug.com/1018654): Implement dark mode overrides */
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd
index 45e2456..eb732e47 100644
--- a/ui/webui/resources/webui_resources.grd
+++ b/ui/webui/resources/webui_resources.grd
@@ -207,6 +207,9 @@
                  compress="gzip" />
 
       <if expr="chromeos">
+        <structure name="IDR_WEBUI_CSS_CROS_COLORS"
+                   file="css/cros_colors.css" type="chrome_html"
+                   compress="gzip" />
         <structure name="IDR_WEBUI_HTML_CHROMEOS_ONC_MOJO"
                    file="html/chromeos/onc_mojo.html" type="chrome_html"
                    compress="gzip" />