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(®istrar()); + 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( ¶ms->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, ®istration1, barrier_closure)); scoped_refptr<ServiceWorkerRegistration> registration2; - storage()->FindRegistrationForDocument( + storage()->FindRegistrationForClientUrl( GURL("https://www.example.com/"), SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk, ®istration2, 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, ®istration1, barrier_closure)); scoped_refptr<ServiceWorkerRegistration> registration2; - storage()->FindRegistrationForDocument( + storage()->FindRegistrationForClientUrl( GURL("https://www.example.com/two"), SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk, ®istration2, 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, ®istration1, barrier_closure)); scoped_refptr<ServiceWorkerRegistration> registration2; - storage()->FindRegistrationForDocument( + storage()->FindRegistrationForClientUrl( scope2, SaveFoundRegistration(blink::ServiceWorkerStatusCode::kOk, ®istration2, 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, ®istration_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(¶ms->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(¶ms->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" />