diff --git a/DEPS b/DEPS index 8cb043b..1dc154cb 100644 --- a/DEPS +++ b/DEPS
@@ -239,7 +239,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'b7f52780094451f2d97a00ebaf998f3a2c53a144', + 'skia_revision': 'c307c5566d11d2bd6de84ade4fc3cb8c026fa627', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -632,7 +632,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '0bbfd7fe419c6cb991e25c9e4995c2a378baa287', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'b0282efe36d8c4eab4baa83570c19008b122d3e7', 'condition': 'checkout_ios', }, @@ -1697,7 +1697,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a080672bfbed90bc1757bdf8f1c569f3c1cc955d', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4f888a3599e27fb57ac630613be09547b6951881', 'condition': 'checkout_src_internal', },
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index af01c58..d9528b3 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -2963,6 +2963,8 @@ "projector/test/mock_projector_metadata_controller.h", "projector/test/mock_projector_ui_controller.cc", "projector/test/mock_projector_ui_controller.h", + "test/layer_animation_stopped_waiter.cc", + "test/layer_animation_stopped_waiter.h", # These headers declare functions that are implemented inside of //ash, so # they cannot live in //ash/public/cpp/BUILD.gn.
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn index 2957cc19..ae47a185 100644 --- a/ash/app_list/BUILD.gn +++ b/ash/app_list/BUILD.gn
@@ -58,6 +58,8 @@ "views/app_list_menu_model_adapter.h", "views/app_list_page.cc", "views/app_list_page.h", + "views/app_list_reorder_undo_container_view.cc", + "views/app_list_reorder_undo_container_view.h", "views/app_list_view.cc", "views/app_list_view.h", "views/apps_container_view.cc",
diff --git a/ash/app_list/app_list_bubble_presenter.cc b/ash/app_list/app_list_bubble_presenter.cc index e4ec2ac..e98f999 100644 --- a/ash/app_list/app_list_bubble_presenter.cc +++ b/ash/app_list/app_list_bubble_presenter.cc
@@ -10,6 +10,7 @@ #include "ash/app_list/app_list_bubble_event_filter.h" #include "ash/app_list/app_list_controller_impl.h" #include "ash/app_list/app_list_event_targeter.h" +#include "ash/app_list/views/app_list_bubble_apps_page.h" #include "ash/app_list/views/app_list_bubble_view.h" #include "ash/app_list/views/app_list_drag_and_drop_host.h" #include "ash/constants/ash_features.h" @@ -290,6 +291,11 @@ return bubble_view_->IsShowingEmbeddedAssistantUI(); } +void AppListBubblePresenter::OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order) { + bubble_view_->apps_page()->OnTemporarySortOrderChanged(new_order); +} + void AppListBubblePresenter::ShowEmbeddedAssistantUI() { // `bubble_view_` does not exist while waiting for zero-state results. // OnZeroStateSearchDone() sets the page in that case.
diff --git a/ash/app_list/app_list_bubble_presenter.h b/ash/app_list/app_list_bubble_presenter.h index 1b604b3c..5c31729 100644 --- a/ash/app_list/app_list_bubble_presenter.h +++ b/ash/app_list/app_list_bubble_presenter.h
@@ -12,6 +12,7 @@ #include "ash/ash_export.h" #include "ash/public/cpp/shelf_types.h" #include "base/memory/weak_ptr.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/aura/client/focus_change_observer.h" #include "ui/display/display_observer.h" #include "ui/views/widget/widget_observer.h" @@ -25,6 +26,7 @@ class AppListBubbleEventFilter; class AppListBubbleView; class AppListControllerImpl; +enum class AppListSortOrder; // Manages the UI for the bubble launcher used in clamshell mode. Handles // showing and hiding the UI, as well as bounds computations. Only one bubble @@ -65,6 +67,10 @@ // Switches to the assistant page. Requires the bubble to be open. void ShowEmbeddedAssistantUI(); + // Called when the app list temporary sort order changes. + void OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order); + // views::WidgetObserver: void OnWidgetDestroying(views::Widget* widget) override;
diff --git a/ash/app_list/app_list_bubble_presenter_unittest.cc b/ash/app_list/app_list_bubble_presenter_unittest.cc index d333a17db..a1bf8855 100644 --- a/ash/app_list/app_list_bubble_presenter_unittest.cc +++ b/ash/app_list/app_list_bubble_presenter_unittest.cc
@@ -228,7 +228,7 @@ GetTestAppListClient()->set_run_zero_state_callback_immediately(false); PressAndReleaseKey(ui::VKEY_ASSISTANT); - AppListTestApi().WaitForBubbleWindow(); + AppListTestApi().WaitForBubbleWindow(/*wait_for_opening_animation=*/false); AppListBubblePresenter* presenter = GetBubblePresenter(); EXPECT_TRUE(presenter->IsShowing()); @@ -248,7 +248,7 @@ GetTestAppListClient()->set_run_zero_state_callback_immediately(false); PressAndReleaseKey(ui::VKEY_LWIN); // Search key. - AppListTestApi().WaitForBubbleWindow(); + AppListTestApi().WaitForBubbleWindow(/*wait_for_opening_animation=*/false); AppListBubblePresenter* presenter = GetBubblePresenter(); EXPECT_TRUE(presenter->IsShowing());
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index 9e1e118..55ac307c 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -520,6 +520,18 @@ fullscreen_presenter_->ProcessScrollOffset(event.location(), offset); } +void AppListControllerImpl::OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order) { + DCHECK(features::IsProductivityLauncherEnabled()); + DCHECK(features::IsLauncherAppSortEnabled()); + + // Adapt to the new sorting order in clamshell mode. + if (!IsTabletMode()) { + DCHECK(bubble_presenter_); + bubble_presenter_->OnTemporarySortOrderChanged(new_order); + } +} + ShelfAction AppListControllerImpl::ToggleAppList( int64_t display_id, AppListShowSource show_source,
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h index 1494beebf..32d50372 100644 --- a/ash/app_list/app_list_controller_impl.h +++ b/ash/app_list/app_list_controller_impl.h
@@ -123,6 +123,8 @@ void EndDragFromShelf(AppListViewState app_list_state); void ProcessMouseWheelEvent(const ui::MouseWheelEvent& event); void ProcessScrollEvent(const ui::ScrollEvent& event); + void OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order) override; // In tablet mode, takes the user to the home screen, either by ending // Overview Mode/Split View Mode or by minimizing the other windows. Returns
diff --git a/ash/app_list/app_list_test_api.cc b/ash/app_list/app_list_test_api.cc index 3e98ae2..5b26a6b4 100644 --- a/ash/app_list/app_list_test_api.cc +++ b/ash/app_list/app_list_test_api.cc
@@ -19,6 +19,7 @@ #include "ash/app_list/views/app_list_bubble_view.h" #include "ash/app_list/views/app_list_item_view.h" #include "ash/app_list/views/app_list_main_view.h" +#include "ash/app_list/views/app_list_reorder_undo_container_view.h" #include "ash/app_list/views/app_list_view.h" #include "ash/app_list/views/apps_container_view.h" #include "ash/app_list/views/apps_grid_view.h" @@ -27,9 +28,12 @@ #include "ash/app_list/views/scrollable_apps_grid_view.h" #include "ash/constants/ash_features.h" #include "ash/shell.h" +#include "ash/test/layer_animation_stopped_waiter.h" #include "base/callback.h" #include "base/run_loop.h" #include "ui/aura/window_observer.h" +#include "ui/compositor/layer.h" +#include "ui/views/controls/button/label_button.h" #include "ui/views/view_model.h" namespace ash { @@ -45,6 +49,24 @@ return AppListView::TestApi(app_list_view).GetRootAppsGridView(); } +AppListBubbleView* GetAppListBubbleView() { + AppListBubbleView* bubble_view = Shell::Get() + ->app_list_controller() + ->bubble_presenter_for_test() + ->bubble_view_for_test(); + DCHECK(bubble_view) << "Bubble launcher view not yet created. Tests must " + "show the launcher and may need to call " + "WaitForBubbleWindow() if animations are enabled."; + return bubble_view; +} + +AppListReorderUndoContainerView* GetReorderUndoContainerViewFromBubble() { + DCHECK(features::IsLauncherAppSortEnabled()); + return GetAppListBubbleView()->apps_page()->reorder_undo_container_for_test(); +} + +// WindowAddedWaiter ----------------------------------------------------------- + // Waits until a child window is added to a container window. class WindowAddedWaiter : public aura::WindowObserver { public: @@ -81,25 +103,34 @@ return AppListModelProvider::Get()->model(); } -void AppListTestApi::WaitForBubbleWindow() { +void AppListTestApi::WaitForBubbleWindow(bool wait_for_opening_animation) { DCHECK(features::IsProductivityLauncherEnabled()); DCHECK(!Shell::Get()->IsInTabletMode()); - // Do nothing if the window already exists. + // Wait for the window only when the app list window does not exist. auto* app_list_controller = Shell::Get()->app_list_controller(); - if (app_list_controller->GetWindow()) - return; + if (!app_list_controller->GetWindow()) { + // Wait for a child window to be added to the app list container. + aura::Window* container = Shell::GetContainer( + Shell::GetPrimaryRootWindow(), kShellWindowId_AppListContainer); + WindowAddedWaiter waiter(container); + waiter.Wait(); - // Wait for a child window to be added to the app list container. - aura::Window* container = Shell::GetContainer( - Shell::GetPrimaryRootWindow(), kShellWindowId_AppListContainer); - WindowAddedWaiter waiter(container); - waiter.Wait(); + // App list window exists. + aura::Window* app_list_window = app_list_controller->GetWindow(); + DCHECK(app_list_window); + DCHECK_EQ(app_list_window, waiter.added_window()); + } - // App list window exists. - aura::Window* app_list_window = app_list_controller->GetWindow(); + if (wait_for_opening_animation) + WaitUntilAppListAnimationIdle(); +} + +void AppListTestApi::WaitUntilAppListAnimationIdle() { + aura::Window* app_list_window = + Shell::Get()->app_list_controller()->GetWindow(); DCHECK(app_list_window); - DCHECK_EQ(app_list_window, waiter.added_window()); + LayerAnimationStoppedWaiter().Wait(app_list_window->layer()); } bool AppListTestApi::HasApp(const std::string& app_id) { @@ -196,17 +227,19 @@ AppsGridView* AppListTestApi::GetTopLevelAppsGridView() { if (features::IsProductivityLauncherEnabled() && !Shell::Get()->tablet_mode_controller()->InTabletMode()) { - AppListBubbleView* bubble_view = Shell::Get() - ->app_list_controller() - ->bubble_presenter_for_test() - ->bubble_view_for_test(); - DCHECK(bubble_view) << "Bubble launcher view not yet created. Tests must " - "show the launcher and may need to call " - "WaitForBubbleWindow() if animations are enabled."; - return bubble_view->apps_page_for_test()->scrollable_apps_grid_view(); + return GetAppListBubbleView()->apps_page()->scrollable_apps_grid_view(); } return GetPagedAppsGridView(); } +views::View* AppListTestApi::GetBubbleReorderUndoButton() { + return GetReorderUndoContainerViewFromBubble() + ->GetToastDismissButtonForTest(); +} + +bool AppListTestApi::GetBubbleReorderUndoToastVisibility() const { + return GetReorderUndoContainerViewFromBubble()->is_toast_visible_for_test(); +} + } // namespace ash
diff --git a/ash/app_list/views/app_list_bubble_apps_page.cc b/ash/app_list/views/app_list_bubble_apps_page.cc index ec1c249b..7a86dfde 100644 --- a/ash/app_list/views/app_list_bubble_apps_page.cc +++ b/ash/app_list/views/app_list_bubble_apps_page.cc
@@ -13,6 +13,7 @@ #include "ash/app_list/app_list_model_provider.h" #include "ash/app_list/app_list_view_delegate.h" #include "ash/app_list/model/app_list_model.h" +#include "ash/app_list/views/app_list_reorder_undo_container_view.h" #include "ash/app_list/views/continue_section_view.h" #include "ash/app_list/views/recent_apps_view.h" #include "ash/app_list/views/scrollable_apps_grid_view.h" @@ -144,6 +145,13 @@ separator_->SetColor(ColorProvider::Get()->GetContentLayerColor( ColorProvider::ContentLayerType::kSeparatorColor)); + // Add a empty container view. A toast view should be added to + // `reorder_undo_container_` when the app list starts temporary sorting. + if (features::IsLauncherAppSortEnabled()) { + reorder_undo_container_ = scroll_contents->AddChildView( + std::make_unique<AppListReorderUndoContainerView>()); + } + // All apps section. scrollable_apps_grid_view_ = scroll_contents->AddChildView(std::make_unique<ScrollableAppsGridView>( @@ -296,6 +304,12 @@ scrollable_apps_grid_view_->DisableFocusForShowingActiveFolder(disabled); } +void AppListBubbleAppsPage::OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order) { + DCHECK(features::IsLauncherAppSortEnabled()); + reorder_undo_container_->OnTemporarySortOrderChanged(new_order); +} + void AppListBubbleAppsPage::Layout() { views::View::Layout(); if (gradient_helper_)
diff --git a/ash/app_list/views/app_list_bubble_apps_page.h b/ash/app_list/views/app_list_bubble_apps_page.h index 013e3e3..2a71fbd 100644 --- a/ash/app_list/views/app_list_bubble_apps_page.h +++ b/ash/app_list/views/app_list_bubble_apps_page.h
@@ -32,6 +32,7 @@ class RecentAppsView; class ScrollableAppsGridView; class ScrollViewGradientHelper; +class AppListReorderUndoContainerView; // The default page for the app list bubble / clamshell launcher. Contains a // scroll view with: @@ -74,6 +75,11 @@ // view to handle focus. void DisableFocusForShowingActiveFolder(bool disabled); + // Called when the app list temporary sort order changes. If `new_order` is + // null, the temporary sort order is cleared. + void OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order); + // views::View: void Layout() override; @@ -99,6 +105,9 @@ RecentAppsView* recent_apps_for_test() { return recent_apps_; } views::Separator* separator_for_test() { return separator_; } + AppListReorderUndoContainerView* reorder_undo_container_for_test() { + return reorder_undo_container_; + } private: friend class AppListTestHelper; @@ -123,6 +132,7 @@ ContinueSectionView* continue_section_ = nullptr; RecentAppsView* recent_apps_ = nullptr; views::Separator* separator_ = nullptr; + AppListReorderUndoContainerView* reorder_undo_container_ = nullptr; ScrollableAppsGridView* scrollable_apps_grid_view_ = nullptr; // Adds fade in/out gradients to `scroll_view_`.
diff --git a/ash/app_list/views/app_list_bubble_view.h b/ash/app_list/views/app_list_bubble_view.h index fc158f68..ed679b7 100644 --- a/ash/app_list/views/app_list_bubble_view.h +++ b/ash/app_list/views/app_list_bubble_view.h
@@ -88,6 +88,8 @@ void ReparentFolderItemTransit(AppListFolderItem* folder_item) override; void ReparentDragEnded() override; + AppListBubbleAppsPage* apps_page() { return apps_page_; } + views::View* separator_for_test() { return separator_; } bool showing_folder_for_test() { return showing_folder_; } AppListBubbleAppsPage* apps_page_for_test() { return apps_page_; }
diff --git a/ash/app_list/views/app_list_menu_model_adapter.cc b/ash/app_list/views/app_list_menu_model_adapter.cc index 6169c4d7..bca193af 100644 --- a/ash/app_list/views/app_list_menu_model_adapter.cc +++ b/ash/app_list/views/app_list_menu_model_adapter.cc
@@ -178,11 +178,6 @@ user_journey_time); } break; - case SEARCH_RESULT: - // SearchResult can use this class, but the code is dead and does not show - // a menu. - NOTREACHED(); - break; case APP_LIST_APP_TYPE_LAST: NOTREACHED(); break;
diff --git a/ash/app_list/views/app_list_menu_model_adapter.h b/ash/app_list/views/app_list_menu_model_adapter.h index 00b7738..d5ee97e 100644 --- a/ash/app_list/views/app_list_menu_model_adapter.h +++ b/ash/app_list/views/app_list_menu_model_adapter.h
@@ -31,7 +31,10 @@ FULLSCREEN_APP_GRID = 2, PEEKING_SUGGESTED = 3, HALF_SEARCH_RESULT = 4, - SEARCH_RESULT = 5, + + // Usage removed. + // SEARCH_RESULT = 5, + PRODUCTIVITY_LAUNCHER_RECENT_APP = 6, PRODUCTIVITY_LAUNCHER_APP_GRID = 7, APP_LIST_APP_TYPE_LAST = 8
diff --git a/ash/app_list/views/app_list_reorder_undo_container_view.cc b/ash/app_list/views/app_list_reorder_undo_container_view.cc new file mode 100644 index 0000000..f7d3aa6 --- /dev/null +++ b/ash/app_list/views/app_list_reorder_undo_container_view.cc
@@ -0,0 +1,97 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/app_list/views/app_list_reorder_undo_container_view.h" + +#include <memory> + +#include "ash/app_list/app_list_model_provider.h" +#include "ash/app_list/app_list_view_delegate.h" +#include "ash/public/cpp/app_list/app_list_model_delegate.h" +#include "ash/style/system_toast_style.h" +#include "base/strings/strcat.h" + +namespace ash { + +namespace { + +// TODO(https://crbug.com/1269386): Raw strings are used for now. It should be +// replaced by an i18n string after the ui design is finalized. + +// The toast text's fixed part that is independent of the sorting order. +constexpr char16_t kToastTextFixedPart[] = u"Apps are now reordered "; + +// The toast texts that depend on the sorting order. +constexpr char16_t kToastAlphabeticalOrderText[] = u"alphabetically"; +constexpr char16_t kToastReverseAlphabeticalOrderText[] = + u"reverse-alphabetically"; + +// The text shown on the toast dismiss button. +constexpr char16_t kToastDismissText[] = u"Redo"; + +} // namespace + +AppListReorderUndoContainerView::AppListReorderUndoContainerView() { + SetUseDefaultFillLayout(true); +} + +AppListReorderUndoContainerView::~AppListReorderUndoContainerView() { + toast_view_ = nullptr; +} + +void AppListReorderUndoContainerView::OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order) { + // Remove `toast_view_` when the temporary sorting order is cleared. + if (!new_order) { + RemoveChildView(toast_view_); + toast_view_ = nullptr; + return; + } + + const std::u16string toast_text = CalculateToastTextFromOrder(*new_order); + if (toast_view_) { + toast_view_->SetText(toast_text); + return; + } + + toast_view_ = AddChildView(std::make_unique<SystemToastStyle>( + base::BindRepeating( + &AppListReorderUndoContainerView::OnReorderUndoButtonClicked, + base::Unretained(this)), + toast_text, kToastDismissText, + /*is_managed=*/false)); +} + +views::LabelButton* +AppListReorderUndoContainerView::GetToastDismissButtonForTest() { + return toast_view_->button(); +} + +void AppListReorderUndoContainerView::OnReorderUndoButtonClicked() { + AppListModelProvider::Get()->model()->delegate()->RequestAppListSortRevert(); +} + +std::u16string AppListReorderUndoContainerView::CalculateToastTextFromOrder( + AppListSortOrder order) const { + base::StringPiece16 toast_text_variable_part; + + switch (order) { + case AppListSortOrder::kNameAlphabetical: + toast_text_variable_part = + base::StringPiece16(kToastAlphabeticalOrderText); + break; + case AppListSortOrder::kNameReverseAlphabetical: + toast_text_variable_part = + base::StringPiece16(kToastReverseAlphabeticalOrderText); + break; + case AppListSortOrder::kCustom: + NOTREACHED(); + break; + } + + return base::StrCat( + {base::StringPiece16(kToastTextFixedPart), toast_text_variable_part}); +} + +} // namespace ash
diff --git a/ash/app_list/views/app_list_reorder_undo_container_view.h b/ash/app_list/views/app_list_reorder_undo_container_view.h new file mode 100644 index 0000000..1233435f --- /dev/null +++ b/ash/app_list/views/app_list_reorder_undo_container_view.h
@@ -0,0 +1,53 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_APP_LIST_VIEWS_APP_LIST_REORDER_UNDO_CONTAINER_VIEW_H_ +#define ASH_APP_LIST_VIEWS_APP_LIST_REORDER_UNDO_CONTAINER_VIEW_H_ + +#include "ui/views/view.h" + +namespace views { +class LabelButton; +} + +namespace ash { + +class SystemToastStyle; +enum class AppListSortOrder; + +// A view accommodating a toast view that reverts the app list temporary +// sorting order when the toast dismiss button is clicked. +class AppListReorderUndoContainerView : public views::View { + public: + AppListReorderUndoContainerView(); + AppListReorderUndoContainerView(const AppListReorderUndoContainerView&) = + delete; + AppListReorderUndoContainerView& operator=( + const AppListReorderUndoContainerView&) = delete; + ~AppListReorderUndoContainerView() override; + + // Called when the app list temporary sort order changes. If `new_order` is + // null, the temporary sort order is cleared. + void OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order); + + // This function expects that `toast_view_` exists. + views::LabelButton* GetToastDismissButtonForTest(); + + bool is_toast_visible_for_test() const { return toast_view_; } + + private: + // Called when the `toast_view_`'s dismiss button is clicked. + void OnReorderUndoButtonClicked(); + + // Calculates the toast text based on the temporary sorting order. + std::u16string CalculateToastTextFromOrder(AppListSortOrder order) const + WARN_UNUSED_RESULT; + + SystemToastStyle* toast_view_ = nullptr; +}; + +} // namespace ash + +#endif // ASH_APP_LIST_VIEWS_APP_LIST_REORDER_UNDO_CONTAINER_VIEW_H_
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc index ec4d66dd..836bc85 100644 --- a/ash/app_list/views/search_result_view.cc +++ b/ash/app_list/views/search_result_view.cc
@@ -5,6 +5,7 @@ #include "ash/app_list/views/search_result_view.h" #include <algorithm> +#include <memory> #include <utility> #include "ash/app_list/app_list_metrics.h" @@ -44,7 +45,6 @@ #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" -#include "ui/views/controls/menu/menu_runner.h" #include "ui/views/image_model_utils.h" #include "ui/views/layout/flex_layout.h" #include "ui/views/layout/flex_layout_view.h" @@ -162,7 +162,6 @@ icon_->SetCanProcessEventsWithinSubtree(false); badge_icon_->SetCanProcessEventsWithinSubtree(false); - set_context_menu_controller(this); SetNotifyEnterExitOnChild(true); text_container_ = AddChildView(std::make_unique<views::FlexLayoutView>()); @@ -709,49 +708,4 @@ return IsMouseHovered() || selected(); } -void SearchResultView::OnMenuClosed() { - // Release menu since its menu model delegate (AppContextMenu) could be - // released as a result of menu command execution. - context_menu_.reset(); -} - -void SearchResultView::ShowContextMenuForViewImpl( - views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type) { - // |result()| could be nullptr when result list is changing. - if (!result()) - return; - - view_delegate_->GetSearchResultContextMenuModel( - result()->id(), base::BindOnce(&SearchResultView::OnGetContextMenu, - weak_ptr_factory_.GetWeakPtr(), source, - point, source_type)); -} - -void SearchResultView::OnGetContextMenu( - views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type, - std::unique_ptr<ui::SimpleMenuModel> menu_model) { - if (!menu_model || (context_menu_ && context_menu_->IsShowingMenu())) - return; - - AppLaunchedMetricParams metric_params = { - AppListLaunchedFrom::kLaunchedFromSearchBox, - AppListLaunchType::kSearchResult}; - view_delegate_->GetAppLaunchedMetricParams(&metric_params); - - context_menu_ = std::make_unique<AppListMenuModelAdapter>( - std::string(), std::move(menu_model), GetWidget(), source_type, - metric_params, AppListMenuModelAdapter::SEARCH_RESULT, - base::BindOnce(&SearchResultView::OnMenuClosed, - weak_ptr_factory_.GetWeakPtr()), - view_delegate_->IsInTabletMode()); - context_menu_->Run(gfx::Rect(point, gfx::Size()), - views::MenuAnchorPosition::kTopLeft, - views::MenuRunner::HAS_MNEMONICS); - source->RequestFocus(); -} - } // namespace ash
diff --git a/ash/app_list/views/search_result_view.h b/ash/app_list/views/search_result_view.h index c0c3c6b..73ccec3 100644 --- a/ash/app_list/views/search_result_view.h +++ b/ash/app_list/views/search_result_view.h
@@ -5,20 +5,12 @@ #ifndef ASH_APP_LIST_VIEWS_SEARCH_RESULT_VIEW_H_ #define ASH_APP_LIST_VIEWS_SEARCH_RESULT_VIEW_H_ -#include <stddef.h> - -#include <memory> -#include <string> -#include <vector> - #include "ash/app_list/model/search/search_result.h" -#include "ash/app_list/views/app_list_menu_model_adapter.h" #include "ash/app_list/views/search_result_actions_view_delegate.h" #include "ash/app_list/views/search_result_base_view.h" #include "ash/ash_export.h" #include "base/compiler_specific.h" #include "base/memory/weak_ptr.h" -#include "ui/views/context_menu_controller.h" namespace views { class FlexLayoutView; @@ -40,7 +32,6 @@ // SearchResultView displays a SearchResult. class ASH_EXPORT SearchResultView : public SearchResultBaseView, - public views::ContextMenuController, public SearchResultActionsViewDelegate { public: enum class SearchResultViewType { @@ -111,17 +102,6 @@ // ui::EventHandler overrides: void OnGestureEvent(ui::GestureEvent* event) override; - // views::ContextMenuController overrides: - void ShowContextMenuForViewImpl(views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type) override; - - // Bound by ShowContextMenuForViewImpl(). - void OnGetContextMenu(views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type, - std::unique_ptr<ui::SimpleMenuModel> menu_model); - // SearchResultObserver overrides: void OnMetadataChanged() override; @@ -135,12 +115,6 @@ void OnSearchResultActionActivated(size_t index) override; bool IsSearchResultHoveredOrSelected() override; - // Invoked when the context menu closes. - void OnMenuClosed(); - - // Whether this result has a rich image icon. - bool IsRichImage() const; - // Parent list view. Owned by views hierarchy. SearchResultListView* const list_view_; @@ -158,8 +132,6 @@ views::Label* rating_ = nullptr; // Owned by views hierarchy. views::ImageView* rating_star_ = nullptr; // Owned by views hierarchy. - std::unique_ptr<AppListMenuModelAdapter> context_menu_; - // Whether the removal confirmation dialog is invoked by long press touch. bool confirm_remove_by_long_press_ = false;
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 322a0e4..8681e668 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -1387,7 +1387,7 @@ Download dangerous <ph name="FILENAME">$1<ex>example.txt</ex></ph> </message> <message name="IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_A11Y_NAME_SCANNING" desc="The accessible name for a view representing an in-progress download holding space item which is being scanned. The placeholder, FILENAME, is the filename of the holding space item's backing file."> - Download being scanned <ph name="FILENAME">$1<ex>example.txt</ex></ph> + Download scanning <ph name="FILENAME">$1<ex>example.txt</ex></ph> </message> <message name="IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_A11Y_NAME_PAUSED" desc="The accessible name for a view representing an in-progress download holding space item which is paused. The placeholder, FILENAME, is the filename of the holding space item's backing file."> Download paused <ph name="FILENAME">$1<ex>example.txt</ex></ph> @@ -1408,7 +1408,7 @@ Open when complete </message> <message name="IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_SCANNING" desc="Text displayed in a holding space download chip to indicate the underlying download is being scanned."> - Being scanned + Scanning </message> <!-- Phone Hub tray-->
diff --git a/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_A11Y_NAME_SCANNING.png.sha1 b/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_A11Y_NAME_SCANNING.png.sha1 index d1ad34bf..e6257ed 100644 --- a/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_A11Y_NAME_SCANNING.png.sha1 +++ b/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_A11Y_NAME_SCANNING.png.sha1
@@ -1 +1 @@ -76cd432172181365c5e82f77d14a883e2680e6f5 \ No newline at end of file +502bb4aab9bcf527d1dc1af71b2c62060386c6a3 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_SCANNING.png.sha1 b/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_SCANNING.png.sha1 index 6f6cd8c4..a1a87f3b 100644 --- a/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_SCANNING.png.sha1 +++ b/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_IN_PROGRESS_DOWNLOAD_SCANNING.png.sha1
@@ -1 +1 @@ -388582a0fda519d81adfc3c1f5ca6f476b3aae4a \ No newline at end of file +3b67e6d1ea127bb11ca40a829528b131ea5cb023 \ No newline at end of file
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc index c03108e..8e8aece 100644 --- a/ash/capture_mode/capture_mode_unittests.cc +++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -4778,7 +4778,8 @@ auto* projector_controller = ProjectorController::Get(); projector_controller->SetClient(&projector_client_); // Simulate the availability of speech recognition. - projector_controller->OnSpeechRecognitionAvailable(true); + projector_controller->OnSpeechRecognitionAvailabilityChanged( + SpeechRecognitionAvailability::kAvailable); window_ = CreateTestWindow(gfx::Rect(20, 30, 200, 200)); CaptureModeController::Get()->SetUserCaptureRegion(kUserRegion, /*by_user=*/true);
diff --git a/ash/components/device_activity/device_activity_client.cc b/ash/components/device_activity/device_activity_client.cc index 55be8c2f..b3635e2 100644 --- a/ash/components/device_activity/device_activity_client.cc +++ b/ash/components/device_activity/device_activity_client.cc
@@ -28,9 +28,7 @@ namespace { // Amount of time to wait before retriggering repeating timer. -// Currently we define it as 5 hours to align our protocol with Omahas -// device active reporting. -constexpr base::TimeDelta kTimeToRepeat = base::Hours(5); +constexpr base::TimeDelta kTimeToRepeat = base::Hours(1); // General upper bound of expected Fresnel response size in bytes. constexpr size_t kMaxFresnelResponseSizeBytes = 1 << 20; // 1MB;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 8ed43fd0..02b4fad 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -457,10 +457,6 @@ const base::Feature kEcheSWADebugMode{"EcheSWADebugMode", base::FEATURE_DISABLED_BY_DEFAULT}; -// If enabled, emoji suggestion will be shown when user type "space". -const base::Feature kEmojiSuggestAddition{"EmojiSuggestAddition", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Enables background blur for the app list, shelf, unified system tray, // autoclick menu, etc. Also enables the AppsGridView mask layer, slower devices // may have choppier app list animations while in this mode. crbug.com/765292. @@ -704,7 +700,7 @@ // content and transfer or access it later. const base::Feature kHoldingSpaceInProgressDownloadsNotificationSuppression{ "HoldingSpaceInProgressNotificationSuppression", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // Enables incognito profile integration with the productivity feature that // aims to reduce context switching by enabling users to collect content and
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 198878c..5bfb725 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -181,8 +181,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEcheSWAResizing; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEcheSWADebugMode; COMPONENT_EXPORT(ASH_CONSTANTS) -extern const base::Feature kEmojiSuggestAddition; -COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEnableBackgroundBlur; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEnableDesksTrackpadSwipeImprovements;
diff --git a/ash/display/display_configuration_observer.cc b/ash/display/display_configuration_observer.cc index 107dfe6..1aec7ae 100644 --- a/ash/display/display_configuration_observer.cc +++ b/ash/display/display_configuration_observer.cc
@@ -58,7 +58,6 @@ // TODO(oshima): Tablet mode defaults to mirror mode until we figure out // how to handle this scenario, and we shouldn't save this state. // https://crbug.com/733092. - save_preference_ = false; display::DisplayManager* display_manager = Shell::Get()->display_manager(); was_in_mirror_mode_ = display_manager->IsInMirrorMode(); display_manager->layout_store()->set_forced_mirror_mode_for_tablet(true); @@ -72,7 +71,6 @@ } display::DisplayManager* display_manager = Shell::Get()->display_manager(); display_manager->layout_store()->set_forced_mirror_mode_for_tablet(false); - save_preference_ = true; } } // namespace ash
diff --git a/ash/display/display_configuration_observer.h b/ash/display/display_configuration_observer.h index ea329720..494d8d5 100644 --- a/ash/display/display_configuration_observer.h +++ b/ash/display/display_configuration_observer.h
@@ -27,8 +27,6 @@ ~DisplayConfigurationObserver() override; - bool save_preference() const { return save_preference_; } - protected: // WindowTreeHostManager::Observer: void OnDisplaysInitialized() override; @@ -42,8 +40,6 @@ void StartMirrorMode(); void EndMirrorMode(); - bool save_preference_ = true; - // True if the device was in mirror mode before siwtching to tablet mode. bool was_in_mirror_mode_ = false;
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 38e0c27..56b24d20 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc
@@ -3155,14 +3155,14 @@ // restore. EXPECT_TRUE(display_manager()->external_display_mirror_info().empty()); - // Turn on tablet mode, and expect that it's not possible to persist the + // Turn on tablet mode, and expect that it can persist certain // display prefs while forced mirror mode is active. Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(display_manager()->IsInSoftwareMirrorMode()); EXPECT_TRUE( display_manager()->layout_store()->forced_mirror_mode_for_tablet()); - EXPECT_FALSE(Shell::Get()->ShouldSaveDisplaySettings()); + EXPECT_TRUE(Shell::Get()->ShouldSaveDisplaySettings()); // Forced mirror mode does not add external displays as candidates for mirror // restore. EXPECT_TRUE(display_manager()->external_display_mirror_info().empty()); @@ -3192,14 +3192,14 @@ // restore. EXPECT_TRUE(display_manager()->external_display_mirror_info().empty()); - // Turn on tablet mode, and expect that it's not possible to persist the + // Turn on tablet mode, and expect that it can persist certain // display prefs while forced mirror mode is active. Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(display_manager()->IsInSoftwareMirrorMode()); EXPECT_TRUE( display_manager()->layout_store()->forced_mirror_mode_for_tablet()); - EXPECT_FALSE(Shell::Get()->ShouldSaveDisplaySettings()); + EXPECT_TRUE(Shell::Get()->ShouldSaveDisplaySettings()); // Forced mirror mode does not add external displays as candidates for mirror // restore. EXPECT_TRUE(display_manager()->external_display_mirror_info().empty()); @@ -4590,7 +4590,7 @@ Shell::Get()->GetPrimaryRootWindow()->transform().TransformRect( &transformed_rect2); host_list[0]->window()->transform().TransformRect(&transformed_rect2); - // Use gfx::EncolosingRect because `transfored_rect2` has rounding errors: + // Use gfx::EncolosingRect because `transformed_rect2` has rounding errors: // 137.000000,0.000000 524.999939x699.999939 EXPECT_EQ(gfx::Rect(137.0f, 0.0f, 525.0f, 700.0f), gfx::ToEnclosingRect(transformed_rect2)); @@ -4616,8 +4616,7 @@ } } -// crbug.com/1003339 -TEST_F(DisplayManagerTest, DISABLED_SoftwareMirrorRotationForNonTablet) { +TEST_F(DisplayManagerTest, SoftwareMirrorRotationForNonTablet) { MirrorWindowTestApi test_api; UpdateDisplay("400x300,800x700"); @@ -4637,7 +4636,7 @@ Shell::Get()->GetPrimaryRootWindow()->transform().TransformRect( &transformed_rect1); host_list[0]->window()->transform().TransformRect(&transformed_rect1); - EXPECT_EQ(gfx::RectF(0.0f, 100.0f, 800.0f, 600.0f), transformed_rect1); + EXPECT_EQ(gfx::RectF(0.0f, 50.0f, 800.0f, 600.0f), transformed_rect1); // Rotate the source display by 90 degrees. UpdateDisplay("400x300/r,800x700"); @@ -4647,7 +4646,7 @@ host_list = test_api.GetHosts(); ASSERT_EQ(1U, host_list.size()); EXPECT_EQ(gfx::Size(800, 700), host_list[0]->GetBoundsInPixels().size()); - EXPECT_EQ(gfx::Size(400, 300), host_list[0]->window()->bounds().size()); + EXPECT_EQ(gfx::Size(300, 400), host_list[0]->window()->bounds().size()); // Test the target display's bounds after the transforms are applied. gfx::RectF transformed_rect2( @@ -4655,7 +4654,7 @@ Shell::Get()->GetPrimaryRootWindow()->transform().TransformRect( &transformed_rect2); host_list[0]->window()->transform().TransformRect(&transformed_rect2); - EXPECT_EQ(gfx::RectF(0.0f, 100.0f, 800.0f, 600.0f), transformed_rect2); + EXPECT_EQ(gfx::RectF(50.0f, 0.0f, 600.0f, 800.0f), transformed_rect2); // Change the bounds of the source display and rotate the source display by 90 // degrees. @@ -4666,7 +4665,7 @@ host_list = test_api.GetHosts(); ASSERT_EQ(1U, host_list.size()); EXPECT_EQ(gfx::Size(800, 700), host_list[0]->GetBoundsInPixels().size()); - EXPECT_EQ(gfx::Size(300, 400), host_list[0]->window()->bounds().size()); + EXPECT_EQ(gfx::Size(400, 300), host_list[0]->window()->bounds().size()); // Test the target display's bounds after the transforms are applied. gfx::RectF transformed_rect3( @@ -4674,7 +4673,9 @@ Shell::Get()->GetPrimaryRootWindow()->transform().TransformRect( &transformed_rect3); host_list[0]->window()->transform().TransformRect(&transformed_rect3); - EXPECT_EQ(gfx::RectF(100.0f, 0.0f, 600.0f, 800.0f), transformed_rect3); + // Use gfx::EncolosingRect because `transformed_rect3` has rounding errors. + EXPECT_EQ(gfx::Rect(0.0f, 137.0f, 700.0f, 525.0f), + gfx::ToEnclosingRect(transformed_rect3)); } TEST_F(DisplayManagerTest, DPSizeTest) {
diff --git a/ash/display/display_prefs.cc b/ash/display/display_prefs.cc index d007b28b..80eb663d 100644 --- a/ash/display/display_prefs.cc +++ b/ash/display/display_prefs.cc
@@ -12,6 +12,7 @@ #include "ash/constants/ash_switches.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" +#include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/command_line.h" #include "base/containers/contains.h" #include "base/strings/string_number_conversions.h" @@ -534,9 +535,26 @@ // size and modes can change depending on the combination of displays. if (display_manager->IsInUnifiedMode()) continue; - property_value.SetInteger("rotation", - static_cast<int>(info.GetRotation( - display::Display::RotationSource::USER))); + // Don't save rotation when in tablet mode, so that if the device is + // rebooted into clamshell mode, it won't have an unexpected rotation. + // https://crbug.com/733092. + // But we should keep any original value so that it can be restored when + // exiting tablet mode. + if (Shell::Get()->tablet_mode_controller()->InTabletMode()) { + const base::Value* original_property = + pref_data->FindDictKey(base::NumberToString(id)); + if (original_property) { + absl::optional<int> original_rotation = + original_property->FindIntKey("rotation"); + if (original_rotation) { + property_value.SetInteger("rotation", *original_rotation); + } + } + } else { + property_value.SetInteger("rotation", + static_cast<int>(info.GetRotation( + display::Display::RotationSource::USER))); + } display::ManagedDisplayMode mode; if (!display.IsInternal() && @@ -812,12 +830,16 @@ } store_requested_ = false; - StoreCurrentDisplayLayoutPrefs(local_state_); + // Don't save certain display properties when in tablet mode, so if + // the device is rebooted in clamshell mode, it won't have an unexpected + // mirroring layout. https://crbug.com/733092. + if (!Shell::Get()->tablet_mode_controller()->InTabletMode()) { + StoreCurrentDisplayLayoutPrefs(local_state_); + StoreExternalDisplayMirrorInfo(local_state_); + StoreCurrentDisplayMixedMirrorModeParams(local_state_); + } StoreCurrentDisplayProperties(local_state_); StoreDisplayTouchAssociations(local_state_); - StoreExternalDisplayMirrorInfo(local_state_); - StoreCurrentDisplayMixedMirrorModeParams(local_state_); - // The display prefs need to be committed immediately to guarantee they're not // lost, and are restored properly on reboot. https://crbug.com/936884. // This sends a request via mojo to commit the prefs to disk.
diff --git a/ash/display/display_prefs_unittest.cc b/ash/display/display_prefs_unittest.cc index c25d6871..c27415e 100644 --- a/ash/display/display_prefs_unittest.cc +++ b/ash/display/display_prefs_unittest.cc
@@ -27,11 +27,13 @@ #include "base/memory/ptr_util.h" #include "base/numerics/math_constants.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/test/scoped_feature_list.h" #include "base/values.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/prefs/testing_pref_service.h" #include "components/user_manager/user_type.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/display/display_layout_builder.h" #include "ui/display/display_switches.h" @@ -49,6 +51,10 @@ namespace ash { +using testing::DoubleEq; +using testing::ElementsAre; +using testing::Optional; + namespace { const char kPrimaryIdKey[] = "primary-id"; @@ -234,6 +240,65 @@ .ToString(); } + const base::DictionaryValue* ReadPropertiesForDisplay(int64_t display_id) { + const base::DictionaryValue* properties = + local_state()->GetDictionary(prefs::kDisplayProperties); + EXPECT_TRUE(properties); + const base::DictionaryValue* property = nullptr; + EXPECT_TRUE( + properties->GetDictionary(base::NumberToString(display_id), &property)); + return property; + } + + void ExpectMixedMirrorModeParamsPrefs( + int64_t source_id, + const display::DisplayIdList& dest_ids) { + std::vector<std::string> expected_dest_id_strs; + for (const int64_t id : dest_ids) { + expected_dest_id_strs.push_back(base::NumberToString(id)); + } + SCOPED_TRACE(testing::Message() + << "Expected to read kDisplayMixedMirrorModeParams with " + "mirroring_source_id=" + << source_id << " and mirroring_destination_ids=" + << base::JoinString(expected_dest_id_strs, ",")); + const base::DictionaryValue* prefs = + local_state()->GetDictionary(prefs::kDisplayMixedMirrorModeParams); + ASSERT_TRUE(prefs); + EXPECT_THAT(prefs->FindStringKey("mirroring_source_id"), + testing::Pointee(base::NumberToString(source_id))); + const auto* mirror_ids = prefs->FindListKey("mirroring_destination_ids"); + ASSERT_TRUE(mirror_ids); + display::DisplayIdList pref_dest_ids; + for (const auto& value : mirror_ids->GetList()) { + int64_t id; + EXPECT_TRUE(base::StringToInt64(value.GetString(), &id)); + pref_dest_ids.push_back(id); + } + EXPECT_EQ(pref_dest_ids, dest_ids); + } + + void ExpectExternalDisplayMirrorPrefs(const std::set<int64_t>& display_ids) { + std::vector<std::string> expected_display_id_strs; + for (const int64_t id : display_ids) { + expected_display_id_strs.push_back(base::NumberToString(id)); + } + SCOPED_TRACE( + testing::Message() + << "Expected to read kExternalDisplayMirrorInfo with list values=" + << base::JoinString(expected_display_id_strs, ",")); + const base::Value* prefs = + local_state()->Get(prefs::kExternalDisplayMirrorInfo); + ASSERT_TRUE(prefs); + std::set<int64_t> read_ids; + for (const auto& value : prefs->GetList()) { + int64_t id; + EXPECT_TRUE(base::StringToInt64(value.GetString(), &id)); + read_ids.insert(id); + } + EXPECT_EQ(read_ids, display_ids); + } + display::DisplayConfigurator* display_configurator() { return Shell::Get()->display_configurator(); } @@ -1534,4 +1599,235 @@ EXPECT_TRUE(pref_data->DictEmpty()); } +TEST_F(DisplayPrefsTest, SaveTabletModeWithSingleDisplay) { + UpdateDisplay("480x320/r@1.25"); + + const int64_t id0 = display::test::DisplayManagerTestApi(display_manager()) + .SetFirstDisplayAsInternalDisplay(); + + EXPECT_FALSE(Shell::Get()->tablet_mode_controller()->InTabletMode()); + const base::DictionaryValue* properties = ReadPropertiesForDisplay(id0); + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.25f))); + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_90))); + + LoggedInAsUser(); + + // Turn on tablet mode. + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(Shell::Get()->tablet_mode_controller()->InTabletMode()); + + // Change display settings. + display_manager()->UpdateZoomFactor(id0, 1.5); + display_manager()->SetDisplayRotation(id0, display::Display::ROTATE_270, + display::Display::RotationSource::USER); + // Verify the settings have been changed. + EXPECT_FLOAT_EQ(display_manager()->GetDisplayInfo(id0).zoom_factor(), 1.5); + EXPECT_EQ(display_manager()->GetDisplayInfo(id0).GetActiveRotation(), + display::Display::ROTATE_270); + + properties = ReadPropertiesForDisplay(id0); + // Zoom pref should store the new value. + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.5f))); + // Rotation pref should remain at the original value. + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_90))); + + // Turn off tablet mode. + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(false); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(Shell::Get()->tablet_mode_controller()->InTabletMode()); + // Zoom should stay at the new value. + EXPECT_FLOAT_EQ(display_manager()->GetDisplayInfo(id0).zoom_factor(), 1.5); + // Rotation should restore to the original value. + EXPECT_EQ(display_manager()->GetDisplayInfo(id0).GetActiveRotation(), + display::Display::ROTATE_90); + + properties = ReadPropertiesForDisplay(id0); + // Zoom pref should keep the new value. + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.5f))); + // Rotation pref should remain at the original value. + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_90))); +} + +TEST_F(DisplayPrefsTest, SaveTabletModeWithMixedExternalDisplays) { + UpdateDisplay("480x320/r@1.25,640x480/l@1.3,320x240@1.2"); + + display::DisplayIdList ids = display_manager()->GetCurrentDisplayIdList(); + display::test::DisplayManagerTestApi(display_manager()) + .SetFirstDisplayAsInternalDisplay(); + + // Set up mixed mirror mode. (Mirror from the first display to the second + // display, and extend to third display) + const display::MixedMirrorModeParams mixed_params(ids[0], {ids[1]}); + display_manager()->SetMirrorMode(display::MirrorMode::kMixed, mixed_params); + EXPECT_TRUE(display_manager()->IsInSoftwareMirrorMode()); + EXPECT_EQ(display_manager()->mirroring_source_id(), ids[0]); + EXPECT_THAT(display_manager()->GetMirroringDestinationDisplayIdList(), + ElementsAre(ids[1])); + // Mixed mirror mode params are properly set. + const auto& initial_mixed_params = + display_manager()->mixed_mirror_mode_params(); + ASSERT_TRUE(initial_mixed_params); + EXPECT_EQ(initial_mixed_params->source_id, mixed_params.source_id); + EXPECT_EQ(initial_mixed_params->destination_ids, + mixed_params.destination_ids); + const std::set<int64_t> old_ext_mirror_info = + display_manager()->external_display_mirror_info(); + EXPECT_FALSE(old_ext_mirror_info.empty()); + // Mixed mirror mode params prefs are properly saved. + ExpectMixedMirrorModeParamsPrefs(ids[0], {ids[1]}); + ExpectExternalDisplayMirrorPrefs(old_ext_mirror_info); + + EXPECT_FALSE(Shell::Get()->tablet_mode_controller()->InTabletMode()); + const base::DictionaryValue* properties = nullptr; + + // Verify initial stored display prefs. + properties = ReadPropertiesForDisplay(ids[0]); + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.25f))); + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_90))); + + properties = ReadPropertiesForDisplay(ids[1]); + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.3f))); + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_270))); + + properties = ReadPropertiesForDisplay(ids[2]); + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.2f))); + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_0))); + + LoggedInAsUser(); + + // Turn on tablet mode and make display changes. + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(Shell::Get()->tablet_mode_controller()->InTabletMode()); + EXPECT_TRUE(display_manager()->IsInSoftwareMirrorMode()); + EXPECT_EQ(display_manager()->mirroring_source_id(), ids[0]); + EXPECT_THAT(display_manager()->GetMirroringDestinationDisplayIdList(), + ElementsAre(ids[1], ids[2])); + // Tablet mode forces normal mirror mode, so mixed params is empty. + EXPECT_EQ(display_manager()->mixed_mirror_mode_params(), absl::nullopt); + EXPECT_EQ(display_manager()->external_display_mirror_info(), + old_ext_mirror_info); + // Mixed mirror mode params pref should remain at the original value. + ExpectMixedMirrorModeParamsPrefs(ids[0], {ids[1]}); + ExpectExternalDisplayMirrorPrefs(old_ext_mirror_info); + + // Make changes to the display and verify. + display_manager()->UpdateZoomFactor(ids[0], 1.5); + display_manager()->SetDisplayRotation(ids[0], display::Display::ROTATE_180, + display::Display::RotationSource::USER); + EXPECT_FLOAT_EQ(display_manager()->GetDisplayInfo(ids[0]).zoom_factor(), 1.5); + EXPECT_EQ(display_manager()->GetDisplayInfo(ids[0]).GetActiveRotation(), + display::Display::ROTATE_180); + + // Simulate a reboot. + LoadDisplayPreferences(); + display_manager()->UpdateDisplays(); + + // Things should stay in tablet mode. + EXPECT_TRUE(Shell::Get()->tablet_mode_controller()->InTabletMode()); + EXPECT_TRUE(display_manager()->IsInSoftwareMirrorMode()); + EXPECT_EQ(display_manager()->mirroring_source_id(), ids[0]); + // Currently, restarting in tablet mode reverts back to the original mixed + // mirror mode, which may be surprising to users. This should be revisited by + // crbug.com/733092. + EXPECT_THAT(display_manager()->GetMirroringDestinationDisplayIdList(), + ElementsAre(ids[1])); + const auto& loaded_mixed_params = + display_manager()->mixed_mirror_mode_params(); + ASSERT_TRUE(loaded_mixed_params); + EXPECT_EQ(loaded_mixed_params->source_id, mixed_params.source_id); + EXPECT_EQ(loaded_mixed_params->destination_ids, mixed_params.destination_ids); + EXPECT_EQ(display_manager()->external_display_mirror_info(), + old_ext_mirror_info); + // Mixed mirror mode params pref should remain at the original value. + ExpectMixedMirrorModeParamsPrefs(ids[0], {ids[1]}); + ExpectExternalDisplayMirrorPrefs(old_ext_mirror_info); + + // Check stored and loaded display prefs. + properties = ReadPropertiesForDisplay(ids[0]); + // Zoom factor should persist the new value. + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.5f))); + EXPECT_FLOAT_EQ(display_manager()->GetDisplayInfo(ids[0]).zoom_factor(), 1.5); + // Rotation should remain at the original value. + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_90))); + EXPECT_EQ(display_manager()->GetDisplayInfo(ids[0]).GetActiveRotation(), + display::Display::ROTATE_90); + + // Properties for the second display shouldn't change. + properties = ReadPropertiesForDisplay(ids[1]); + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.3f))); + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_270))); + + // Properties for the third display shouldn't change. + properties = ReadPropertiesForDisplay(ids[2]); + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.2f))); + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_0))); + + // Turn off tablet mode. + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(false); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(Shell::Get()->tablet_mode_controller()->InTabletMode()); + EXPECT_TRUE(display_manager()->IsInSoftwareMirrorMode()); + EXPECT_EQ(display_manager()->mirroring_source_id(), ids[0]); + EXPECT_THAT(display_manager()->GetMirroringDestinationDisplayIdList(), + ElementsAre(ids[1])); + // Original mixed mirror mode params are preserved. + const auto& restored_mixed_params = + display_manager()->mixed_mirror_mode_params(); + ASSERT_TRUE(restored_mixed_params); + EXPECT_EQ(restored_mixed_params->source_id, mixed_params.source_id); + EXPECT_EQ(restored_mixed_params->destination_ids, + mixed_params.destination_ids); + EXPECT_EQ(display_manager()->external_display_mirror_info(), + old_ext_mirror_info); + // Mixed mirror mode params pref should remain at the original value. + ExpectMixedMirrorModeParamsPrefs(ids[0], {ids[1]}); + ExpectExternalDisplayMirrorPrefs(old_ext_mirror_info); + + // Check restored display prefs. + properties = ReadPropertiesForDisplay(ids[0]); + // Zoom factor should remain at the new value. + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.5f))); + EXPECT_FLOAT_EQ(display_manager()->GetDisplayInfo(ids[0]).zoom_factor(), 1.5); + // Rotation should be restored to the original value. + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_90))); + EXPECT_EQ(display_manager()->GetDisplayInfo(ids[0]).GetActiveRotation(), + display::Display::ROTATE_90); + + // Properties for the second display shouldn't change. + properties = ReadPropertiesForDisplay(ids[1]); + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.3f))); + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_270))); + + // Properties for the third display shouldn't change. + properties = ReadPropertiesForDisplay(ids[2]); + EXPECT_THAT(properties->FindDoubleKey("display_zoom_factor"), + Optional(DoubleEq(1.2f))); + EXPECT_THAT(properties->FindIntKey("rotation"), + Optional(static_cast<int>(display::Display::ROTATE_0))); +} + } // namespace ash
diff --git a/ash/projector/projector_controller_impl.cc b/ash/projector/projector_controller_impl.cc index 421ece77..e877701b 100644 --- a/ash/projector/projector_controller_impl.cc +++ b/ash/projector/projector_controller_impl.cc
@@ -119,14 +119,15 @@ client_ = client; } -void ProjectorControllerImpl::OnSpeechRecognitionAvailable(bool available) { +void ProjectorControllerImpl::OnSpeechRecognitionAvailabilityChanged( + SpeechRecognitionAvailability availability) { if (ProjectorController::AreExtendedProjectorFeaturesDisabled()) return; - if (available == is_speech_recognition_available_) + if (availability == speech_recognition_availability_) return; - is_speech_recognition_available_ = available; + speech_recognition_availability_ = availability; OnNewScreencastPreconditionChanged(); } @@ -150,7 +151,8 @@ } bool ProjectorControllerImpl::IsEligible() const { - return is_speech_recognition_available_ || + return speech_recognition_availability_ == + SpeechRecognitionAvailability::kAvailable || ProjectorController::AreExtendedProjectorFeaturesDisabled(); } @@ -294,7 +296,8 @@ if (ProjectorController::AreExtendedProjectorFeaturesDisabled()) return; - DCHECK(is_speech_recognition_available_); + DCHECK(speech_recognition_availability_ == + SpeechRecognitionAvailability::kAvailable); DCHECK(!is_speech_recognition_on_); DCHECK_NE(client_, nullptr); client_->StartSpeechRecognition(); @@ -305,7 +308,8 @@ if (ProjectorController::AreExtendedProjectorFeaturesDisabled()) return; - DCHECK(is_speech_recognition_available_); + DCHECK(speech_recognition_availability_ == + SpeechRecognitionAvailability::kAvailable); DCHECK(is_speech_recognition_on_); DCHECK_NE(client_, nullptr); client_->StopSpeechRecognition();
diff --git a/ash/projector/projector_controller_impl.h b/ash/projector/projector_controller_impl.h index a5fb696a..2eb794c 100644 --- a/ash/projector/projector_controller_impl.h +++ b/ash/projector/projector_controller_impl.h
@@ -45,7 +45,8 @@ // ProjectorController: void StartProjectorSession(const std::string& storage_dir) override; void SetClient(ProjectorClient* client) override; - void OnSpeechRecognitionAvailable(bool available) override; + void OnSpeechRecognitionAvailabilityChanged( + SpeechRecognitionAvailability availability) override; void OnTranscription(const media::SpeechRecognitionResult& result) override; void OnTranscriptionError() override; bool IsEligible() const override; @@ -149,7 +150,8 @@ bool is_caption_on_ = false; // Whether SODA is available on the device. - bool is_speech_recognition_available_ = false; + SpeechRecognitionAvailability speech_recognition_availability_ = + SpeechRecognitionAvailability::kOnDeviceSpeechRecognitionNotSupported; // Whether speech recognition is taking place or not. bool is_speech_recognition_on_ = false;
diff --git a/ash/projector/projector_controller_unittest.cc b/ash/projector/projector_controller_unittest.cc index 1d0e6fa9..16acba9e 100644 --- a/ash/projector/projector_controller_unittest.cc +++ b/ash/projector/projector_controller_unittest.cc
@@ -90,7 +90,8 @@ std::move(mock_metadata_controller)); controller_->SetClient(&mock_client_); - controller_->OnSpeechRecognitionAvailable(/*available=*/true); + controller_->OnSpeechRecognitionAvailabilityChanged( + SpeechRecognitionAvailability::kAvailable); } protected: @@ -148,11 +149,13 @@ NotifyControllerForPartialSpeechResult(controller_); } -TEST_F(ProjectorControllerTest, OnSpeechRecognitionAvailable) { - controller_->OnSpeechRecognitionAvailable(true); +TEST_F(ProjectorControllerTest, OnSpeechRecognitionAvailabilityChanged) { + controller_->OnSpeechRecognitionAvailabilityChanged( + SpeechRecognitionAvailability::kAvailable); EXPECT_TRUE(controller_->IsEligible()); - controller_->OnSpeechRecognitionAvailable(false); + controller_->OnSpeechRecognitionAvailabilityChanged( + SpeechRecognitionAvailability::kOnDeviceSpeechRecognitionNotSupported); EXPECT_FALSE(controller_->IsEligible()); }
diff --git a/ash/projector/projector_ui_controller_unittest.cc b/ash/projector/projector_ui_controller_unittest.cc index 0c84f331..31753b9 100644 --- a/ash/projector/projector_ui_controller_unittest.cc +++ b/ash/projector/projector_ui_controller_unittest.cc
@@ -274,8 +274,8 @@ MockProjectorClient mock_client; Shell::Get()->projector_controller()->SetClient(&mock_client); - Shell::Get()->projector_controller()->OnSpeechRecognitionAvailable( - /*available=*/true); + Shell::Get()->projector_controller()->OnSpeechRecognitionAvailabilityChanged( + SpeechRecognitionAvailability::kAvailable); Shell::Get()->projector_controller()->OnRecordingStarted(); histogram_tester.ExpectUniqueSample(
diff --git a/ash/public/cpp/app_list/app_list_controller.h b/ash/public/cpp/app_list/app_list_controller.h index 47ae9c91..a8658ab 100644 --- a/ash/public/cpp/app_list/app_list_controller.h +++ b/ash/public/cpp/app_list/app_list_controller.h
@@ -82,6 +82,10 @@ // Returns whether the AppList is visible on any display. virtual bool IsVisible() = 0; + // Called when the app list temporary sort order changes. + virtual void OnTemporarySortOrderChanged( + const absl::optional<AppListSortOrder>& new_order) = 0; + protected: AppListController(); virtual ~AppListController();
diff --git a/ash/public/cpp/projector/projector_controller.h b/ash/public/cpp/projector/projector_controller.h index d7ca767..9bf25fde1 100644 --- a/ash/public/cpp/projector/projector_controller.h +++ b/ash/public/cpp/projector/projector_controller.h
@@ -19,6 +19,21 @@ class ProjectorClient; +// Enum class used to notify the ProjectorController on the availability of +// speech recognition. +enum class ASH_PUBLIC_EXPORT SpeechRecognitionAvailability { + // Device does not support SODA (Speech on Device API) + kOnDeviceSpeechRecognitionNotSupported, + // User's language is not supported by SODA. + kUserLanguageNotSupported, + // SODA binary is not yet installed. + kSodaNotInstalled, + // SODA binary and language packs are downloading. + kSodaInstalling, + // SODA is available to be used. + kAvailable +}; + // Interface to control projector in ash. class ASH_PUBLIC_EXPORT ProjectorController { public: @@ -43,7 +58,8 @@ virtual void SetClient(ProjectorClient* client) = 0; // Called when speech recognition using SODA is available. - virtual void OnSpeechRecognitionAvailable(bool available) = 0; + virtual void OnSpeechRecognitionAvailabilityChanged( + SpeechRecognitionAvailability availability) = 0; // Called when transcription result from mic input is ready. virtual void OnTranscription(
diff --git a/ash/public/cpp/test/app_list_test_api.h b/ash/public/cpp/test/app_list_test_api.h index ce86d9c893..01502116 100644 --- a/ash/public/cpp/test/app_list_test_api.h +++ b/ash/public/cpp/test/app_list_test_api.h
@@ -32,9 +32,14 @@ AppListModel* GetAppListModel(); // Waits for the bubble launcher window to open on the primary display. - // See AppListBubblePresenter::Show(). Only used with productivity launcher - // in clamshell mode. - void WaitForBubbleWindow(); + // `wait_for_opening_animation` indicates whether to wait for the window + // opening animation. See AppListBubblePresenter::Show(). Only used with + // productivity launcher in clamshell mode. + void WaitForBubbleWindow(bool wait_for_opening_animation); + + // Waits until all the animations on the app list widget end. No operations + // if the app list widget is already idle. + void WaitUntilAppListAnimationIdle(); // Returns whether there is an item for |app_id|. bool HasApp(const std::string& app_id); @@ -74,12 +79,17 @@ // Updates the paged view structure. void UpdatePagedViewStructure(); - // Returns the view able to trigger app list sort with `order`. - views::View* GetViewForAppListSort(AppListSortOrder order); - // Returns the top level apps grid view. Could be ScrollableAppsGridView if // bubble launcher is enabled or PagedAppsGridView otherwise. AppsGridView* GetTopLevelAppsGridView(); + + // Returns the app list bubble's undo button that reverts the temporary + // sorting order when triggered. + views::View* GetBubbleReorderUndoButton(); + + // Returns the visibility of the app list bubble's undo toast where the undo + // button is located. + bool GetBubbleReorderUndoToastVisibility() const; }; } // namespace ash
diff --git a/ash/public/cpp/test/mock_projector_controller.h b/ash/public/cpp/test/mock_projector_controller.h index 034ecda8..f5e6f7d6 100644 --- a/ash/public/cpp/test/mock_projector_controller.h +++ b/ash/public/cpp/test/mock_projector_controller.h
@@ -20,7 +20,8 @@ // ProjectorController: MOCK_METHOD1(StartProjectorSession, void(const std::string& storageDir)); MOCK_METHOD1(SetClient, void(ash::ProjectorClient* client)); - MOCK_METHOD1(OnSpeechRecognitionAvailable, void(bool available)); + MOCK_METHOD1(OnSpeechRecognitionAvailabilityChanged, + void(SpeechRecognitionAvailability availability)); MOCK_METHOD1(OnTranscription, void(const media::SpeechRecognitionResult& result)); MOCK_METHOD0(OnTranscriptionError, void());
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.cc index 2cff41c..d36d717f 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.cc
@@ -10,7 +10,6 @@ #include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.h" #include "base/callback.h" #include "base/memory/singleton.h" -#include "base/no_destructor.h" #include "device/bluetooth/bluetooth_adapter.h" namespace ash { @@ -22,8 +21,7 @@ // static FastPairHandshakeLookup* FastPairHandshakeLookup::GetInstance() { - static base::NoDestructor<FastPairHandshakeLookup> instance; - return instance.get(); + return base::Singleton<FastPairHandshakeLookup>::get(); } // static
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h index a90d9c6..84be4024 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h
@@ -12,6 +12,7 @@ #include "base/callback_forward.h" #include "base/containers/flat_map.h" #include "base/memory/scoped_refptr.h" +#include "base/memory/singleton.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace device { @@ -39,10 +40,8 @@ static FastPairHandshakeLookup* GetInstance(); static void SetCreateFunctionForTesting(CreateFunction create_function); - FastPairHandshakeLookup(); FastPairHandshakeLookup(const FastPairHandshakeLookup&) = delete; FastPairHandshakeLookup& operator=(const FastPairHandshakeLookup&) = delete; - virtual ~FastPairHandshakeLookup(); // Get an existing instance for |device|. FastPairHandshake* Get(scoped_refptr<Device> device); @@ -56,7 +55,13 @@ scoped_refptr<Device> device, OnCompleteCallback on_complete); + protected: + FastPairHandshakeLookup(); + virtual ~FastPairHandshakeLookup(); + private: + friend struct base::DefaultSingletonTraits<FastPairHandshakeLookup>; + base::flat_map<scoped_refptr<Device>, std::unique_ptr<FastPairHandshake>> fast_pair_handshakes_; };
diff --git a/ash/quick_pair/keyed_service/BUILD.gn b/ash/quick_pair/keyed_service/BUILD.gn index 2bf156e..511b8b8f 100644 --- a/ash/quick_pair/keyed_service/BUILD.gn +++ b/ash/quick_pair/keyed_service/BUILD.gn
@@ -23,6 +23,7 @@ deps = [ "//ash/quick_pair/common", + "//ash/quick_pair/fast_pair_handshake", "//ash/quick_pair/feature_status_tracker", "//ash/quick_pair/message_stream", "//ash/quick_pair/pairing",
diff --git a/ash/quick_pair/keyed_service/quick_pair_mediator.cc b/ash/quick_pair/keyed_service/quick_pair_mediator.cc index 7776a9c..519f313 100644 --- a/ash/quick_pair/keyed_service/quick_pair_mediator.cc +++ b/ash/quick_pair/keyed_service/quick_pair_mediator.cc
@@ -9,6 +9,7 @@ #include "ash/quick_pair/common/device.h" #include "ash/quick_pair/common/logging.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h" #include "ash/quick_pair/feature_status_tracker/fast_pair_pref_enabled_provider.h" #include "ash/quick_pair/feature_status_tracker/quick_pair_feature_status_tracker.h" #include "ash/quick_pair/feature_status_tracker/quick_pair_feature_status_tracker_impl.h" @@ -132,7 +133,8 @@ void Mediator::OnDeviceLost(scoped_refptr<Device> device) { QP_LOG(INFO) << __func__ << ": " << device; - ui_broker_->RemoveNotifications(std::move(device)); + ui_broker_->RemoveNotifications(device); + FastPairHandshakeLookup::GetInstance()->Erase(device); } void Mediator::OnRetroactivePairFound(scoped_refptr<Device> device) {
diff --git a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer.cc b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer.cc index 252b8be..056208f9 100644 --- a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer.cc +++ b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer.cc
@@ -4,6 +4,8 @@ #include "ash/quick_pair/pairing/fast_pair/fast_pair_pairer.h" +#include <memory> + #include "ash/public/cpp/system_tray_client.h" #include "ash/quick_pair/common/account_key_failure.h" #include "ash/quick_pair/common/device.h" @@ -13,10 +15,13 @@ #include "ash/quick_pair/fast_pair_handshake/fast_pair_data_encryptor.h" #include "ash/quick_pair/fast_pair_handshake/fast_pair_data_encryptor_impl.h" #include "ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h" #include "ash/quick_pair/repository/fast_pair_repository.h" #include "ash/services/quick_pair/public/cpp/fast_pair_message_type.h" #include "ash/shell.h" #include "ash/system/model/system_tray_model.h" +#include "base/bind.h" #include "base/callback.h" #include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_device.h" @@ -97,116 +102,39 @@ (*additional_data)[0] == 1) { Shell::Get()->system_tray_model()->client()->ShowBluetoothPairingDialog( device_->ble_address); - } else { - fast_pair_gatt_service_client_ = - FastPairGattServiceClientImpl::Factory::Create( - adapter_->GetDevice(device_->ble_address), adapter_, - base::BindRepeating( - &FastPairPairer::OnGattClientInitializedCallback, - weak_ptr_factory_.GetWeakPtr())); - } -} - -FastPairPairer::~FastPairPairer() { - adapter_->RemovePairingDelegate(this); -} - -void FastPairPairer::OnGattClientInitializedCallback( - absl::optional<PairFailure> failure) { - if (failure) { - std::move(pair_failed_callback_).Run(device_, failure.value()); return; } - FastPairDataEncryptorImpl::Factory::CreateAsync( - device_, base::BindOnce(&FastPairPairer::OnDataEncryptorCreateAsync, - weak_ptr_factory_.GetWeakPtr())); -} + fast_pair_handshake_ = FastPairHandshakeLookup::GetInstance()->Get(device_); -void FastPairPairer::OnDataEncryptorCreateAsync( - std::unique_ptr<FastPairDataEncryptor> fast_pair_data_encryptor) { - if (!fast_pair_data_encryptor) { - QP_LOG(WARNING) << "Fast Pair Data Encryptor failed to be created."; - std::move(pair_failed_callback_) - .Run(device_, PairFailure::kDataEncryptorRetrieval); - return; - } - fast_pair_data_encryptor_ = std::move(fast_pair_data_encryptor); - QP_LOG(VERBOSE) << "Fast Pair GATT service client initialization successful."; - - switch (device_->protocol) { - case Protocol::kFastPairInitial: - case Protocol::kFastPairSubsequent: - fast_pair_gatt_service_client_->WriteRequestAsync( - /*message_type=*/0x00, - /*flags=*/0x00, - /*provider_address=*/device_->ble_address, - /*seekers_address=*/"", fast_pair_data_encryptor_.get(), - base::BindOnce(&FastPairPairer::OnWriteResponse, - weak_ptr_factory_.GetWeakPtr())); - break; - case Protocol::kFastPairRetroactive: - // The different flag in this raw request tells the device we are going - // to retroactively write an account key. - fast_pair_gatt_service_client_->WriteRequestAsync( - /*message_type=*/0x00, - /*flags=*/0x10, - /*provider_address=*/device_->ble_address, - /*seekers_address=*/adapter_->GetAddress(), - fast_pair_data_encryptor_.get(), - base::BindOnce(&FastPairPairer::OnWriteResponse, - weak_ptr_factory_.GetWeakPtr())); - break; - } -} - -void FastPairPairer::OnWriteResponse(std::vector<uint8_t> response_bytes, - absl::optional<PairFailure> failure) { - if (failure) { - std::move(pair_failed_callback_).Run(device_, failure.value()); + if (!fast_pair_handshake_) { + QP_LOG(INFO) << __func__ + << ": Failed to find handshake. This is only valid if we " + "lost the device before this class executed."; return; } - fast_pair_data_encryptor_->ParseDecryptedResponse( - response_bytes, base::BindOnce(&FastPairPairer::OnParseDecryptedResponse, - weak_ptr_factory_.GetWeakPtr())); -} + DCHECK(fast_pair_handshake_->completed_successfully()); -void FastPairPairer::OnParseDecryptedResponse( - const absl::optional<DecryptedResponse>& response) { - if (!response) { - QP_LOG(WARNING) << "Missing decrypted response from parse."; - std::move(pair_failed_callback_) - .Run(device_, PairFailure::kKeybasedPairingResponseDecryptFailure); - return; - } + std::string device_address = device_->classic_address().value(); + device::BluetoothDevice* bt_device = adapter_->GetDevice(device_address); - if (response->message_type != FastPairMessageType::kKeyBasedPairingResponse) { - QP_LOG(WARNING) << "Incorrect message type from decrypted response."; - std::move(pair_failed_callback_) - .Run(device_, PairFailure::kIncorrectKeyBasedPairingResponseType); - return; - } - - std::string device_address = - device::CanonicalizeBluetoothAddress(response->address_bytes); - device_->set_classic_address(device_address); - - device::BluetoothDevice* device = adapter_->GetDevice(device_address); switch (device_->protocol) { case Protocol::kFastPairInitial: case Protocol::kFastPairSubsequent: // Now that we have validated the decrypted response, we can attempt to - // retrieve the device from the adapter by the address. If we are able to - // retrieve the device in this way, we can pair directly. Often, we will - // not be able to find the device this way, and we will have to connect - // via address and add ourselves as a pairing delegate. + // retrieve the device from the adapter by the address. If we are able + // to retrieve the device in this way, we can pair directly. Often, we + // will not be able to find the device this way, and we will have to + // connect via address and add ourselves as a pairing delegate. + QP_LOG(VERBOSE) << "Key-based pairing changed. Address: " << device_address << ". Found device: " << ((device != nullptr) ? "Yes" : "No") << "."; - if (device) { - device->Pair(this, base::BindOnce(&FastPairPairer::OnPairConnected, - weak_ptr_factory_.GetWeakPtr())); + + if (bt_device) { + bt_device->Pair(this, base::BindOnce(&FastPairPairer::OnPairConnected, + weak_ptr_factory_.GetWeakPtr())); } else { adapter_->AddPairingDelegate( this, device::BluetoothAdapter::PairingDelegatePriority:: @@ -229,6 +157,10 @@ } } +FastPairPairer::~FastPairPairer() { + adapter_->RemovePairingDelegate(this); +} + void FastPairPairer::OnPairConnected( absl::optional<device::BluetoothDevice::ConnectErrorCode> error) { if (error) { @@ -255,9 +187,9 @@ uint32_t passkey) { pairing_device_address_ = device->GetAddress(); expected_passkey_ = passkey; - fast_pair_gatt_service_client_->WritePasskeyAsync( + fast_pair_handshake_->fast_pair_gatt_service_client()->WritePasskeyAsync( /*message_type=*/0x02, /*passkey=*/expected_passkey_, - fast_pair_data_encryptor_.get(), + fast_pair_handshake_->fast_pair_data_encryptor(), base::BindOnce(&FastPairPairer::OnPasskeyResponse, weak_ptr_factory_.GetWeakPtr())); } @@ -269,7 +201,7 @@ return; } - fast_pair_data_encryptor_->ParseDecryptedPasskey( + fast_pair_handshake_->fast_pair_data_encryptor()->ParseDecryptedPasskey( response_bytes, base::BindOnce(&FastPairPairer::OnParseDecryptedPasskey, weak_ptr_factory_.GetWeakPtr())); } @@ -329,8 +261,8 @@ RAND_bytes(account_key.data(), account_key.size()); account_key[0] = 0x04; - fast_pair_gatt_service_client_->WriteAccountKey( - account_key, fast_pair_data_encryptor_.get(), + fast_pair_handshake_->fast_pair_gatt_service_client()->WriteAccountKey( + account_key, fast_pair_handshake_->fast_pair_data_encryptor(), base::BindOnce(&FastPairPairer::OnWriteAccountKey, weak_ptr_factory_.GetWeakPtr(), account_key)); }
diff --git a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer.h b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer.h index 1da5d218..6865967 100644 --- a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer.h +++ b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer.h
@@ -29,6 +29,7 @@ enum class AccountKeyFailure; enum class PairFailure; class FastPairDataEncryptor; +class FastPairHandshake; // A FastPairPairer instance is responsible for the pairing procedure to a // single device. Pairing begins on instantiation. @@ -69,23 +70,6 @@ device::BluetoothDevice* device, bool new_paired_status) override; - // FastPairGattServiceClientImpl::Factory::Create callback - void OnGattClientInitializedCallback(absl::optional<PairFailure> failure); - - // FastPairDataEncryptor::Factory::CreateAsync callback - // Once the data encryptor is created, triggers a WriteRequestAsync in the - // client to be encrypted with the DataEncryptor and written to the device. - void OnDataEncryptorCreateAsync( - std::unique_ptr<FastPairDataEncryptor> fast_pair_data_encryptor); - - // FastPairGattServiceClient::WriteRequest callback - void OnWriteResponse(std::vector<uint8_t> response_bytes, - absl::optional<PairFailure> failure); - - // FastPairDataEncryptor::ParseDecryptedResponse callback - void OnParseDecryptedResponse( - const absl::optional<DecryptedResponse>& response); - // device::BluetoothDevice::Pair callback void OnPairConnected( absl::optional<device::BluetoothDevice::ConnectErrorCode> error); @@ -120,8 +104,7 @@ base::OnceCallback<void(scoped_refptr<Device>, AccountKeyFailure)> account_key_failure_callback_; base::OnceCallback<void(scoped_refptr<Device>)> pairing_procedure_complete_; - std::unique_ptr<FastPairDataEncryptor> fast_pair_data_encryptor_; - std::unique_ptr<FastPairGattServiceClient> fast_pair_gatt_service_client_; + FastPairHandshake* fast_pair_handshake_ = nullptr; base::ScopedObservation<device::BluetoothAdapter, device::BluetoothAdapter::Observer> adapter_observation_{this};
diff --git a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_unittest.cc b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_unittest.cc index 5028505..d4a07b36 100644 --- a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_unittest.cc +++ b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_unittest.cc
@@ -12,16 +12,21 @@ #include "ash/quick_pair/common/logging.h" #include "ash/quick_pair/common/pair_failure.h" #include "ash/quick_pair/common/protocol.h" +#include "ash/quick_pair/fast_pair_handshake/fake_fast_pair_data_encryptor.h" #include "ash/quick_pair/fast_pair_handshake/fake_fast_pair_gatt_service_client.h" +#include "ash/quick_pair/fast_pair_handshake/fake_fast_pair_handshake.h" #include "ash/quick_pair/fast_pair_handshake/fast_pair_data_encryptor.h" #include "ash/quick_pair/fast_pair_handshake/fast_pair_data_encryptor_impl.h" #include "ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client.h" #include "ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h" #include "ash/quick_pair/repository/fake_fast_pair_repository.h" #include "ash/services/quick_pair/public/cpp/decrypted_passkey.h" #include "ash/services/quick_pair/public/cpp/decrypted_response.h" #include "ash/services/quick_pair/public/cpp/fast_pair_message_type.h" #include "ash/test/ash_test_base.h" +#include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" @@ -127,7 +132,7 @@ class FakeBluetoothDevice : public testing::NiceMock<device::MockBluetoothDevice> { public: - FakeBluetoothDevice(FakeBluetoothAdapter* adapter) + explicit FakeBluetoothDevice(FakeBluetoothAdapter* adapter) : testing::NiceMock<device::MockBluetoothDevice>( adapter, 0, @@ -170,121 +175,12 @@ namespace ash { namespace quick_pair { -class FastPairFakeDataEncryptor : public FastPairDataEncryptor { - public: - const std::array<uint8_t, kBlockSizeBytes> EncryptBytes( - const std::array<uint8_t, kBlockSizeBytes>& bytes_to_encrypt) override { - return encrypted_bytes_; - } - - const absl::optional<std::array<uint8_t, 64>>& GetPublicKey() override { - if (public_key_) { - static absl::optional<std::array<uint8_t, 64>> val = kPublicKey; - return val; - } - - static absl::optional<std::array<uint8_t, 64>> val = absl::nullopt; - return val; - } - - void SetPublicKey() { public_key_ = true; } - - void ParseDecryptedResponse( - const std::vector<uint8_t>& encrypted_response_bytes, - base::OnceCallback<void(const absl::optional<DecryptedResponse>&)> - callback) override { - std::move(callback).Run(response_); - } - - void ParseDecryptedPasskey( - const std::vector<uint8_t>& encrypted_passkey_bytes, - base::OnceCallback<void(const absl::optional<DecryptedPasskey>&)> - callback) override { - std::move(callback).Run(passkey_); - } - - FastPairFakeDataEncryptor() = default; - ~FastPairFakeDataEncryptor() override = default; - - void SetEncryptedBytes(std::array<uint8_t, kBlockSizeBytes> encrypted_bytes) { - encrypted_bytes_ = std::move(encrypted_bytes); - } - - void SetDecryptedResponse(const absl::optional<DecryptedResponse> response) { - response_ = response; - } - - void SetDecryptedPasskey(const absl::optional<DecryptedPasskey> passkey) { - passkey_ = passkey; - } - - private: - bool public_key_ = false; - std::array<uint8_t, kBlockSizeBytes> encrypted_bytes_ = {}; - absl::optional<DecryptedResponse> response_ = absl::nullopt; - absl::optional<DecryptedPasskey> passkey_ = absl::nullopt; -}; - -class FastPairFakeDataEncryptorImplFactory - : public FastPairDataEncryptorImpl::Factory { - public: - void CreateInstance( - scoped_refptr<Device> device, - base::OnceCallback<void(std::unique_ptr<FastPairDataEncryptor>)> - on_get_instance_callback) override { - if (!successful_retrieval_) { - std::move(on_get_instance_callback).Run(nullptr); - return; - } - - auto data_encryptor = base::WrapUnique(new FastPairFakeDataEncryptor()); - data_encryptor_ = data_encryptor.get(); - std::move(on_get_instance_callback).Run(std::move(data_encryptor)); - } - - FastPairFakeDataEncryptor* data_encryptor() { return data_encryptor_; } - - ~FastPairFakeDataEncryptorImplFactory() override = default; - - void SetFailedRetrieval() { successful_retrieval_ = false; } - - private: - FastPairFakeDataEncryptor* data_encryptor_ = nullptr; - bool successful_retrieval_ = true; -}; - -class FakeFastPairGattServiceClientImplFactory - : public FastPairGattServiceClientImpl::Factory { - public: - ~FakeFastPairGattServiceClientImplFactory() override = default; - - FakeFastPairGattServiceClient* fake_fast_pair_gatt_service_client() { - return fake_fast_pair_gatt_service_client_; - } - - private: - // FastPairGattServiceClientImpl::Factory: - std::unique_ptr<FastPairGattServiceClient> CreateInstance( - device::BluetoothDevice* device, - scoped_refptr<device::BluetoothAdapter> adapter, - base::OnceCallback<void(absl::optional<PairFailure>)> - on_initialized_callback) override { - auto fake_fast_pair_gatt_service_client = - std::make_unique<FakeFastPairGattServiceClient>( - device, adapter, std::move(on_initialized_callback)); - fake_fast_pair_gatt_service_client_ = - fake_fast_pair_gatt_service_client.get(); - return fake_fast_pair_gatt_service_client; - } - - FakeFastPairGattServiceClient* fake_fast_pair_gatt_service_client_ = nullptr; -}; - class FastPairPairerTest : public AshTestBase { public: void SuccessfulDataEncryptorSetUp(bool fast_pair_v1, Protocol protocol) { device_ = base::MakeRefCounted<Device>( kMetadataId, kBluetoothCanonicalizedAddress, protocol); + device_->set_classic_address(kBluetoothCanonicalizedAddress); if (fast_pair_v1) { device_->SetAdditionalData(Device::AdditionalDataType::kFastPairVersion, @@ -301,95 +197,64 @@ fake_bluetooth_device_ptr_ = fake_bluetooth_device_.get(); adapter_->AddMockDevice(std::move(fake_bluetooth_device_)); - FastPairGattServiceClientImpl::Factory::SetFactoryForTesting( - &fast_pair_gatt_service_factory_); + gatt_service_client_ = new FakeFastPairGattServiceClient( + fake_bluetooth_device_ptr_, adapter_, base::DoNothing()); - FastPairDataEncryptorImpl::Factory::SetFactoryForTesting( - &fast_pair_data_encryptor_factory); + data_encryptor_ = new FakeFastPairDataEncryptor(); + + FastPairHandshakeLookup::SetCreateFunctionForTesting(base::BindRepeating( + &FastPairPairerTest::CreateHandshake, base::Unretained(this))); + FastPairHandshakeLookup::GetInstance()->Create(adapter_, device_, + base::DoNothing()); } - void FailedDataEncryptorSetUp( - Protocol protocol = Protocol::kFastPairInitial) { - device_ = base::MakeRefCounted<Device>( - kMetadataId, kBluetoothCanonicalizedAddress, protocol); - adapter_ = base::MakeRefCounted<FakeBluetoothAdapter>(); + std::unique_ptr<FastPairHandshake> CreateHandshake( + scoped_refptr<Device> device, + FastPairHandshake::OnCompleteCallback callback) { + auto fake = std::make_unique<FakeFastPairHandshake>( + adapter_, device, std::move(callback), + base::WrapUnique(data_encryptor_), + base::WrapUnique(gatt_service_client_)); - // Need to add a matching mock device to the bluetooth adapter with the - // same address to mock the relationship between Device and - // device::BluetoothDevice. - fake_bluetooth_device_ = - std::make_unique<FakeBluetoothDevice>(adapter_.get()); - adapter_->AddMockDevice(std::move(fake_bluetooth_device_)); + fake->InvokeCallback(); - FastPairGattServiceClientImpl::Factory::SetFactoryForTesting( - &fast_pair_gatt_service_factory_); - - fast_pair_data_encryptor_factory.SetFailedRetrieval(); - - FastPairDataEncryptorImpl::Factory::SetFactoryForTesting( - &fast_pair_data_encryptor_factory); - } - - void RunOnGattClientInitializedCallback( - absl::optional<PairFailure> failure = absl::nullopt) { - fast_pair_gatt_service_factory_.fake_fast_pair_gatt_service_client() - ->RunOnGattClientInitializedCallback(failure); + return fake; } void SetDecryptResponseForIncorrectMessageType() { DecryptedResponse response(FastPairMessageType::kSeekersPasskey, kAddressBytes, kRequestSaltBytes); - fast_pair_data_encryptor_factory.data_encryptor()->SetDecryptedResponse( - response); + data_encryptor_->response(response); } void SetDecryptPasskeyForIncorrectMessageType() { DecryptedPasskey passkey(FastPairMessageType::kKeyBasedPairingResponse, kValidPasskey, kPasskeySaltBytes); - fast_pair_data_encryptor_factory.data_encryptor()->SetDecryptedPasskey( - passkey); + data_encryptor_->passkey(passkey); } void SetDecryptPasskeyForPasskeyMismatch() { DecryptedPasskey passkey(FastPairMessageType::kProvidersPasskey, kInvalidPasskey, kPasskeySaltBytes); - fast_pair_data_encryptor_factory.data_encryptor()->SetDecryptedPasskey( - passkey); + data_encryptor_->passkey(passkey); } void SetDecryptPasskeyForSuccess() { DecryptedPasskey passkey(FastPairMessageType::kProvidersPasskey, kValidPasskey, kPasskeySaltBytes); - fast_pair_data_encryptor_factory.data_encryptor()->SetDecryptedPasskey( - passkey); - } - - void SetDecryptResponseForSuccess() { - DecryptedResponse response(FastPairMessageType::kKeyBasedPairingResponse, - kAddressBytes, kRequestSaltBytes); - fast_pair_data_encryptor_factory.data_encryptor()->SetDecryptedResponse( - response); - } - - void RunWriteResponseCallback( - std::vector<uint8_t> data, - absl::optional<PairFailure> failure = absl::nullopt) { - fast_pair_gatt_service_factory_.fake_fast_pair_gatt_service_client() - ->RunWriteResponseCallback(data, failure); + data_encryptor_->passkey(passkey); } void RunWritePasskeyCallback( std::vector<uint8_t> data, absl::optional<PairFailure> failure = absl::nullopt) { - fast_pair_gatt_service_factory_.fake_fast_pair_gatt_service_client() - ->RunWritePasskeyCallback(data, failure); + gatt_service_client_->RunWritePasskeyCallback(data, failure); } void RunWriteAccountKeyCallback( absl::optional<device::BluetoothGattService::GattErrorCode> error = absl::nullopt) { - fast_pair_gatt_service_factory_.fake_fast_pair_gatt_service_client() - ->RunWriteAccountKeyCallback(error); + gatt_service_client_->RunWriteAccountKeyCallback(error); } void PairFailedCallback(scoped_refptr<Device> device, PairFailure failure) { @@ -417,9 +282,7 @@ fake_bluetooth_device_ptr_->GetAddress()); } - void SetPublicKey() { - fast_pair_data_encryptor_factory.data_encryptor()->SetPublicKey(); - } + void SetPublicKey() { data_encryptor_->public_key(kPublicKey); } protected: // This is done on-demand to enable setting up mock expectations first. @@ -443,10 +306,12 @@ account_key_failure_callback_; base::MockCallback<base::OnceCallback<void(scoped_refptr<Device>)>> pairing_procedure_complete_; - FakeFastPairGattServiceClientImplFactory fast_pair_gatt_service_factory_; - FastPairFakeDataEncryptorImplFactory fast_pair_data_encryptor_factory; FakeFastPairRepository fast_pair_repository_; std::unique_ptr<FastPairPairer> pairer_; + + FakeFastPairGattServiceClient* gatt_service_client_ = nullptr; + FakeFastPairDataEncryptor* data_encryptor_ = nullptr; + base::WeakPtrFactory<FastPairPairerTest> weak_ptr_factory_{this}; }; @@ -454,7 +319,6 @@ SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); CreatePairer(); - RunOnGattClientInitializedCallback(); EXPECT_EQ(GetPairFailure(), absl::nullopt); } @@ -462,7 +326,6 @@ SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairRetroactive); CreatePairer(); - RunOnGattClientInitializedCallback(); EXPECT_EQ(GetPairFailure(), absl::nullopt); } @@ -470,140 +333,14 @@ SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); CreatePairer(); - RunOnGattClientInitializedCallback(); EXPECT_EQ(GetPairFailure(), absl::nullopt); } -TEST_F(FastPairPairerTest, PairFailedCallbackIsInvokedOnGattFailure_Initial) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(PairFailure::kCreateGattConnection); - EXPECT_EQ(GetPairFailure(), PairFailure::kCreateGattConnection); -} - -TEST_F(FastPairPairerTest, - PairFailedCallbackIsInvokedOnGattFailure_Retroactive) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairRetroactive); - CreatePairer(); - RunOnGattClientInitializedCallback(PairFailure::kCreateGattConnection); - EXPECT_EQ(GetPairFailure(), PairFailure::kCreateGattConnection); -} - -TEST_F(FastPairPairerTest, - PairFailedCallbackIsInvokedOnGattFailure_Subsequent) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(PairFailure::kCreateGattConnection); - EXPECT_EQ(GetPairFailure(), PairFailure::kCreateGattConnection); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackWriteResponseFailed_Initial) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - RunWriteResponseCallback({}, PairFailure::kKeyBasedPairingResponseTimeout); - EXPECT_EQ(GetPairFailure(), PairFailure::kKeyBasedPairingResponseTimeout); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackWriteResponseFailed_Retroactive) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairRetroactive); - CreatePairer(); - RunOnGattClientInitializedCallback(); - RunWriteResponseCallback({}, PairFailure::kKeyBasedPairingResponseTimeout); - EXPECT_EQ(GetPairFailure(), PairFailure::kKeyBasedPairingResponseTimeout); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackWriteResponseFailed_Subsequent) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - RunWriteResponseCallback({}, PairFailure::kKeyBasedPairingResponseTimeout); - EXPECT_EQ(GetPairFailure(), PairFailure::kKeyBasedPairingResponseTimeout); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackWriteResponseSuccess_Initial) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - RunWriteResponseCallback(kResponseBytes); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(GetPairFailure(), - PairFailure::kKeybasedPairingResponseDecryptFailure); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackWriteResponseSuccess_Retroactive) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairRetroactive); - CreatePairer(); - RunOnGattClientInitializedCallback(); - RunWriteResponseCallback(kResponseBytes); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(GetPairFailure(), - PairFailure::kKeybasedPairingResponseDecryptFailure); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackWriteResponseSuccess_Subsequent) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - RunWriteResponseCallback(kResponseBytes); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(GetPairFailure(), - PairFailure::kKeybasedPairingResponseDecryptFailure); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackIncorrectMessageType_Initial) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForIncorrectMessageType(); - RunWriteResponseCallback(kResponseBytes); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(GetPairFailure(), - PairFailure::kIncorrectKeyBasedPairingResponseType); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackIncorrectMessageType_Retroactive) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairRetroactive); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForIncorrectMessageType(); - RunWriteResponseCallback(kResponseBytes); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(GetPairFailure(), - PairFailure::kIncorrectKeyBasedPairingResponseType); -} - -TEST_F(FastPairPairerTest, PairFailedCallbackIncorrectMessageType_Subsequent) { - SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, - /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForIncorrectMessageType(); - RunWriteResponseCallback(kResponseBytes); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(GetPairFailure(), - PairFailure::kIncorrectKeyBasedPairingResponseType); -} - TEST_F(FastPairPairerTest, SuccessfulDecryptedResponsePairFailure_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetPairFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), PairFailure::kPairingConnect); } @@ -611,11 +348,8 @@ TEST_F(FastPairPairerTest, SuccessfulDecryptedResponsePairFailure_Subsequent) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetPairFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), PairFailure::kPairingConnect); } @@ -624,9 +358,6 @@ SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); - RunWriteResponseCallback(kResponseBytes); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); } @@ -635,9 +366,6 @@ SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); - RunWriteResponseCallback(kResponseBytes); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); } @@ -645,12 +373,9 @@ TEST_F(FastPairPairerTest, SuccessfulDecryptedResponseConnectFailure_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); SetConnectFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), PairFailure::kAddressConnect); } @@ -659,12 +384,9 @@ SuccessfulDecryptedResponseConnectFailure_Subsequent) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); SetConnectFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), PairFailure::kAddressConnect); } @@ -672,11 +394,8 @@ TEST_F(FastPairPairerTest, SuccessfulDecryptedResponseConnectSuccess_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); } @@ -685,11 +404,8 @@ SuccessfulDecryptedResponseConnectSuccess_Subsequent) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); } @@ -697,11 +413,8 @@ TEST_F(FastPairPairerTest, ParseDecryptedPasskeyFailure_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); NotifyConfirmPasskey(); @@ -713,11 +426,8 @@ TEST_F(FastPairPairerTest, ParseDecryptedPasskeyFailure_Subsequent) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); NotifyConfirmPasskey(); @@ -729,11 +439,8 @@ TEST_F(FastPairPairerTest, ParseDecryptedPasskeyIncorrectMessageType_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); SetDecryptPasskeyForIncorrectMessageType(); @@ -747,11 +454,8 @@ ParseDecryptedPasskeyIncorrectMessageType_Subsequent) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); SetDecryptPasskeyForIncorrectMessageType(); @@ -764,11 +468,8 @@ TEST_F(FastPairPairerTest, ParseDecryptedPasskeyMismatch_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); SetDecryptPasskeyForPasskeyMismatch(); @@ -781,11 +482,8 @@ TEST_F(FastPairPairerTest, ParseDecryptedPasskeyMismatch_Subsequent) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); SetDecryptPasskeyForPasskeyMismatch(); @@ -798,11 +496,8 @@ TEST_F(FastPairPairerTest, PairedDeviceLost_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); SetDecryptPasskeyForSuccess(); @@ -815,11 +510,8 @@ TEST_F(FastPairPairerTest, PairedDeviceLost_Subsequent) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); SetDecryptPasskeyForSuccess(); @@ -832,11 +524,8 @@ TEST_F(FastPairPairerTest, PairSuccess_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); EXPECT_CALL(paired_callback_, Run); @@ -852,11 +541,8 @@ TEST_F(FastPairPairerTest, PairSuccess_Subsequent) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairSubsequent); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); EXPECT_CALL(paired_callback_, Run); @@ -872,12 +558,9 @@ TEST_F(FastPairPairerTest, WriteAccountKey_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); SetPublicKey(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); EXPECT_CALL(paired_callback_, Run); @@ -896,11 +579,8 @@ TEST_F(FastPairPairerTest, WriteAccountKey_Retroactive) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairRetroactive); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_CALL(pairing_procedure_complete_, Run); RunWriteAccountKeyCallback(); @@ -909,12 +589,9 @@ TEST_F(FastPairPairerTest, WriteAccountKeyFailure_Initial) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairInitial); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); + CreatePairer(); SetPublicKey(); - RunWriteResponseCallback(kResponseBytes); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); EXPECT_CALL(paired_callback_, Run); @@ -940,11 +617,8 @@ TEST_F(FastPairPairerTest, WriteAccountKeyFailure_Retroactive) { SuccessfulDataEncryptorSetUp(/*fast_pair_v1=*/false, /*protocol=*/Protocol::kFastPairRetroactive); - CreatePairer(); - RunOnGattClientInitializedCallback(); - SetDecryptResponseForSuccess(); SetGetDeviceFailure(); - RunWriteResponseCallback(kResponseBytes); + CreatePairer(); base::RunLoop().RunUntilIdle(); EXPECT_CALL(account_key_failure_callback_, Run); RunWriteAccountKeyCallback(
diff --git a/ash/quick_pair/scanning/BUILD.gn b/ash/quick_pair/scanning/BUILD.gn index cb8f5b3..2e27dd51 100644 --- a/ash/quick_pair/scanning/BUILD.gn +++ b/ash/quick_pair/scanning/BUILD.gn
@@ -23,6 +23,7 @@ deps = [ "//ash/quick_pair/common", + "//ash/quick_pair/fast_pair_handshake", "//ash/quick_pair/repository", "//ash/services/quick_pair", "//ash/services/quick_pair/public/cpp", @@ -66,6 +67,7 @@ ":scanning", ":test_support", "//ash/quick_pair/common", + "//ash/quick_pair/fast_pair_handshake:test_support", "//ash/quick_pair/proto:fastpair_proto", "//ash/quick_pair/repository:repository", "//ash/quick_pair/repository:test_support",
diff --git a/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner.cc b/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner.cc index f929ebc..eab399fb 100644 --- a/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner.cc +++ b/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner.cc
@@ -12,7 +12,10 @@ #include "ash/quick_pair/common/device.h" #include "ash/quick_pair/common/fast_pair/fast_pair_decoder.h" #include "ash/quick_pair/common/logging.h" +#include "ash/quick_pair/common/pair_failure.h" #include "ash/quick_pair/common/protocol.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h" #include "ash/quick_pair/repository/fast_pair_repository.h" #include "ash/services/quick_pair/quick_pair_process.h" #include "ash/services/quick_pair/quick_pair_process_manager.h" @@ -22,6 +25,7 @@ #include "base/containers/flat_set.h" #include "base/memory/scoped_refptr.h" #include "base/strings/string_util.h" +#include "device/bluetooth//bluetooth_adapter.h" #include "device/bluetooth/bluetooth_device.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -37,12 +41,14 @@ FastPairDiscoverableScanner::FastPairDiscoverableScanner( scoped_refptr<FastPairScanner> scanner, + scoped_refptr<device::BluetoothAdapter> adapter, DeviceCallback found_callback, DeviceCallback lost_callback) - : scanner_(scanner), + : scanner_(std::move(scanner)), + adapter_(std::move(adapter)), found_callback_(std::move(found_callback)), lost_callback_(std::move(lost_callback)) { - observation_.Observe(scanner.get()); + observation_.Observe(scanner_.get()); } FastPairDiscoverableScanner::~FastPairDiscoverableScanner() = default; @@ -114,8 +120,53 @@ auto device = base::MakeRefCounted<Device>( model_id, bluetooth_device->GetAddress(), Protocol::kFastPairInitial); - notified_devices_[bluetooth_device->GetAddress()] = device; + // Anti-spoofing keys were introduced in Fast Pair v2, so if this isn't + // available then the device is v1. + if (device_metadata->GetDetails() + .anti_spoofing_key_pair() + .public_key() + .empty()) { + NotifyDeviceFound(std::move(device)); + return; + } + FastPairHandshakeLookup::GetInstance()->Create( + adapter_, device, + base::BindOnce(&FastPairDiscoverableScanner::OnHandshakeComplete, + weak_pointer_factory_.GetWeakPtr())); +} + +void FastPairDiscoverableScanner::OnHandshakeComplete( + scoped_refptr<Device> device, + absl::optional<PairFailure> failure) { + if (failure) { + QP_LOG(WARNING) << __func__ << ": Handshake failed with " << device + << " because: " << failure.value(); + return; + } + + NotifyDeviceFound(std::move(device)); +} + +void FastPairDiscoverableScanner::NotifyDeviceFound( + scoped_refptr<Device> device) { + device::BluetoothDevice* classic_device = + device->classic_address() + ? adapter_->GetDevice(device->classic_address().value()) + : nullptr; + + device::BluetoothDevice* ble_device = + adapter_->GetDevice(device->ble_address); + + bool is_already_paired = + (classic_device && classic_device->IsPaired()) || ble_device->IsPaired(); + + if (is_already_paired) { + QP_LOG(INFO) << __func__ << ": Already paired with " << device; + return; + } + + notified_devices_[device->ble_address] = device; found_callback_.Run(device); }
diff --git a/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner.h b/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner.h index d617b79f..53ad1df 100644 --- a/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner.h +++ b/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner.h
@@ -14,8 +14,10 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace device { +class BluetoothAdapter; class BluetoothDevice; } // namespace device @@ -24,6 +26,7 @@ struct Device; class DeviceMetadata; +enum class PairFailure; using DeviceCallback = base::RepeatingCallback<void(scoped_refptr<Device>)>; @@ -35,6 +38,7 @@ class FastPairDiscoverableScanner final : public FastPairScanner::Observer { public: FastPairDiscoverableScanner(scoped_refptr<FastPairScanner> scanner, + scoped_refptr<device::BluetoothAdapter> adatper, DeviceCallback found_callback, DeviceCallback lost_callback); FastPairDiscoverableScanner(const FastPairDiscoverableScanner&) = delete; @@ -52,11 +56,15 @@ void OnDeviceMetadataRetrieved(device::BluetoothDevice* device, const std::string model_id, DeviceMetadata* device_metadata); + void OnHandshakeComplete(scoped_refptr<Device> device, + absl::optional<PairFailure> failure); + void NotifyDeviceFound(scoped_refptr<Device> device); void OnUtilityProcessStopped( device::BluetoothDevice* device, QuickPairProcessManager::ShutdownReason shutdown_reason); scoped_refptr<FastPairScanner> scanner_; + scoped_refptr<device::BluetoothAdapter> adapter_; DeviceCallback found_callback_; DeviceCallback lost_callback_; base::flat_map<std::string, scoped_refptr<Device>> notified_devices_;
diff --git a/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner_unittest.cc b/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner_unittest.cc index a3bd237..dedcaf5d 100644 --- a/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner_unittest.cc +++ b/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner_unittest.cc
@@ -7,6 +7,11 @@ #include <vector> #include "ash/quick_pair/common/constants.h" #include "ash/quick_pair/common/device.h" +#include "ash/quick_pair/common/pair_failure.h" +#include "ash/quick_pair/fast_pair_handshake/fake_fast_pair_handshake.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_data_encryptor.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h" #include "ash/quick_pair/repository/fake_fast_pair_repository.h" #include "ash/quick_pair/scanning/fast_pair/fake_fast_pair_scanner.h" #include "ash/services/quick_pair/fast_pair_data_parser.h" @@ -31,6 +36,7 @@ namespace { constexpr char kValidModelId[] = "718c17"; +const std::string kAddress = "test_address"; } // namespace namespace ash { @@ -66,8 +72,13 @@ data_parser_remote_, base::DoNothing()); }); + FastPairHandshakeLookup::SetCreateFunctionForTesting( + base::BindRepeating(&FastPairDiscoverableScannerTest::CreateHandshake, + base::Unretained(this))); + discoverable_scanner_ = std::make_unique<FastPairDiscoverableScanner>( - scanner_, found_device_callback_.Get(), lost_device_callback_.Get()); + scanner_, adapter_, found_device_callback_.Get(), + lost_device_callback_.Get()); } MockQuickPairProcessManager* mock_process_manager() { @@ -75,11 +86,10 @@ } protected: - std::unique_ptr<device::BluetoothDevice> GetDevice( - const std::string& hex_model_id, - bool expect_call) { + device::BluetoothDevice* GetDevice(const std::string& hex_model_id, + bool is_paired = false) { auto device = std::make_unique<device::MockBluetoothDevice>( - adapter_.get(), 0, "test_name", "test_address", /*paired=*/false, + adapter_.get(), 0, "test_name", kAddress, /*paired=*/is_paired, /*connected=*/false); if (!hex_model_id.empty()) { @@ -88,7 +98,24 @@ device->SetServiceDataForUUID(kFastPairBluetoothUuid, model_id_bytes); } - return device; + device::BluetoothDevice* device_ptr = device.get(); + + adapter_->AddMockDevice(std::move(device)); + ON_CALL(*adapter_, GetDevice(kAddress)) + .WillByDefault(testing::Return(device_ptr)); + + return device_ptr; + } + + std::unique_ptr<FastPairHandshake> CreateHandshake( + scoped_refptr<Device> device, + FastPairHandshake::OnCompleteCallback callback) { + auto fake = std::make_unique<FakeFastPairHandshake>( + adapter_, std::move(device), std::move(callback)); + + fake_fast_pair_handshake_ = fake.get(); + + return fake; } base::test::SingleThreadTaskEnvironment task_enviornment_; @@ -102,6 +129,7 @@ std::unique_ptr<FastPairDataParser> data_parser_; base::MockCallback<DeviceCallback> found_device_callback_; base::MockCallback<DeviceCallback> lost_device_callback_; + FakeFastPairHandshake* fake_fast_pair_handshake_ = nullptr; }; TEST_F(FastPairDiscoverableScannerTest, NoServiceData) { @@ -119,39 +147,121 @@ TEST_F(FastPairDiscoverableScannerTest, NoModelId) { EXPECT_CALL(found_device_callback_, Run).Times(0); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice("", /*expect_call=*/false); - scanner_->NotifyDeviceFound(device.get()); + device::BluetoothDevice* device = GetDevice(""); + scanner_->NotifyDeviceFound(device); base::RunLoop().RunUntilIdle(); } TEST_F(FastPairDiscoverableScannerTest, ValidModelId) { EXPECT_CALL(found_device_callback_, Run).Times(1); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(kValidModelId, /*expect_call=*/true); - scanner_->NotifyDeviceFound(device.get()); + device::BluetoothDevice* device = GetDevice(kValidModelId); + scanner_->NotifyDeviceFound(device); base::RunLoop().RunUntilIdle(); } TEST_F(FastPairDiscoverableScannerTest, NearbyShareModelId) { EXPECT_CALL(found_device_callback_, Run).Times(0); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice("fc128e", /*expect_call=*/false); - scanner_->NotifyDeviceFound(device.get()); + device::BluetoothDevice* device = GetDevice("fc128e"); + scanner_->NotifyDeviceFound(device); base::RunLoop().RunUntilIdle(); } -TEST_F(FastPairDiscoverableScannerTest, InvokesLostCallbackAfterFound) { - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(kValidModelId, /*expect_call=*/true); +TEST_F(FastPairDiscoverableScannerTest, InvokesLostCallbackAfterFound_v1) { + device::BluetoothDevice* device = GetDevice(kValidModelId); EXPECT_CALL(found_device_callback_, Run).Times(1); - scanner_->NotifyDeviceFound(device.get()); - + scanner_->NotifyDeviceFound(device); base::RunLoop().RunUntilIdle(); EXPECT_CALL(lost_device_callback_, Run).Times(1); - scanner_->NotifyDeviceLost(device.get()); + scanner_->NotifyDeviceLost(device); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(FastPairDiscoverableScannerTest, InvokesLostCallbackAfterFound_v2) { + nearby::fastpair::Device metadata; + metadata.set_trigger_distance(2); + auto* key_pair = new ::nearby::fastpair::AntiSpoofingKeyPair(); + key_pair->set_public_key("test_public_key"); + metadata.set_allocated_anti_spoofing_key_pair(key_pair); + repository_->SetFakeMetadata(kValidModelId, metadata); + + device::BluetoothDevice* device = GetDevice(kValidModelId); + + EXPECT_CALL(found_device_callback_, Run).Times(1); + scanner_->NotifyDeviceFound(device); + + base::RunLoop().RunUntilIdle(); + + fake_fast_pair_handshake_->InvokeCallback(); + base::RunLoop().RunUntilIdle(); + + EXPECT_CALL(lost_device_callback_, Run).Times(1); + scanner_->NotifyDeviceLost(device); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(FastPairDiscoverableScannerTest, AlreadyPaired_v1) { + device::BluetoothDevice* device = + GetDevice(kValidModelId, /*is_paired=*/true); + + EXPECT_CALL(found_device_callback_, Run).Times(0); + scanner_->NotifyDeviceFound(device); + base::RunLoop().RunUntilIdle(); + + EXPECT_CALL(lost_device_callback_, Run).Times(0); + scanner_->NotifyDeviceLost(device); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(FastPairDiscoverableScannerTest, AlreadyPaired_v2) { + nearby::fastpair::Device metadata; + metadata.set_trigger_distance(2); + auto* key_pair = new ::nearby::fastpair::AntiSpoofingKeyPair(); + key_pair->set_public_key("test_public_key"); + metadata.set_allocated_anti_spoofing_key_pair(key_pair); + repository_->SetFakeMetadata(kValidModelId, metadata); + + device::BluetoothDevice* device = + GetDevice(kValidModelId, /*is_paired=*/true); + + EXPECT_CALL(found_device_callback_, Run).Times(0); + scanner_->NotifyDeviceFound(device); + + base::RunLoop().RunUntilIdle(); + + fake_fast_pair_handshake_->InvokeCallback(); + base::RunLoop().RunUntilIdle(); + + EXPECT_CALL(lost_device_callback_, Run).Times(0); + scanner_->NotifyDeviceLost(device); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(FastPairDiscoverableScannerTest, HandshakeFailed) { + nearby::fastpair::Device metadata; + metadata.set_trigger_distance(2); + auto* key_pair = new ::nearby::fastpair::AntiSpoofingKeyPair(); + key_pair->set_public_key("test_public_key"); + metadata.set_allocated_anti_spoofing_key_pair(key_pair); + repository_->SetFakeMetadata(kValidModelId, metadata); + + device::BluetoothDevice* device = GetDevice(kValidModelId); + + EXPECT_CALL(found_device_callback_, Run).Times(0); + scanner_->NotifyDeviceFound(device); + + base::RunLoop().RunUntilIdle(); + + fake_fast_pair_handshake_->InvokeCallback(PairFailure::kCreateGattConnection); + base::RunLoop().RunUntilIdle(); + + EXPECT_CALL(lost_device_callback_, Run).Times(0); + scanner_->NotifyDeviceLost(device); base::RunLoop().RunUntilIdle(); } @@ -160,9 +270,8 @@ DoesntInvokeLostCallbackIfDidntInvokeFound) { EXPECT_CALL(found_device_callback_, Run).Times(0); EXPECT_CALL(lost_device_callback_, Run).Times(0); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(kValidModelId, /*expect_call=*/false); - scanner_->NotifyDeviceLost(device.get()); + device::BluetoothDevice* device = GetDevice(kValidModelId); + scanner_->NotifyDeviceLost(device); base::RunLoop().RunUntilIdle(); }
diff --git a/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner.cc b/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner.cc index 7ecff3a..b2eec24 100644 --- a/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner.cc +++ b/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner.cc
@@ -14,7 +14,9 @@ #include "ash/quick_pair/common/device.h" #include "ash/quick_pair/common/fast_pair/fast_pair_decoder.h" #include "ash/quick_pair/common/logging.h" +#include "ash/quick_pair/common/pair_failure.h" #include "ash/quick_pair/common/protocol.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h" #include "ash/quick_pair/repository/fast_pair/device_metadata.h" #include "ash/quick_pair/repository/fast_pair/pairing_metadata.h" #include "ash/quick_pair/repository/fast_pair_repository.h" @@ -30,6 +32,7 @@ #include "base/memory/scoped_refptr.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "device/bluetooth//bluetooth_adapter.h" #include "device/bluetooth/bluetooth_device.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -75,9 +78,11 @@ FastPairNotDiscoverableScanner::FastPairNotDiscoverableScanner( scoped_refptr<FastPairScanner> scanner, + scoped_refptr<device::BluetoothAdapter> adapter, DeviceCallback found_callback, DeviceCallback lost_callback) : scanner_(scanner), + adapter_(std::move(adapter)), found_callback_(std::move(found_callback)), lost_callback_(std::move(lost_callback)) { observation_.Observe(scanner.get()); @@ -185,8 +190,39 @@ device->SetAdditionalData(Device::AdditionalDataType::kAccountKey, metadata->account_key); - notified_devices_[bluetooth_device->GetAddress()] = device; + FastPairHandshakeLookup::GetInstance()->Create( + adapter_, std::move(device), + base::BindOnce(&FastPairNotDiscoverableScanner::OnHandshakeComplete, + weak_pointer_factory_.GetWeakPtr())); +} +void FastPairNotDiscoverableScanner::OnHandshakeComplete( + scoped_refptr<Device> device, + absl::optional<PairFailure> failure) { + if (failure) { + QP_LOG(WARNING) << __func__ << ": Handshake failed with " << device + << " because: " << failure.value(); + return; + } + + device::BluetoothDevice* classic_device = + device->classic_address() + ? adapter_->GetDevice(device->classic_address().value()) + : nullptr; + + device::BluetoothDevice* ble_device = + adapter_->GetDevice(device->ble_address); + + bool is_already_paired = + (classic_device != nullptr ? classic_device->IsPaired() : false) || + ble_device->IsPaired(); + + if (is_already_paired) { + QP_LOG(INFO) << __func__ << ": Already paired with " << device; + return; + } + + notified_devices_[device->ble_address] = device; found_callback_.Run(device); } @@ -197,8 +233,8 @@ if (current_retry_count > kMaxParseAdvertisementRetryCount) { QP_LOG(WARNING) << "Failed to parse advertisement from device more than " << kMaxParseAdvertisementRetryCount << " times."; - // Clean up the state here which enables trying again in the future if this - // device is re-discovered. + // Clean up the state here which enables trying again in the future if + // this device is re-discovered. advertisement_parse_attempts_.erase(device->GetAddress()); return; }
diff --git a/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner.h b/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner.h index ee6316d..4a8dda3 100644 --- a/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner.h +++ b/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner.h
@@ -17,6 +17,7 @@ #include "base/scoped_observation.h" namespace device { +class BluetoothAdapter; class BluetoothDevice; } // namespace device @@ -26,6 +27,7 @@ class AccountKeyFilter; struct Device; struct NotDiscoverableAdvertisement; +enum class PairFailure; struct PairingMetadata; using DeviceCallback = base::RepeatingCallback<void(scoped_refptr<Device>)>; @@ -37,9 +39,11 @@ // to the bluetooth adapter. class FastPairNotDiscoverableScanner final : public FastPairScanner::Observer { public: - FastPairNotDiscoverableScanner(scoped_refptr<FastPairScanner> scanner, - DeviceCallback found_callback, - DeviceCallback lost_callback); + FastPairNotDiscoverableScanner( + scoped_refptr<FastPairScanner> scanner, + scoped_refptr<device::BluetoothAdapter> adatper, + DeviceCallback found_callback, + DeviceCallback lost_callback); FastPairNotDiscoverableScanner(const FastPairNotDiscoverableScanner&) = delete; FastPairNotDiscoverableScanner& operator=( @@ -56,11 +60,15 @@ const absl::optional<NotDiscoverableAdvertisement>& advertisement); void OnAccountKeyFilterCheckResult(device::BluetoothDevice* device, absl::optional<PairingMetadata> metadata); + void OnHandshakeComplete(scoped_refptr<Device> device, + absl::optional<PairFailure> failure); + void NotifyDeviceFound(scoped_refptr<Device> device); void OnUtilityProcessStopped( device::BluetoothDevice* device, QuickPairProcessManager::ShutdownReason shutdown_reason); scoped_refptr<FastPairScanner> scanner_; + scoped_refptr<device::BluetoothAdapter> adapter_; DeviceCallback found_callback_; DeviceCallback lost_callback_; base::flat_map<std::string, scoped_refptr<Device>> notified_devices_;
diff --git a/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner_unittest.cc b/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner_unittest.cc index 651bce7..924f72d 100644 --- a/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner_unittest.cc +++ b/ash/quick_pair/scanning/fast_pair/fast_pair_not_discoverable_scanner_unittest.cc
@@ -13,6 +13,11 @@ #include "ash/quick_pair/common/constants.h" #include "ash/quick_pair/common/device.h" #include "ash/quick_pair/common/fast_pair/fast_pair_service_data_creator.h" +#include "ash/quick_pair/common/pair_failure.h" +#include "ash/quick_pair/fast_pair_handshake/fake_fast_pair_handshake.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_data_encryptor.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client.h" +#include "ash/quick_pair/fast_pair_handshake/fast_pair_handshake_lookup.h" #include "ash/quick_pair/proto/fastpair.pb.h" #include "ash/quick_pair/repository/fake_fast_pair_repository.h" #include "ash/quick_pair/repository/fast_pair/device_metadata.h" @@ -23,7 +28,12 @@ #include "ash/services/quick_pair/quick_pair_process.h" #include "ash/services/quick_pair/quick_pair_process_manager.h" #include "ash/services/quick_pair/quick_pair_process_manager_impl.h" +#include "base/bind.h" +#include "base/callback_helpers.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" #include "base/strings/string_number_conversions.h" +#include "base/test/bind.h" #include "base/test/mock_callback.h" #include "base/test/task_environment.h" #include "device/bluetooth/bluetooth_adapter.h" @@ -46,6 +56,7 @@ const std::string kSalt = "01"; const std::string kBattery = "01048F"; const std::string kModelId = "112233"; +const std::string kAddress = "test_address"; } // namespace @@ -78,9 +89,13 @@ data_parser_remote_, base::DoNothing()); }); + FastPairHandshakeLookup::SetCreateFunctionForTesting(base::BindRepeating( + &FastPairNotDiscoverableScannerTest::CreateHandshake, + base::Unretained(this))); + not_discoverable_scanner_ = std::make_unique<FastPairNotDiscoverableScanner>( - scanner_, found_device_callback_.Get(), + scanner_, adapter_, found_device_callback_.Get(), lost_device_callback_.Get()); } @@ -133,16 +148,31 @@ ->CreateServiceData(); } - std::unique_ptr<device::BluetoothDevice> GetDevice( - const std::vector<uint8_t>& service_data, - bool expect_call) { + device::BluetoothDevice* GetDevice(const std::vector<uint8_t>& service_data, + bool is_paired = false) { auto device = std::make_unique<device::MockBluetoothDevice>( - adapter_.get(), 0, "test_name", "test_address", /*paired=*/false, + adapter_.get(), 0, "test_name", kAddress, /*paired=*/is_paired, /*connected=*/false); + device::BluetoothDevice* device_ptr = device.get(); device->SetServiceDataForUUID(kFastPairBluetoothUuid, service_data); - return device; + adapter_->AddMockDevice(std::move(device)); + ON_CALL(*adapter_, GetDevice(kAddress)) + .WillByDefault(testing::Return(device_ptr)); + + return device_ptr; + } + + std::unique_ptr<FastPairHandshake> CreateHandshake( + scoped_refptr<Device> device, + FastPairHandshake::OnCompleteCallback callback) { + auto fake = std::make_unique<FakeFastPairHandshake>( + adapter_, std::move(device), std::move(callback)); + + fake_fast_pair_handshake_ = fake.get(); + + return fake; } base::test::SingleThreadTaskEnvironment task_enviornment_; @@ -156,6 +186,7 @@ std::unique_ptr<FastPairDataParser> data_parser_; base::MockCallback<DeviceCallback> found_device_callback_; base::MockCallback<DeviceCallback> lost_device_callback_; + FakeFastPairHandshake* fake_fast_pair_handshake_ = nullptr; }; TEST_F(FastPairNotDiscoverableScannerTest, NoServiceData) { @@ -173,32 +204,27 @@ TEST_F(FastPairNotDiscoverableScannerTest, NoParsedAdvertisement) { EXPECT_CALL(found_device_callback_, Run).Times(0); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(GetDiscoverableAdvServicedata(), - /*expect_call=*/false); - scanner_->NotifyDeviceFound(device.get()); + device::BluetoothDevice* device = GetDevice(GetDiscoverableAdvServicedata()); + scanner_->NotifyDeviceFound(device); base::RunLoop().RunUntilIdle(); } TEST_F(FastPairNotDiscoverableScannerTest, DontShowUI) { EXPECT_CALL(found_device_callback_, Run).Times(0); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(GetAdvNoUiServicedata(), /*expect_call=*/false); - scanner_->NotifyDeviceFound(device.get()); + device::BluetoothDevice* device = GetDevice(GetAdvNoUiServicedata()); + scanner_->NotifyDeviceFound(device); base::RunLoop().RunUntilIdle(); } TEST_F(FastPairNotDiscoverableScannerTest, NoMetadata) { EXPECT_CALL(found_device_callback_, Run).Times(0); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(GetAdvServicedata(), /*expect_call=*/false); - scanner_->NotifyDeviceFound(device.get()); + device::BluetoothDevice* device = GetDevice(GetAdvServicedata()); + scanner_->NotifyDeviceFound(device); base::RunLoop().RunUntilIdle(); } TEST_F(FastPairNotDiscoverableScannerTest, InvokesLostCallbackAfterFound) { - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(GetAdvServicedata(), /*expect_call=*/true); + device::BluetoothDevice* device = GetDevice(GetAdvServicedata()); nearby::fastpair::GetObservedDeviceResponse response; response.mutable_device()->set_id(kModelIdLong); @@ -211,12 +237,16 @@ repository_->SetCheckAccountKeysResult(pairing_metadata); EXPECT_CALL(found_device_callback_, Run).Times(1); - scanner_->NotifyDeviceFound(device.get()); + scanner_->NotifyDeviceFound(device); + + base::RunLoop().RunUntilIdle(); + + fake_fast_pair_handshake_->InvokeCallback(); base::RunLoop().RunUntilIdle(); EXPECT_CALL(lost_device_callback_, Run).Times(1); - scanner_->NotifyDeviceLost(device.get()); + scanner_->NotifyDeviceLost(device); base::RunLoop().RunUntilIdle(); } @@ -225,9 +255,8 @@ DoesntInvokeLostCallbackIfDidntInvokeFound) { EXPECT_CALL(found_device_callback_, Run).Times(0); EXPECT_CALL(lost_device_callback_, Run).Times(0); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(std::vector<uint8_t>(), /*expect_call=*/false); - scanner_->NotifyDeviceLost(device.get()); + device::BluetoothDevice* device = GetDevice(std::vector<uint8_t>()); + scanner_->NotifyDeviceLost(device); base::RunLoop().RunUntilIdle(); } @@ -244,10 +273,11 @@ EXPECT_CALL(found_device_callback_, Run).Times(1); - std::unique_ptr<device::BluetoothDevice> device = - GetDevice(GetAdvBatteryServicedata(), - /*expect_call=*/true); - scanner_->NotifyDeviceFound(device.get()); + device::BluetoothDevice* device = GetDevice(GetAdvBatteryServicedata()); + scanner_->NotifyDeviceFound(device); + base::RunLoop().RunUntilIdle(); + + fake_fast_pair_handshake_->InvokeCallback(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(absl::nullopt, device->GetBatteryInfo( @@ -263,5 +293,58 @@ device::BluetoothDevice::BatteryType::kCaseTrueWireless)); } +TEST_F(FastPairNotDiscoverableScannerTest, HandshakeFailed) { + device::BluetoothDevice* device = GetDevice(GetAdvServicedata()); + + nearby::fastpair::GetObservedDeviceResponse response; + response.mutable_device()->set_id(kModelIdLong); + response.mutable_device()->set_trigger_distance(2); + + auto device_metadata = + std::make_unique<DeviceMetadata>(std::move(response), gfx::Image()); + PairingMetadata pairing_metadata(device_metadata.get(), + std::vector<uint8_t>()); + repository_->SetCheckAccountKeysResult(pairing_metadata); + + EXPECT_CALL(found_device_callback_, Run).Times(0); + scanner_->NotifyDeviceFound(device); + base::RunLoop().RunUntilIdle(); + + fake_fast_pair_handshake_->InvokeCallback(PairFailure::kCreateGattConnection); + base::RunLoop().RunUntilIdle(); + + EXPECT_CALL(lost_device_callback_, Run).Times(0); + scanner_->NotifyDeviceLost(device); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(FastPairNotDiscoverableScannerTest, AlreadyPaired) { + device::BluetoothDevice* device = + GetDevice(GetAdvServicedata(), /*is_paired=*/true); + + nearby::fastpair::GetObservedDeviceResponse response; + response.mutable_device()->set_id(kModelIdLong); + response.mutable_device()->set_trigger_distance(2); + + auto device_metadata = + std::make_unique<DeviceMetadata>(std::move(response), gfx::Image()); + PairingMetadata pairing_metadata(device_metadata.get(), + std::vector<uint8_t>()); + repository_->SetCheckAccountKeysResult(pairing_metadata); + + EXPECT_CALL(found_device_callback_, Run).Times(0); + scanner_->NotifyDeviceFound(device); + base::RunLoop().RunUntilIdle(); + + fake_fast_pair_handshake_->InvokeCallback(); + base::RunLoop().RunUntilIdle(); + + EXPECT_CALL(lost_device_callback_, Run).Times(0); + scanner_->NotifyDeviceLost(device); + + base::RunLoop().RunUntilIdle(); +} + } // namespace quick_pair } // namespace ash
diff --git a/ash/quick_pair/scanning/scanner_broker_impl.cc b/ash/quick_pair/scanning/scanner_broker_impl.cc index 25d634f..de1162e 100644 --- a/ash/quick_pair/scanning/scanner_broker_impl.cc +++ b/ash/quick_pair/scanning/scanner_broker_impl.cc
@@ -103,7 +103,7 @@ fast_pair_discoverable_scanner_ = std::make_unique<FastPairDiscoverableScanner>( - fast_pair_scanner, + fast_pair_scanner, adapter_, base::BindRepeating(&ScannerBrokerImpl::NotifyDeviceFound, weak_pointer_factory_.GetWeakPtr()), base::BindRepeating(&ScannerBrokerImpl::NotifyDeviceLost, @@ -111,7 +111,7 @@ fast_pair_not_discoverable_scanner_ = std::make_unique<FastPairNotDiscoverableScanner>( - fast_pair_scanner, + fast_pair_scanner, adapter_, base::BindRepeating(&ScannerBrokerImpl::NotifyDeviceFound, weak_pointer_factory_.GetWeakPtr()), base::BindRepeating(&ScannerBrokerImpl::NotifyDeviceLost,
diff --git a/ash/shell.cc b/ash/shell.cc index bfabee18..5efd0ff 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -443,8 +443,7 @@ screen_orientation_controller_->ignore_display_configuration_updates() || // Save display settings if we don't need to show the display change // dialog. - resolution_notification_controller_->ShouldShowDisplayChangeDialog() || - !display_configuration_observer_->save_preference()); + resolution_notification_controller_->ShouldShowDisplayChangeDialog()); } ::wm::ActivationClient* Shell::activation_client() {
diff --git a/ash/style/system_toast_style.cc b/ash/style/system_toast_style.cc index 60b5f94..250ee6a2 100644 --- a/ash/style/system_toast_style.cc +++ b/ash/style/system_toast_style.cc
@@ -97,9 +97,9 @@ managed_icon_->GetPreferredSize().width() + kToastHorizontalSpacing; } - auto* label = AddChildView(std::make_unique<SystemToastInnerLabel>(text)); - label->SetMaximumWidth(GetMaximumSize().width() - icon_width); - layout->SetFlexForView(label, 1); + label_ = AddChildView(std::make_unique<SystemToastInnerLabel>(text)); + label_->SetMaximumWidth(GetMaximumSize().width() - icon_width); + layout->SetFlexForView(label_, 1); if (!dismiss_text.has_value()) return; @@ -113,13 +113,17 @@ /*icon=*/nullptr)); button_->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY); - label->SetMaximumWidth( + label_->SetMaximumWidth( GetMaximumSize().width() - button_->GetPreferredSize().width() - icon_width - kToastHorizontalSpacing * 2 - kToastHorizontalSpacing * 2); } SystemToastStyle::~SystemToastStyle() = default; +void SystemToastStyle::SetText(const std::u16string& text) { + label_->SetText(text); +} + gfx::Size SystemToastStyle::GetMaximumSize() const { return gfx::Size(kToastMaximumWidth, WorkAreaInsets::ForWindow( Shell::GetRootWindowForNewWindows())
diff --git a/ash/style/system_toast_style.h b/ash/style/system_toast_style.h index b4686487..5f4a95a 100644 --- a/ash/style/system_toast_style.h +++ b/ash/style/system_toast_style.h
@@ -5,6 +5,7 @@ #ifndef ASH_STYLE_SYSTEM_TOAST_STYLE_H_ #define ASH_STYLE_SYSTEM_TOAST_STYLE_H_ +#include "ash/ash_export.h" #include "base/callback_forward.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/metadata/metadata_header_macros.h" @@ -12,6 +13,7 @@ namespace views { class ImageView; +class Label; class LabelButton; } // namespace views @@ -25,7 +27,7 @@ // the information. The button inside is optional and has certain functionality // e.g. dismiss the view or retry. A managed icon will be put ahead of the label // inside if `is_managed` is true. -class SystemToastStyle : public views::View { +class ASH_EXPORT SystemToastStyle : public views::View { public: METADATA_HEADER(SystemToastStyle); @@ -37,6 +39,9 @@ SystemToastStyle& operator=(const SystemToastStyle&) = delete; ~SystemToastStyle() override; + // Updates the toast label text. + void SetText(const std::u16string& text); + views::LabelButton* button() const { return button_; } private: @@ -45,6 +50,7 @@ gfx::Size GetMaximumSize() const override; void OnThemeChanged() override; + views::Label* label_ = nullptr; views::LabelButton* button_ = nullptr; views::ImageView* managed_icon_ = nullptr; };
diff --git a/ash/system/holding_space/holding_space_tray_unittest.cc b/ash/system/holding_space/holding_space_tray_unittest.cc index f2a58dc..918b9ae6 100644 --- a/ash/system/holding_space/holding_space_tray_unittest.cc +++ b/ash/system/holding_space/holding_space_tray_unittest.cc
@@ -28,6 +28,7 @@ #include "ash/system/tray/tray_constants.h" #include "ash/test/ash_test_base.h" #include "ash/test/ash_test_helper.h" +#include "ash/test/layer_animation_stopped_waiter.h" #include "ash/test/view_drawn_waiter.h" #include "ash/wm/overview/overview_controller.h" #include "ash/wm/overview/overview_item.h" @@ -152,52 +153,6 @@ return ids; } -// Waiters --------------------------------------------------------------------- - -// A class capable of waiting until a layer has stopped animating. -class LayerAnimationStoppedWaiter : public ui::LayerAnimationObserver { - public: - // Waits until the specified `layer`'s animation is stopped. - void Wait(ui::Layer* layer) { - if (!layer->GetAnimator()->is_animating()) - return; - - // Temporarily cache and observe `layer`'s animator. - layer_animator_ = layer->GetAnimator(); - base::ScopedObservation<ui::LayerAnimator, ui::LayerAnimationObserver> - layer_animator_observer{this}; - layer_animator_observer.Observe(layer_animator_); - - // Loop until the `layer`'s animation is stopped. - wait_loop_ = std::make_unique<base::RunLoop>(); - wait_loop_->Run(); - - // Reset. - layer_animator_ = nullptr; - wait_loop_.reset(); - } - - private: - // ui::LayerAnimationObserver: - void OnLayerAnimationScheduled( - ui::LayerAnimationSequence* sequence) override {} - - void OnLayerAnimationStarted(ui::LayerAnimationSequence* sequence) override {} - - void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override { - if (!layer_animator_->is_animating()) - wait_loop_->Quit(); - } - - void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override { - if (!layer_animator_->is_animating()) - wait_loop_->Quit(); - } - - ui::LayerAnimator* layer_animator_ = nullptr; - std::unique_ptr<base::RunLoop> wait_loop_; -}; - // ViewVisibilityChangedWaiter ------------------------------------------------- // A class capable of waiting until a view's visibility is changed.
diff --git a/ash/system/message_center/notification_grouping_controller.cc b/ash/system/message_center/notification_grouping_controller.cc index 6b6a18b..56bbe59 100644 --- a/ash/system/message_center/notification_grouping_controller.cc +++ b/ash/system/message_center/notification_grouping_controller.cc
@@ -133,6 +133,15 @@ GetActiveNotificationViewController()->GetMessageViewForNotificationId( notification_id); + // TODO(crbug/1277765) Need this check to fix crbug/1275765. However, this + // should not be necessary if the message center bubble is initialized + // properly. Need to monitor for empty group notifications if this check is + // hit and fix the root cause. + if (!parent_view) { + LOG(WARNING) << "MessageView does not exist for notification: " + << notification_id; + return; + } std::vector<const Notification*> notifications; for (const auto* notification : MessageCenter::Get()->GetNotifications()) { if (notification->notifier_id() == parent_view->notifier_id() &&
diff --git a/ash/test/layer_animation_stopped_waiter.cc b/ash/test/layer_animation_stopped_waiter.cc new file mode 100644 index 0000000..a6569f5 --- /dev/null +++ b/ash/test/layer_animation_stopped_waiter.cc
@@ -0,0 +1,49 @@ +// Copyright (c) 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/test/layer_animation_stopped_waiter.h" + +#include "base/run_loop.h" +#include "base/scoped_observation.h" +#include "ui/compositor/layer.h" +#include "ui/compositor/layer_animator.h" + +namespace ash { + +LayerAnimationStoppedWaiter::LayerAnimationStoppedWaiter() = default; + +LayerAnimationStoppedWaiter::~LayerAnimationStoppedWaiter() = default; + +void LayerAnimationStoppedWaiter::Wait(ui::Layer* layer) { + if (!layer->GetAnimator()->is_animating()) + return; + + // Temporarily cache and observe `layer`'s animator. + layer_animator_ = layer->GetAnimator(); + base::ScopedObservation<ui::LayerAnimator, ui::LayerAnimationObserver> + layer_animator_observer{this}; + layer_animator_observer.Observe(layer_animator_); + + // Loop until the `layer`'s animation is stopped. + wait_loop_ = std::make_unique<base::RunLoop>(); + wait_loop_->Run(); + + // Reset. + layer_animator_ = nullptr; + wait_loop_.reset(); +} + +void LayerAnimationStoppedWaiter::OnLayerAnimationAborted( + ui::LayerAnimationSequence* sequence) { + if (!layer_animator_->is_animating()) + wait_loop_->Quit(); +} + +void LayerAnimationStoppedWaiter::OnLayerAnimationEnded( + ui::LayerAnimationSequence* sequence) { + if (!layer_animator_->is_animating()) + wait_loop_->Quit(); +} + +} // namespace ash
diff --git a/ash/test/layer_animation_stopped_waiter.h b/ash/test/layer_animation_stopped_waiter.h new file mode 100644 index 0000000..1986d57 --- /dev/null +++ b/ash/test/layer_animation_stopped_waiter.h
@@ -0,0 +1,52 @@ +// Copyright (c) 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_TEST_LAYER_ANIMATION_STOPPED_WAITER_H_ +#define ASH_TEST_LAYER_ANIMATION_STOPPED_WAITER_H_ + +#include <memory> + +#include "ui/compositor/layer_animation_observer.h" + +namespace base { +class RunLoop; +} + +namespace ui { +class Layer; +class LayerAnimator; +} // namespace ui + +namespace ash { + +// A class capable of waiting until a layer has stopped animating. +class LayerAnimationStoppedWaiter : public ui::LayerAnimationObserver { + public: + LayerAnimationStoppedWaiter(); + LayerAnimationStoppedWaiter(const LayerAnimationStoppedWaiter&) = delete; + LayerAnimationStoppedWaiter& operator=(const LayerAnimationStoppedWaiter&) = + delete; + ~LayerAnimationStoppedWaiter() override; + + // Waits until the specified `layer`'s animation is stopped. + void Wait(ui::Layer* layer); + + private: + // ui::LayerAnimationObserver: + void OnLayerAnimationScheduled( + ui::LayerAnimationSequence* sequence) override {} + + void OnLayerAnimationStarted(ui::LayerAnimationSequence* sequence) override {} + + void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override; + + void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override; + + ui::LayerAnimator* layer_animator_ = nullptr; + std::unique_ptr<base::RunLoop> wait_loop_; +}; + +} // namespace ash + +#endif // ASH_TEST_LAYER_ANIMATION_STOPPED_WAITER_H_
diff --git a/ash/webui/personalization_app/resources/common/base.css b/ash/webui/personalization_app/resources/common/base.css index b1f4e0b..e1083f5 100644 --- a/ash/webui/personalization_app/resources/common/base.css +++ b/ash/webui/personalization_app/resources/common/base.css
@@ -6,6 +6,7 @@ body { height: 100%; margin: 0; + overscroll-behavior: none; } body {
diff --git a/ash/webui/personalization_app/resources/common/styles.html b/ash/webui/personalization_app/resources/common/styles.html index 92893946..88669823 100644 --- a/ash/webui/personalization_app/resources/common/styles.html +++ b/ash/webui/personalization_app/resources/common/styles.html
@@ -103,6 +103,7 @@ height: 100%; /* stop img and gradient-mask from ignoring above border-radius. */ overflow: hidden; + position: relative; width: 100%; } .photo-images-container.photo-images-container-0 {
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_fullscreen_element.html b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_fullscreen_element.html index 4d18b80..4055974 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_fullscreen_element.html +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_fullscreen_element.html
@@ -2,6 +2,7 @@ #container { background-color: transparent; height: 100%; + overscroll-behavior: none; pointer-events: auto; position: relative; width: 100%;
diff --git a/ash/webui/personalization_app/resources/untrusted/images_grid.html b/ash/webui/personalization_app/resources/untrusted/images_grid.html index 718ad7c3..678f9a9 100644 --- a/ash/webui/personalization_app/resources/untrusted/images_grid.html +++ b/ash/webui/personalization_app/resources/untrusted/images_grid.html
@@ -2,6 +2,14 @@ :host { margin: 12px 0; } + .photo-images-container img.left { + clip-path: inset(0 50% 0 0); + position: absolute; + } + .photo-images-container img.right { + clip-path: inset(0 0 0 50%); + position: absolute; + } </style> <iron-list scroll-target="document" grid items="[[tiles_]]" role="listbox" aria-setsize$="[[tiles_.length]]"> @@ -16,7 +24,7 @@ aria-label$="[[getAriaLabel_(item)]]"> <div class="photo-images-container"> <template is="dom-repeat" items="[[item.preview]]" as="preview"> - <img src$="[[preview.url]]" aria-hidden="true"> + <img class$="[[getClassForImg_(index, item)]]" src$="[[preview.url]]" aria-hidden="true"> </template> <iron-icon icon="personalization:checkmark"></iron-icon> </div>
diff --git a/ash/webui/personalization_app/resources/untrusted/images_grid.js b/ash/webui/personalization_app/resources/untrusted/images_grid.js index 40ca645f..8289f98 100644 --- a/ash/webui/personalization_app/resources/untrusted/images_grid.js +++ b/ash/webui/personalization_app/resources/untrusted/images_grid.js
@@ -134,6 +134,25 @@ } /** + * @param {number} index + * @param {ImageTile} tile + * @return {string} + */ + getClassForImg_(index, tile) { + if (tile.preview.length < 2) { + return ''; + } + switch (index) { + case 0: + return 'left'; + case 1: + return 'right'; + default: + return ''; + } + } + + /** * Notify trusted code that a user selected an image. * @private * @param {!Event} e
diff --git a/ash/webui/projector_app/BUILD.gn b/ash/webui/projector_app/BUILD.gn index fc3fa27..cf54182d 100644 --- a/ash/webui/projector_app/BUILD.gn +++ b/ash/webui/projector_app/BUILD.gn
@@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//ash/webui/projector_app/projector_app.gni") +import("//build/buildflag_header.gni") import("//build/config/chromeos/ui_mode.gni") assert(is_chromeos_ash, "Projector App is ash-chrome only") @@ -28,9 +30,12 @@ deps = [ "//ash/public/cpp", + "//ash/webui/media_app_ui:buildflags", + "//ash/webui/resources:media_app_bundle_resources", "//ash/webui/resources:projector_app_bundle_resources", "//ash/webui/resources:projector_app_trusted_resources", "//ash/webui/resources:projector_app_untrusted_resources", + "//ash/webui/resources:projector_app_untrusted_resources", "//chromeos/strings", "//components/prefs", "//components/signin/public/identity_manager",
diff --git a/ash/webui/projector_app/DEPS b/ash/webui/projector_app/DEPS index de13424..89f06be2 100644 --- a/ash/webui/projector_app/DEPS +++ b/ash/webui/projector_app/DEPS
@@ -1,4 +1,6 @@ include_rules = [ + "+chromeos/grit/chromeos_media_app_bundle_resources.h", + "+chromeos/grit/chromeos_media_app_bundle_resources_map.h", "+chromeos/grit/chromeos_projector_app_bundle_resources.h", "+chromeos/grit/chromeos_projector_app_bundle_resources_map.h", "+components/signin/public/identity_manager",
diff --git a/ash/webui/projector_app/projector_app.gni b/ash/webui/projector_app/projector_app.gni index bf44edf..8692a7f 100644 --- a/ash/webui/projector_app/projector_app.gni +++ b/ash/webui/projector_app/projector_app.gni
@@ -1,3 +1,4 @@ +import("//ash/webui/media_app_ui/media_app_ui.gni") import("//build/config/chrome_build.gni") import("//build/config/chromeos/ui_mode.gni") @@ -6,3 +7,6 @@ # bundled for testing integration points. enable_cros_projector_app = is_chromeos_ash && is_chrome_branded } + +assert(!enable_cros_projector_app || enable_cros_media_app, + "Projector App requires enable_cros_media_app for ink dependencies")
diff --git a/ash/webui/projector_app/resources/annotator/annotator.html b/ash/webui/projector_app/resources/annotator/annotator.html index 590dad7..7bba46c9 100644 --- a/ash/webui/projector_app/resources/annotator/annotator.html +++ b/ash/webui/projector_app/resources/annotator/annotator.html
@@ -7,12 +7,10 @@ <!DOCTYPE html> <html> <head> - <!--TODO(b/193579885): Load Ink library resources.--> <script type="module" src="./untrusted/untrusted_annotator_comm_factory.js"></script> - <script type="module" src="../annotator/annotator_bin.js"></script> + <script src="./ink.js"></script> + <script src="./annotator_bin.js"></script> </head> <body> - <div id="ink-canvas"> - </div> </body> </html>
diff --git a/ash/webui/projector_app/untrusted_projector_ui.cc b/ash/webui/projector_app/untrusted_projector_ui.cc index a962a95..d8ff0e0d 100644 --- a/ash/webui/projector_app/untrusted_projector_ui.cc +++ b/ash/webui/projector_app/untrusted_projector_ui.cc
@@ -6,6 +6,7 @@ #include "ash/grit/ash_projector_app_untrusted_resources.h" #include "ash/grit/ash_projector_app_untrusted_resources_map.h" +#include "ash/webui/media_app_ui/buildflags.h" #include "ash/webui/projector_app/public/cpp/projector_app_constants.h" #include "chromeos/grit/chromeos_projector_app_bundle_resources.h" #include "chromeos/grit/chromeos_projector_app_bundle_resources_map.h" @@ -17,6 +18,10 @@ #include "ui/resources/grit/webui_generated_resources_map.h" #include "url/gurl.h" +#if BUILDFLAG(ENABLE_CROS_MEDIA_APP) +#include "chromeos/grit/chromeos_media_app_bundle_resources.h" +#endif // BUILDFLAG(ENABLE_CROS_MEDIA_APP) + namespace ash { namespace { @@ -39,12 +44,25 @@ source->AddResourcePaths( base::make_span(kWebuiGeneratedResources, kWebuiGeneratedResourcesSize)); +#if BUILDFLAG(ENABLE_CROS_MEDIA_APP) + // Loads WASM resources shipped to Chromium by chrome://media-app. + source->AddResourcePath("annotator/ink_engine_ink.worker.js", + IDR_MEDIA_APP_INK_ENGINE_INK_WORKER_JS); + source->AddResourcePath("annotator/ink_engine_ink.wasm", + IDR_MEDIA_APP_INK_ENGINE_INK_WASM); + source->AddResourcePath("annotator/ink.js", IDR_MEDIA_APP_INK_JS); +#endif // BUILDFLAG(ENABLE_CROS_MEDIA_APP) + // Provide a list of specific script resources(javascript files and inlined // scripts inside html) or their sha-256 hashes to allow to be executed. + // "wasm-eval" is added to allow wasm. source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::ScriptSrc, - // Allows loading javascript files from the current origin - "script-src 'self';"); + "script-src 'self' 'wasm-eval';"); + // Need to explicitly set |worker-src| because CSP falls back to |child-src| + // which is none. + source->OverrideContentSecurityPolicy( + network::mojom::CSPDirectiveName::WorkerSrc, "worker-src 'self';"); // Allow styles to include inline styling needed for Polymer elements. source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::StyleSrc, @@ -57,20 +75,23 @@ network::mojom::CSPDirectiveName::MediaSrc, // Allows streaming video. "media-src 'self' https://*.drive.google.com;"); - + // Allow images to also handle data urls. + source->OverrideContentSecurityPolicy( + network::mojom::CSPDirectiveName::ImgSrc, + "img-src blob: data: 'self' https://*.drive.google.com;"); source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::ConnectSrc, "connect-src 'self' https://www.googleapis.com " "https://drive.google.com;"); + // Allow use of SharedArrayBuffer (required by the wasm). + source->OverrideCrossOriginOpenerPolicy("same-origin"); + source->OverrideCrossOriginEmbedderPolicy("require-corp"); + // TODO(b/197120695): re-enable trusted type after fixing the issue that icon // template is setting innerHTML. source->DisableTrustedTypesCSP(); - // TODO(b/193579885): Add ink WASM. - // TODO(b/193579885): Override content security policy to support loading wasm - // resources. - source->AddFrameAncestor(GURL(kChromeUITrustedProjectorUrl)); delegate->PopulateLoadTimeData(source);
diff --git a/ash/webui/shimless_rma/resources/critical_error_page.html b/ash/webui/shimless_rma/resources/critical_error_page.html index ac68857..d26f2568 100644 --- a/ash/webui/shimless_rma/resources/critical_error_page.html +++ b/ash/webui/shimless_rma/resources/critical_error_page.html
@@ -8,19 +8,30 @@ height: 20px; width: 20px; } + + #performUpdateButton { + border-color: var(--google-blue-600); + border-radius: 12px; + } + + #recoverFirmwareButton { + border-color: var(--google-blue-600); + border-radius: 12px; + } </style> <base-page orientation="column"> <div slot="header"> + <iron-icon icon="shimless-icon:warning" + class="small-icon"> + </iron-icon> <h1>[[i18n('criticalErrorTitleText')]]</h1> + <div>[[i18n('criticalErrorMessageText')]]</div> <div id="writeProtectStatus">[[statusString_]]</div> - <cr-button id="exitToLoginButton" on-click="onExitToLoginButtonClicked_"> - [[i18n('criticalErrorExitToLoginText')]] - </cr-button> <cr-button id="performUpdateButton" on-click="onRebootButtonClicked_"> - [[i18n('criticalErrorRebootText')]] - <iron-icon id="restartIcon" icon="shimless-icon:update" - class="small-icon"> - </iron-icon> + [[i18n('criticalErrorRebootText')]] + </cr-button> + <cr-button id="recoverFirmwareButton" on-click="onRecoverFirmwareButtonClicked_"> + [[i18n('criticalErrorRecoverFirmwareText')]] </cr-button> </div> <div slot="body">
diff --git a/ash/webui/shimless_rma/resources/critical_error_page.js b/ash/webui/shimless_rma/resources/critical_error_page.js index dabe91fa6..7cc64ca 100644 --- a/ash/webui/shimless_rma/resources/critical_error_page.js +++ b/ash/webui/shimless_rma/resources/critical_error_page.js
@@ -43,7 +43,8 @@ } /** @protected */ - onExitToLoginButtonClicked_() { + onRecoverFirmwareButtonClicked_() { + // TODO(swifton): Rename the method to match the action that it performs. this.shimlessRmaService_.criticalErrorExitToLogin(); }
diff --git a/ash/webui/shimless_rma/resources/fake_data.js b/ash/webui/shimless_rma/resources/fake_data.js index 397bbdc..88da8935 100644 --- a/ash/webui/shimless_rma/resources/fake_data.js +++ b/ash/webui/shimless_rma/resources/fake_data.js
@@ -122,6 +122,12 @@ canGoBack: true, error: RmadErrorCode.kOk }, + { + state: State.kUnknown, + canCancel: false, + canGoBack: false, + error: RmadErrorCode.kOk + }, ]; /** @type {!Array<string>} */
diff --git a/ash/webui/shimless_rma/shimless_rma.cc b/ash/webui/shimless_rma/shimless_rma.cc index 6e1f8a84..5ee6649 100644 --- a/ash/webui/shimless_rma/shimless_rma.cc +++ b/ash/webui/shimless_rma/shimless_rma.cc
@@ -275,8 +275,8 @@ // Critical error {"criticalErrorTitleText", IDS_SHIMLESS_RMA_CRITICAL_ERROR_TITLE}, {"criticalErrorMessageText", IDS_SHIMLESS_RMA_CRITICAL_ERROR_MESSAGE}, - {"criticalErrorExitToLoginText", - IDS_SHIMLESS_RMA_CRITICAL_EXIT_TO_LOGIN_BUTTON}, + {"criticalErrorRecoverFirmwareText", + IDS_SHIMLESS_RMA_CRITICAL_RECOVER_FIRMWARE_BUTTON}, {"criticalErrorRebootText", IDS_SHIMLESS_RMA_CRITICAL_REBOOT_BUTTON}, };
diff --git a/ash/wm/desks/templates/desks_templates_icon_container.cc b/ash/wm/desks/templates/desks_templates_icon_container.cc index 811a8a6..2e02ee9 100644 --- a/ash/wm/desks/templates/desks_templates_icon_container.cc +++ b/ash/wm/desks/templates/desks_templates_icon_container.cc
@@ -13,6 +13,7 @@ #include "ash/wm/desks/templates/desks_templates_icon_view.h" #include "base/containers/contains.h" #include "components/app_restore/app_launch_info.h" +#include "extensions/common/constants.h" #include "ui/aura/client/aura_constants.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/color/color_provider.h" @@ -86,10 +87,18 @@ constexpr int kInactiveTabOffset = 10000; for (auto& restore_data : launch_list) { + // If `restore_data` is a SWA then it will have a valid url for its active + // tab. However, in this case we want to display the SWA's icon via its app + // id so to determine whether `restore_data` is an SWA we need to check + // whether it's a browser. + const bool is_browser = + app_id == extension_misc::kChromeAppId && + (!restore_data.second->app_type_browser.has_value() || + !restore_data.second->app_type_browser.value()); const int activation_index = restore_data.second->activation_index.value(); - if (restore_data.second->urls.has_value()) { - const int active_tab_index = - restore_data.second->active_tab_index.value(); + const int active_tab_index = + restore_data.second->active_tab_index.value_or(-1); + if (restore_data.second->urls.has_value() && is_browser) { const auto& urls = restore_data.second->urls.value(); for (int i = 0; i < static_cast<int>(urls.size()); ++i) { InsertIdentifierInfo(urls[i].spec(),
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc index d88eb63..4fc91e2 100644 --- a/ash/wm/desks/templates/desks_templates_unittest.cc +++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -45,6 +45,7 @@ #include "components/app_restore/window_info.h" #include "components/app_restore/window_properties.h" #include "components/prefs/pref_service.h" +#include "extensions/common/constants.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" #include "ui/compositor/layer.h" @@ -777,13 +778,13 @@ // Tests that icons are ordered such that active tabs and windows are ordered // before inactive tabs. TEST_F(DesksTemplatesTest, IconsOrderWithInactiveTabs) { - const std::string kAppId1 = "app_1"; + const std::string kAppId1 = extension_misc::kChromeAppId; constexpr int kWindowId1 = 1; constexpr int kActiveTabIndex1 = 1; const std::vector<GURL> kTabs1{GURL("http://a.com"), GURL("http://b.com"), GURL("http://c.com")}; - const std::string kAppId2 = "app_2"; + const std::string kAppId2 = extension_misc::kChromeAppId; constexpr int kWindowId2 = 2; constexpr int kActiveTabIndex2 = 2; const std::vector<GURL> kTabs2{GURL("http://d.com"), GURL("http://e.com"),
diff --git a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc index 4197b6b2..3093cc2 100644 --- a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc +++ b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -623,7 +623,7 @@ } // namespace allocator } // namespace base -constexpr AllocatorDispatch AllocatorDispatch::default_dispatch = { +const AllocatorDispatch AllocatorDispatch::default_dispatch = { &base::internal::PartitionMalloc, // alloc_function &base::internal::PartitionMallocUnchecked, // alloc_unchecked_function &base::internal::PartitionCalloc, // alloc_zero_initialized_function
diff --git a/base/allocator/partition_allocator/partition_page.h b/base/allocator/partition_allocator/partition_page.h index 0ecdf72..631b2c22 100644 --- a/base/allocator/partition_allocator/partition_page.h +++ b/base/allocator/partition_allocator/partition_page.h
@@ -161,6 +161,9 @@ BASE_EXPORT NOINLINE void FreeSlowPath(size_t number_of_freed); ALWAYS_INLINE PartitionFreelistEntry* PopForAlloc(size_t size); ALWAYS_INLINE void Free(void* ptr); + // Appends the passed freelist to the slot-span's freelist. Please note that + // the function doesn't increment the tags of the passed freelist entries, + // since FreeNoHooks() did it already. ALWAYS_INLINE void AppendFreeList(PartitionFreelistEntry* head, PartitionFreelistEntry* tail, size_t number_of_freed); @@ -684,11 +687,11 @@ size_t number_of_entries = 0; for (auto* entry = head; entry; entry = entry->GetNext(bucket->slot_size), ++number_of_entries) { + auto* unmasked_entry = reinterpret_cast<char*>(memory::UnmaskPtr(entry)); // Check that all entries belong to this slot span. - PA_DCHECK(ToSlotSpanStartPtr(this) <= entry); - PA_DCHECK(reinterpret_cast<char*>(entry) < - (static_cast<char*>(ToSlotSpanStartPtr(this)) + - bucket->get_bytes_per_span())); + PA_DCHECK(ToSlotSpanStartPtr(this) <= unmasked_entry); + PA_DCHECK(unmasked_entry < (static_cast<char*>(ToSlotSpanStartPtr(this)) + + bucket->get_bytes_per_span())); } PA_DCHECK(number_of_entries == number_of_freed); }
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h index ade8b2f8..3d659f6 100644 --- a/base/allocator/partition_allocator/partition_root.h +++ b/base/allocator/partition_allocator/partition_root.h
@@ -1071,8 +1071,7 @@ PCScan::JoinScanIfNeeded(); if (LIKELY(internal::IsManagedByNormalBuckets( reinterpret_cast<uintptr_t>(ptr)))) { - PCScan::MoveToQuarantine(memory::UnmaskPtr(slot_start), - slot_span->GetUsableSize(root), + PCScan::MoveToQuarantine(ptr, slot_span->GetUsableSize(root), slot_start, slot_span->bucket->slot_size); return; } @@ -1128,9 +1127,10 @@ if (UNLIKELY(IsQuarantineEnabled())) { if (LIKELY(internal::IsManagedByNormalBuckets( reinterpret_cast<uintptr_t>(ptr)))) { + auto* unmasked_slot_start = memory::UnmaskPtr(slot_start); // Mark the state in the state bitmap as freed. - internal::StateBitmapFromPointer(slot_start) - ->Free(reinterpret_cast<uintptr_t>(slot_start)); + internal::StateBitmapFromPointer(unmasked_slot_start) + ->Free(reinterpret_cast<uintptr_t>(unmasked_slot_start)); } } @@ -1690,9 +1690,10 @@ if (UNLIKELY(is_quarantine_enabled)) { if (LIKELY(internal::IsManagedByNormalBuckets( reinterpret_cast<uintptr_t>(ret)))) { + auto* unmasked_slot_start = memory::UnmaskPtr(slot_start); // Mark the corresponding bits in the state bitmap as allocated. - internal::StateBitmapFromPointer(ret)->Allocate( - reinterpret_cast<uintptr_t>(slot_start)); + internal::StateBitmapFromPointer(unmasked_slot_start) + ->Allocate(reinterpret_cast<uintptr_t>(unmasked_slot_start)); } }
diff --git a/base/allocator/partition_allocator/starscan/pcscan.h b/base/allocator/partition_allocator/starscan/pcscan.h index d1c4cfd..8811c0d1 100644 --- a/base/allocator/partition_allocator/starscan/pcscan.h +++ b/base/allocator/partition_allocator/starscan/pcscan.h
@@ -101,6 +101,7 @@ ALWAYS_INLINE static void MoveToQuarantine(void* ptr, size_t usable_size, + void* slot_start, size_t slot_size); // Performs scanning unconditionally. @@ -233,8 +234,8 @@ ALWAYS_INLINE void PCScan::MoveToQuarantine(void* ptr, size_t usable_size, + void* slot_start, size_t slot_size) { - PA_DCHECK(ptr == memory::UnmaskPtr(ptr)); PCScan& instance = Instance(); if (instance.clear_type_ == ClearType::kEager) { // We need to distinguish between usable_size and slot_size in this context: @@ -246,12 +247,13 @@ SecureMemset(ptr, 0, usable_size); } - auto* state_bitmap = StateBitmapFromPointer(ptr); + auto* unmasked_slot = memory::UnmaskPtr(slot_start); + auto* state_bitmap = StateBitmapFromPointer(unmasked_slot); // Mark the state in the state bitmap as quarantined. Make sure to do it after // the clearing to avoid racing with *Scan Sweeper. const bool succeeded = state_bitmap->Quarantine( - reinterpret_cast<uintptr_t>(ptr), instance.epoch()); + reinterpret_cast<uintptr_t>(unmasked_slot), instance.epoch()); #if PA_STARSCAN_EAGER_DOUBLE_FREE_DETECTION_ENABLED if (UNLIKELY(!succeeded)) DoubleFreeAttempt();
diff --git a/base/allocator/partition_allocator/starscan/pcscan_internal.cc b/base/allocator/partition_allocator/starscan/pcscan_internal.cc index cb42b5b83..e15b89a 100644 --- a/base/allocator/partition_allocator/starscan/pcscan_internal.cc +++ b/base/allocator/partition_allocator/starscan/pcscan_internal.cc
@@ -906,7 +906,8 @@ void UnmarkInCardTable(void* object, SlotSpanMetadata<ThreadSafe>* slot_span) { #if PA_STARSCAN_USE_CARD_TABLE - const uintptr_t object_as_uintptr = reinterpret_cast<uintptr_t>(object); + const uintptr_t object_as_uintptr = + reinterpret_cast<uintptr_t>(memory::UnmaskPtr(object)); // Reset card(s) for this quarantined object. Please note that the // cards may still contain quarantined objects (which were // promoted in this scan cycle), but @@ -992,7 +993,7 @@ size_t freelist_entries = 0; const auto bitmap_iterator = [&](uintptr_t ptr) { - auto* ptr_void = reinterpret_cast<void*>(ptr); + auto* ptr_void = memory::RemaskPtr(reinterpret_cast<void*>((ptr))); SlotSpan* current_slot_span = SlotSpan::FromSlotStartPtr(ptr_void); auto* entry = new (ptr_void) PartitionFreelistEntry();
diff --git a/base/allocator/partition_allocator/starscan/pcscan_unittest.cc b/base/allocator/partition_allocator/starscan/pcscan_unittest.cc index ccd474be..3fa04a6 100644 --- a/base/allocator/partition_allocator/starscan/pcscan_unittest.cc +++ b/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
@@ -88,8 +88,9 @@ void FinishPCScanAsScanner() { PCScan::FinishScanForTesting(); } bool IsInQuarantine(void* ptr) const { - return StateBitmapFromPointer(ptr)->IsQuarantined( - reinterpret_cast<uintptr_t>(ptr)); + auto* unmasked = memory::UnmaskPtr(ptr); + return StateBitmapFromPointer(unmasked)->IsQuarantined( + reinterpret_cast<uintptr_t>(unmasked)); } ThreadSafePartitionRoot& root() { return *allocator_.root(); }
diff --git a/base/memory/tagging.cc b/base/memory/tagging.cc index 0471de6..a848c2e 100644 --- a/base/memory/tagging.cc +++ b/base/memory/tagging.cc
@@ -77,8 +77,8 @@ FilePath library_path = module_path.Append("libc.so"); NativeLibrary library = LoadNativeLibrary(library_path, &load_error); if (!library) { - LOG(FATAL) << "ChangeMemoryTaggingModeForAllThreadsPerProcess: dlsym " - "mallopt failure" + LOG(FATAL) << "ChangeMemoryTaggingModeForAllThreadsPerProcess: dlopen " + "libc failure" << load_error.ToString(); } void* func_ptr = GetFunctionPointerFromNativeLibrary(library, "mallopt");
diff --git a/base/values.cc b/base/values.cc index a4c32ec..bb30898 100644 --- a/base/values.cc +++ b/base/values.cc
@@ -1103,10 +1103,6 @@ return current_entry != dict().end(); } -void DictionaryValue::Clear() { - DictClear(); -} - Value* DictionaryValue::Set(StringPiece path, std::unique_ptr<Value> in_value) { DCHECK(IsStringUTF8AllowingNoncharacters(path)); DCHECK(in_value);
diff --git a/base/values.h b/base/values.h index c62a8f7..2b6a764 100644 --- a/base/values.h +++ b/base/values.h
@@ -645,10 +645,6 @@ // DEPRECATED, use `Value::FindKey(key)` instead. bool HasKey(StringPiece key) const; - // Clears any current contents of this dictionary. - // DEPRECATED, use `Value::DictClear()` instead. - void Clear(); - // Sets the Value associated with the given path starting from this object. // A path has the form "<key>" or "<key>.<key>.[...]", where "." indexes // into the next DictionaryValue down. Obviously, "." can't be used
diff --git a/build/android/PRESUBMIT.py b/build/android/PRESUBMIT.py index f00e616..b4f9359 100644 --- a/build/android/PRESUBMIT.py +++ b/build/android/PRESUBMIT.py
@@ -55,7 +55,8 @@ J('..', '..', 'third_party', 'depot_tools'), J('..', '..', 'third_party', 'colorama', 'src'), J('..', '..', 'build'), - ])) + ], + version='2.6')) tests.extend( input_api.canned_checks.GetPylint( input_api, @@ -67,7 +68,8 @@ r'.*create_unwind_table\.py', r'.*create_unwind_table_tests\.py', ], - extra_paths_list=[J('gyp'), J('gn')])) + extra_paths_list=[J('gyp'), J('gn')], + version='2.6')) tests.extend( input_api.canned_checks.GetPylint(
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py index d4e6c04..1a361fe86 100755 --- a/build/android/apk_operations.py +++ b/build/android/apk_operations.py
@@ -445,8 +445,8 @@ code_path = re.search(r'codePath=(.*)', package_output).group(1) lib_path = re.search(r'(?:legacyN|n)ativeLibrary(?:Dir|Path)=(.*)', package_output).group(1) - except AttributeError: - raise Exception('Error parsing dumpsys output: ' + package_output) + except AttributeError as e: + raise Exception('Error parsing dumpsys output: ' + package_output) from e if code_path.startswith('/system'): logging.warning('Measurement of system image apks can be innacurate') @@ -536,12 +536,12 @@ print('Total: %s KiB (%.1f MiB)' % (total, total / 1024.0)) -class _LogcatProcessor(object): +class _LogcatProcessor: ParsedLine = collections.namedtuple( 'ParsedLine', ['date', 'invokation_time', 'pid', 'tid', 'priority', 'tag', 'message']) - class NativeStackSymbolizer(object): + class NativeStackSymbolizer: """Buffers lines from native stacks and symbolizes them when done.""" # E.g.: #06 pc 0x0000d519 /apex/com.android.runtime/lib/libart.so # E.g.: #01 pc 00180c8d /data/data/.../lib/libbase.cr.so @@ -914,7 +914,7 @@ """ % {'s': pprof_out_path})) -class _StackScriptContext(object): +class _StackScriptContext: """Maintains temporary files needed by stack.py.""" def __init__(self, @@ -1036,7 +1036,7 @@ logging.info('Wrote device cache: %s', cache_path) -class _Command(object): +class _Command: name = None description = None long_description = None
diff --git a/build/android/convert_dex_profile.py b/build/android/convert_dex_profile.py index d4bbe96..006cf7a 100755 --- a/build/android/convert_dex_profile.py +++ b/build/android/convert_dex_profile.py
@@ -69,7 +69,7 @@ @functools.total_ordering -class Method(object): +class Method: def __init__(self, name, class_name, param_types=None, return_type=None): self.name = name self.class_name = class_name @@ -100,7 +100,7 @@ return hash((self.name, self.class_name)) -class Class(object): +class Class: def __init__(self, name): self.name = name self._methods = [] @@ -165,7 +165,7 @@ return None -class Profile(object): +class Profile: def __init__(self): # {Method: set(char)} self._methods = collections.defaultdict(set) @@ -188,7 +188,7 @@ output_profile.write(line) -class ProguardMapping(object): +class ProguardMapping: def __init__(self): # {Method: set(Method)} self._method_mapping = collections.defaultdict(set) @@ -224,7 +224,7 @@ class MalformedLineException(Exception): def __init__(self, message, line_number): - super(MalformedLineException, self).__init__(message) + super().__init__(message) self.line_number = line_number def __str__(self):
diff --git a/build/android/dump_apk_resource_strings.py b/build/android/dump_apk_resource_strings.py index 25f91de9..e4c1b8b6 100755 --- a/build/android/dump_apk_resource_strings.py +++ b/build/android/dump_apk_resource_strings.py
@@ -185,7 +185,7 @@ return result -class ResourceStringValues(object): +class ResourceStringValues: """Models all possible values for a named string.""" def __init__(self): @@ -236,7 +236,7 @@ return result -class ResourceStringMap(object): +class ResourceStringMap: """Convenience class to hold the set of all localized strings in a table. Usage is the following:
diff --git a/build/android/emma_coverage_stats.py b/build/android/emma_coverage_stats.py index ec88717..d5b06204 100755 --- a/build/android/emma_coverage_stats.py +++ b/build/android/emma_coverage_stats.py
@@ -38,7 +38,7 @@ ['lineno', 'source', 'covered_status', 'fractional_line_coverage']) -class _EmmaHtmlParser(object): +class _EmmaHtmlParser: """Encapsulates HTML file parsing operations. This class contains all operations related to parsing HTML files that were @@ -214,7 +214,7 @@ return root.findall(xpath_selector) -class _EmmaCoverageStats(object): +class _EmmaCoverageStats: """Computes code coverage stats for Java code using the coverage tool EMMA. This class provides an API that allows users to capture absolute code coverage
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py index 36d2b1a..4dfd1d6 100755 --- a/build/android/gradle/generate_gradle.py +++ b/build/android/gradle/generate_gradle.py
@@ -136,7 +136,7 @@ return subprocess.check_output(cmd, encoding='UTF-8').splitlines() -class _ProjectEntry(object): +class _ProjectEntry: """Helper class for project entries.""" _cached_entries = {} @@ -261,7 +261,7 @@ return self._all_entries -class _ProjectContextGenerator(object): +class _ProjectContextGenerator: """Helper class to generate gradle build files""" def __init__(self, project_dir, build_vars, use_gradle_process_resources, jinja_processor, split_projects, channel):
diff --git a/build/android/gradle/gn_to_cmake.py b/build/android/gradle/gn_to_cmake.py index e20a3bc..d773d76 100755 --- a/build/android/gradle/gn_to_cmake.py +++ b/build/android/gradle/gn_to_cmake.py
@@ -123,7 +123,7 @@ } -class CMakeTargetType(object): +class CMakeTargetType: def __init__(self, command, modifier, property_modifier, is_linkable): self.command = command self.modifier = modifier @@ -186,7 +186,7 @@ return CMakeTargetEscape(cmake_target_name) -class Project(object): +class Project: def __init__(self, project_json): self.targets = project_json['targets'] build_settings = project_json['build_settings'] @@ -226,7 +226,7 @@ self.GetObjectLibraryDependencies(dependency, object_dependencies) -class Target(object): +class Target: def __init__(self, gn_target_name, project): self.gn_name = gn_target_name self.properties = project.targets[self.gn_name]
diff --git a/build/android/gyp/aar.py b/build/android/gyp/aar.py index b157cd8..e4410a3 100755 --- a/build/android/gyp/aar.py +++ b/build/android/gyp/aar.py
@@ -203,8 +203,8 @@ except IOError as e: if not aar_output_present: raise e - raise Exception('Could not update output file: %s\n%s\n' % - (args.output, e)) + raise Exception('Could not update output file: %s\n' % args.output) from e + if __name__ == '__main__': sys.exit(main())
diff --git a/build/android/gyp/compile_java.py b/build/android/gyp/compile_java.py index ba89463..8a7bc98a 100755 --- a/build/android/gyp/compile_java.py +++ b/build/android/gyp/compile_java.py
@@ -273,7 +273,7 @@ return java_file, package_name, class_names -class _InfoFileContext(object): +class _InfoFileContext: """Manages the creation of the class->source file .info file.""" def __init__(self, chromium_code, excluded_globs):
diff --git a/build/android/gyp/java_cpp_enum.py b/build/android/gyp/java_cpp_enum.py index 11bde52..62f1162a 100755 --- a/build/android/gyp/java_cpp_enum.py +++ b/build/android/gyp/java_cpp_enum.py
@@ -28,7 +28,7 @@ ] -class EnumDefinition(object): +class EnumDefinition: def __init__(self, original_enum_name=None, class_name_override=None, enum_package=None, entries=None, comments=None, fixed_type=None): self.original_enum_name = original_enum_name @@ -79,9 +79,9 @@ else: try: self.entries[key] = int(value) - except ValueError: + except ValueError as e: raise Exception('Could not interpret integer from enum value "%s" ' - 'for key %s.' % (value, key)) + 'for key %s.' % (value, key)) from e prev_enum_value = self.entries[key] @@ -141,7 +141,7 @@ return ret -class DirectiveSet(object): +class DirectiveSet: class_name_override_key = 'CLASS_NAME_OVERRIDE' enum_package_key = 'ENUM_PACKAGE' prefix_to_strip_key = 'PREFIX_TO_STRIP' @@ -169,7 +169,7 @@ DirectiveSet.prefix_to_strip_key) -class HeaderParser(object): +class HeaderParser: single_line_comment_re = re.compile(r'\s*//\s*([^\n]*)') multi_line_comment_start_re = re.compile(r'\s*/\*') enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?')
diff --git a/build/android/gyp/jinja_template.py b/build/android/gyp/jinja_template.py index d42189ba..0a6814f 100755 --- a/build/android/gyp/jinja_template.py +++ b/build/android/gyp/jinja_template.py
@@ -34,7 +34,7 @@ return contents, filename, uptodate -class JinjaProcessor(object): +class JinjaProcessor: """Allows easy rendering of jinja templates with input file tracking.""" def __init__(self, loader_base_dir, variables=None): self.loader_base_dir = loader_base_dir
diff --git a/build/android/gyp/proguard.py b/build/android/gyp/proguard.py index 2a857409..41201d7f 100755 --- a/build/android/gyp/proguard.py +++ b/build/android/gyp/proguard.py
@@ -186,7 +186,7 @@ return options -class _SplitContext(object): +class _SplitContext: def __init__(self, name, output_path, input_jars, work_dir, parent_name=None): self.name = name self.parent_name = parent_name @@ -375,12 +375,12 @@ print_stdout=print_stdout, stderr_filter=stderr_filter, fail_on_output=options.warnings_as_errors) - except build_utils.CalledProcessError: + except build_utils.CalledProcessError as e: # Python will print the original exception as well. raise Exception( 'R8 failed. Please see ' 'https://chromium.googlesource.com/chromium/src/+/HEAD/build/' - 'android/docs/java_optimization.md#Debugging-common-failures') + 'android/docs/java_optimization.md#Debugging-common-failures') from e base_has_imported_lib = False if options.desugar_jdk_libs_json:
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py index f284d64..839cb7d6 100644 --- a/build/android/gyp/util/build_utils.py +++ b/build/android/gyp/util/build_utils.py
@@ -190,7 +190,7 @@ exits with a non-zero exit code.""" def __init__(self, cwd, args, output): - super(CalledProcessError, self).__init__() + super().__init__() self.cwd = cwd self.args = args self.output = output
diff --git a/build/android/gyp/util/java_cpp_utils.py b/build/android/gyp/util/java_cpp_utils.py index de593b1..c1849a8 100644 --- a/build/android/gyp/util/java_cpp_utils.py +++ b/build/android/gyp/util/java_cpp_utils.py
@@ -38,7 +38,7 @@ return s.upper() -class JavaString(object): +class JavaString: def __init__(self, name, value, comments): self.name = KCamelToShouty(name) self.value = value @@ -67,7 +67,7 @@ # TODO(crbug.com/937282): Work will be needed if we want to annotate specific # constants in the file to be parsed. -class CppConstantParser(object): +class CppConstantParser: """Parses C++ constants, retaining their comments. The Delegate subclass is responsible for matching and extracting the @@ -76,7 +76,7 @@ """ SINGLE_LINE_COMMENT_RE = re.compile(r'\s*(// [^\n]*)') - class Delegate(object): + class Delegate: def ExtractConstantName(self, line): """Extracts a constant's name from line or None if not a match.""" raise NotImplementedError()
diff --git a/build/android/gyp/util/md5_check.py b/build/android/gyp/util/md5_check.py index 9e851c1..ce2507806 100644 --- a/build/android/gyp/util/md5_check.py +++ b/build/android/gyp/util/md5_check.py
@@ -158,7 +158,7 @@ new_metadata.ToFile(f) -class Changes(object): +class Changes: """Provides and API for querying what changed between runs.""" def __init__(self, old_metadata, new_metadata, force, missing_outputs, @@ -294,7 +294,7 @@ return 'I have no idea what changed (there is a bug).' -class _Metadata(object): +class _Metadata: """Data model for tracking change metadata. Args:
diff --git a/build/android/gyp/util/parallel.py b/build/android/gyp/util/parallel.py index 5b8a06f..6bcf990 100644 --- a/build/android/gyp/util/parallel.py +++ b/build/android/gyp/util/parallel.py
@@ -27,7 +27,7 @@ _fork_kwargs = None -class _ImmediateResult(object): +class _ImmediateResult: def __init__(self, value): self._value = value @@ -44,7 +44,7 @@ return True -class _ExceptionWrapper(object): +class _ExceptionWrapper: """Used to marshal exception messages back to main process.""" def __init__(self, msg, exception_type=None): @@ -57,7 +57,7 @@ self.exception_type)('Originally caused by: ' + self.msg) -class _FuncWrapper(object): +class _FuncWrapper: """Runs on the fork()'ed side to catch exceptions and spread *args.""" def __init__(self, func): @@ -84,7 +84,7 @@ return _ExceptionWrapper(traceback.format_exc()) -class _WrappedResult(object): +class _WrappedResult: """Allows for host-side logic to be run after child process has terminated. * Unregisters associated pool _all_pools.
diff --git a/build/android/gyp/util/protoresources.py b/build/android/gyp/util/protoresources.py index 0da963ec..be39c62ed 100644 --- a/build/android/gyp/util/protoresources.py +++ b/build/android/gyp/util/protoresources.py
@@ -211,7 +211,7 @@ _ProcessZip(zip_path, process_func) -class _ResourceStripper(object): +class _ResourceStripper: def __init__(self, partial_path, keep_predicate): self.partial_path = partial_path self.keep_predicate = keep_predicate
diff --git a/build/android/gyp/util/resource_utils.py b/build/android/gyp/util/resource_utils.py index cc83a5d9..c78b1a21 100644 --- a/build/android/gyp/util/resource_utils.py +++ b/build/android/gyp/util/resource_utils.py
@@ -238,7 +238,7 @@ yield path, archive_path -class ResourceInfoFile(object): +class ResourceInfoFile: """Helper for building up .res.info files.""" def __init__(self): @@ -889,7 +889,7 @@ return dep_subdirs -class _ResourceBuildContext(object): +class _ResourceBuildContext: """A temporary directory for packaging and compiling Android resources. Args:
diff --git a/build/android/gyp/util/resource_utils_test.py b/build/android/gyp/util/resource_utils_test.py index 62d5b43..ff1e025 100755 --- a/build/android/gyp/util/resource_utils_test.py +++ b/build/android/gyp/util/resource_utils_test.py
@@ -19,7 +19,7 @@ os.path.join(os.path.dirname(__file__), os.pardir)) sys.path.insert(1, _BUILD_ANDROID_GYP_ROOT) -import resource_utils # pylint: disable=relative-import +import resource_utils # pylint: disable=line-too-long
diff --git a/build/android/gyp/util/resources_parser.py b/build/android/gyp/util/resources_parser.py index 23083b5e..6d2621a 100644 --- a/build/android/gyp/util/resources_parser.py +++ b/build/android/gyp/util/resources_parser.py
@@ -21,7 +21,7 @@ return re.sub('[\.:]', '_', resource_name) -class RTxtGenerator(object): +class RTxtGenerator: def __init__(self, res_dirs, ignore_pattern=resource_utils.AAPT_IGNORE_PATTERN): @@ -77,7 +77,7 @@ try: return ElementTree.parse(xml_path).getroot() except Exception as e: - raise RuntimeError('Failure parsing {}:\n {}'.format(xml_path, e)) + raise RuntimeError('Failure parsing {}:\n'.format(xml_path)) from e def _ExtractNewIdsFromXml(self, xml_path): return self._ExtractNewIdsFromNode(self._ParseXml(xml_path))
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py index 01bbaa8..62aa5a8 100755 --- a/build/android/gyp/write_build_config.py +++ b/build/android/gyp/write_build_config.py
@@ -580,12 +580,6 @@ from util import build_utils from util import resource_utils -# TODO(crbug.com/1174969): Remove this once Python2 is obsoleted. -if sys.version_info.major == 2: - zip_longest = itertools.izip_longest -else: - zip_longest = itertools.zip_longest - # Types that should never be used as a dependency of another build config. _ROOT_TYPES = ('android_apk', 'java_binary', 'java_annotation_processor', @@ -595,10 +589,8 @@ class OrderedSet(collections.OrderedDict): - # Value |parameter| is present to avoid presubmit warning due to different - # number of parameters from overridden method. @staticmethod - def fromkeys(iterable, value=None): + def fromkeys(iterable): out = OrderedSet() out.update(iterable) return out @@ -630,7 +622,8 @@ return result -class AndroidManifest(object): + +class AndroidManifest: def __init__(self, path): self.path = path dom = xml.dom.minidom.parse(path) @@ -701,7 +694,7 @@ target[:] = [x for x in target if x not in base_target] -class Deps(object): +class Deps: def __init__(self, direct_deps_config_paths): self._all_deps_config_paths = GetAllDepsConfigsInOrder( direct_deps_config_paths) @@ -787,7 +780,7 @@ dest_map = uncompressed if disable_compression else compressed other_map = compressed if disable_compression else uncompressed outputs = entry.get('outputs', []) - for src, dest in zip_longest(entry['sources'], outputs): + for src, dest in itertools.zip_longest(entry['sources'], outputs): if not dest: dest = os.path.basename(src) # Merge so that each path shows up in only one of the lists, and that
diff --git a/build/android/lighttpd_server.py b/build/android/lighttpd_server.py index 561174d..902015b5 100755 --- a/build/android/lighttpd_server.py +++ b/build/android/lighttpd_server.py
@@ -30,7 +30,7 @@ from pylib import pexpect -class LighttpdServer(object): +class LighttpdServer: """Wraps lighttpd server, providing robust startup. Args:
diff --git a/build/android/list_java_targets.py b/build/android/list_java_targets.py index 7534f6a..33bc38ce 100755 --- a/build/android/list_java_targets.py +++ b/build/android/list_java_targets.py
@@ -87,7 +87,7 @@ return ret -class _TargetEntry(object): +class _TargetEntry: def __init__(self, gn_target): assert gn_target.startswith('//'), f'{gn_target} does not start with //' assert ':' in gn_target, f'Non-root {gn_target} required'
diff --git a/build/android/method_count.py b/build/android/method_count.py index 80d0073..8944b4f3 100755 --- a/build/android/method_count.py +++ b/build/android/method_count.py
@@ -13,7 +13,7 @@ from pylib.dex import dex_parser -class DexStatsCollector(object): +class DexStatsCollector: """Tracks count of method/field/string/type as well as unique methods.""" def __init__(self):
diff --git a/build/android/provision_devices.py b/build/android/provision_devices.py index aabb7ade..a8a16e65 100755 --- a/build/android/provision_devices.py +++ b/build/android/provision_devices.py
@@ -46,7 +46,7 @@ _TOMBSTONE_REGEX = re.compile('tombstone.*') -class _DEFAULT_TIMEOUTS(object): +class _DEFAULT_TIMEOUTS: # L can take a while to reboot after a wipe. LOLLIPOP = 600 PRE_LOLLIPOP = 180 @@ -54,7 +54,7 @@ HELP_TEXT = '{}s on L, {}s on pre-L'.format(LOLLIPOP, PRE_LOLLIPOP) -class _PHASES(object): +class _PHASES: WIPE = 'wipe' PROPERTIES = 'properties' FINISH = 'finish'
diff --git a/build/android/pylib/base/base_test_result.py b/build/android/pylib/base/base_test_result.py index f1a1730d..56452ce 100644 --- a/build/android/pylib/base/base_test_result.py +++ b/build/android/pylib/base/base_test_result.py
@@ -12,7 +12,7 @@ from lib.results import result_types # pylint: disable=import-error -class ResultType(object): +class ResultType: """Class enumerating test types. Wraps the results defined in //build/util/lib/results/. @@ -34,7 +34,7 @@ @functools.total_ordering -class BaseTestResult(object): +class BaseTestResult: """Base class for a single test result.""" def __init__(self, name, test_type, duration=0, log='', failure_reason=None): @@ -128,7 +128,7 @@ return self._links -class TestRunResults(object): +class TestRunResults: """Set of results for a test run.""" def __init__(self):
diff --git a/build/android/pylib/base/environment.py b/build/android/pylib/base/environment.py index 744c392c..a8dbff3c 100644 --- a/build/android/pylib/base/environment.py +++ b/build/android/pylib/base/environment.py
@@ -3,7 +3,7 @@ # found in the LICENSE file. -class Environment(object): +class Environment: """An environment in which tests can be run. This is expected to handle all logic that is applicable to an entire specific
diff --git a/build/android/pylib/base/output_manager.py b/build/android/pylib/base/output_manager.py index e0efe19..48f161c 100644 --- a/build/android/pylib/base/output_manager.py +++ b/build/android/pylib/base/output_manager.py
@@ -11,14 +11,14 @@ from devil.utils import reraiser_thread -class Datatype(object): +class Datatype: HTML = 'text/html' JSON = 'application/json' PNG = 'image/png' TEXT = 'text/plain' -class OutputManager(object): +class OutputManager: def __init__(self): """OutputManager Constructor. @@ -88,7 +88,7 @@ self.TearDown() -class ArchivedFile(object): +class ArchivedFile: def __init__(self, out_filename, out_subdir, datatype): self._out_filename = out_filename
diff --git a/build/android/pylib/base/test_collection.py b/build/android/pylib/base/test_collection.py index 34f21fe8..33bcbf59 100644 --- a/build/android/pylib/base/test_collection.py +++ b/build/android/pylib/base/test_collection.py
@@ -5,7 +5,8 @@ import threading -class TestCollection(object): + +class TestCollection: """A threadsafe collection of tests. Args:
diff --git a/build/android/pylib/base/test_instance.py b/build/android/pylib/base/test_instance.py index 7b1099cf..e3e07045 100644 --- a/build/android/pylib/base/test_instance.py +++ b/build/android/pylib/base/test_instance.py
@@ -3,7 +3,7 @@ # found in the LICENSE file. -class TestInstance(object): +class TestInstance: """A type of test. This is expected to handle all logic that is test-type specific but
diff --git a/build/android/pylib/base/test_run.py b/build/android/pylib/base/test_run.py index fc72d3a..d62bc741 100644 --- a/build/android/pylib/base/test_run.py +++ b/build/android/pylib/base/test_run.py
@@ -3,7 +3,7 @@ # found in the LICENSE file. -class TestRun(object): +class TestRun: """An execution of a particular test on a particular device. This is expected to handle all logic that is specific to the combination of
diff --git a/build/android/pylib/base/test_server.py b/build/android/pylib/base/test_server.py index 763e1212..6137835 100644 --- a/build/android/pylib/base/test_server.py +++ b/build/android/pylib/base/test_server.py
@@ -2,7 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -class TestServer(object): + +class TestServer: """Base class for any server that needs to be set up for the tests.""" def __init__(self, *args, **kwargs):
diff --git a/build/android/pylib/content_settings.py b/build/android/pylib/content_settings.py index 5ea7c52..8b894bd 100644 --- a/build/android/pylib/content_settings.py +++ b/build/android/pylib/content_settings.py
@@ -11,7 +11,7 @@ """ def __init__(self, table, device): - super(ContentSettings, self).__init__() + super().__init__() self._table = table self._device = device
diff --git a/build/android/pylib/dex/dex_parser.py b/build/android/pylib/dex/dex_parser.py index 1ff8d252..f89d5af 100755 --- a/build/android/pylib/dex/dex_parser.py +++ b/build/android/pylib/dex/dex_parser.py
@@ -65,7 +65,7 @@ 'annotations_off,class_data_off,static_values_off') -class _MemoryItemList(object): +class _MemoryItemList: """Base class for repeated memory items.""" def __init__(self, @@ -119,14 +119,14 @@ def __init__(self, reader, offset, size): factory = lambda x: _TypeIdItem(x.ReadUInt()) - super(_TypeIdItemList, self).__init__(reader, offset, size, factory) + super().__init__(reader, offset, size, factory) class _ProtoIdItemList(_MemoryItemList): def __init__(self, reader, offset, size): factory = lambda x: _ProtoIdItem(x.ReadUInt(), x.ReadUInt(), x.ReadUInt()) - super(_ProtoIdItemList, self).__init__(reader, offset, size, factory) + super().__init__(reader, offset, size, factory) class _MethodIdItemList(_MemoryItemList): @@ -134,7 +134,7 @@ def __init__(self, reader, offset, size): factory = ( lambda x: _MethodIdItem(x.ReadUShort(), x.ReadUShort(), x.ReadUInt())) - super(_MethodIdItemList, self).__init__(reader, offset, size, factory) + super().__init__(reader, offset, size, factory) class _StringItemList(_MemoryItemList): @@ -148,7 +148,7 @@ string = x.ReadString(data_offset) return _StringDataItem(len(string), string) - super(_StringItemList, self).__init__(reader, offset, size, factory) + super().__init__(reader, offset, size, factory) class _TypeListItem(_MemoryItemList): @@ -160,19 +160,18 @@ # This is necessary because we need to extract the size of the type list # (in other cases the list size is provided in the header). first_item_offset = reader.Tell() - super(_TypeListItem, self).__init__( - reader, - offset, - size, - factory, - alignment=4, - first_item_offset=first_item_offset) + super().__init__(reader, + offset, + size, + factory, + alignment=4, + first_item_offset=first_item_offset) class _TypeListItemList(_MemoryItemList): def __init__(self, reader, offset, size): - super(_TypeListItemList, self).__init__(reader, offset, size, _TypeListItem) + super().__init__(reader, offset, size, _TypeListItem) class _ClassDefItemList(_MemoryItemList): @@ -184,10 +183,10 @@ return _ClassDefItem(*(x.ReadUInt() for _ in range(len(_ClassDefItem._fields)))) - super(_ClassDefItemList, self).__init__(reader, offset, size, factory) + super().__init__(reader, offset, size, factory) -class _DexMapItem(object): +class _DexMapItem: def __init__(self, reader): self.type = reader.ReadUShort() @@ -200,7 +199,7 @@ self.type, self.size, self.offset) -class _DexMapList(object): +class _DexMapList: # Full list of type codes: # https://source.android.com/devices/tech/dalvik/dex-format#type-codes TYPE_TYPE_LIST = 0x1001 @@ -223,7 +222,7 @@ return '_DexMapList(size={}, items={})'.format(self._size, self._map) -class _DexReader(object): +class _DexReader: def __init__(self, data): self._data = data @@ -337,10 +336,10 @@ def __init__(self, message, length, offset): message += ' (decoded string length: {}, string data offset: {:#x})'.format( length, offset) - super(_MUTf8DecodeError, self).__init__(message) + super().__init__(message) -class DexFile(object): +class DexFile: """Represents a single dex file. Parses and exposes access to dex file structure and contents, as described @@ -455,7 +454,7 @@ return '\n'.join(str(item) for item in items) -class _DumpCommand(object): +class _DumpCommand: def __init__(self, dexfile): self._dexfile = dexfile
diff --git a/build/android/pylib/gtest/gtest_test_instance.py b/build/android/pylib/gtest/gtest_test_instance.py index ba0c9a7..9a31a05 100644 --- a/build/android/pylib/gtest/gtest_test_instance.py +++ b/build/android/pylib/gtest/gtest_test_instance.py
@@ -319,7 +319,7 @@ class GtestTestInstance(test_instance.TestInstance): def __init__(self, args, data_deps_delegate, error_func): - super(GtestTestInstance, self).__init__() + super().__init__() # TODO(jbudorick): Support multiple test suites. if len(args.suite_name) > 1: raise ValueError('Platform mode currently supports only 1 gtest suite')
diff --git a/build/android/pylib/instrumentation/instrumentation_parser.py b/build/android/pylib/instrumentation/instrumentation_parser.py index d22fd48f..1dd31b6c 100644 --- a/build/android/pylib/instrumentation/instrumentation_parser.py +++ b/build/android/pylib/instrumentation/instrumentation_parser.py
@@ -34,7 +34,7 @@ _INSTR_LINE_RE = re.compile(r'^\s*INSTRUMENTATION_([A-Z_]+): (.*)$') -class InstrumentationParser(object): +class InstrumentationParser: def __init__(self, stream): """An incremental parser for the output of Android instrumentation tests.
diff --git a/build/android/pylib/instrumentation/instrumentation_test_instance.py b/build/android/pylib/instrumentation/instrumentation_test_instance.py index d8ef7a7..29656c8 100644 --- a/build/android/pylib/instrumentation/instrumentation_test_instance.py +++ b/build/android/pylib/instrumentation/instrumentation_test_instance.py
@@ -72,15 +72,14 @@ class MissingSizeAnnotationError(test_exception.TestException): def __init__(self, class_name): - super(MissingSizeAnnotationError, self).__init__(class_name + + super().__init__( + class_name + ': Test method is missing required size annotation. Add one of: ' + ', '.join('@' + a for a in _VALID_ANNOTATIONS)) class CommandLineParameterizationException(test_exception.TestException): - - def __init__(self, msg): - super(CommandLineParameterizationException, self).__init__(msg) + pass class TestListPickleException(test_exception.TestException): @@ -536,7 +535,7 @@ """Raised when JUnit4 runner is not provided or specified in apk manifest""" def __init__(self): - super(MissingJUnit4RunnerException, self).__init__( + super().__init__( 'JUnit4 runner is not provided or specified in test apk manifest.') @@ -608,7 +607,7 @@ class InstrumentationTestInstance(test_instance.TestInstance): def __init__(self, args, data_deps_delegate, error_func): - super(InstrumentationTestInstance, self).__init__() + super().__init__() self._additional_apks = [] self._apk_under_test = None
diff --git a/build/android/pylib/instrumentation/test_result.py b/build/android/pylib/instrumentation/test_result.py index 766dad8..8cffd9e 100644 --- a/build/android/pylib/instrumentation/test_result.py +++ b/build/android/pylib/instrumentation/test_result.py
@@ -18,8 +18,7 @@ dur: Duration of the test run in milliseconds. log: A string listing any errors. """ - super(InstrumentationTestResult, self).__init__( - full_name, test_type, dur, log) + super().__init__(full_name, test_type, dur, log) name_pieces = full_name.rsplit('#') if len(name_pieces) > 1: self._test_name = name_pieces[1]
diff --git a/build/android/pylib/junit/junit_test_instance.py b/build/android/pylib/junit/junit_test_instance.py index 8a26f98..1b529078 100644 --- a/build/android/pylib/junit/junit_test_instance.py +++ b/build/android/pylib/junit/junit_test_instance.py
@@ -10,7 +10,7 @@ class JunitTestInstance(test_instance.TestInstance): def __init__(self, args, _): - super(JunitTestInstance, self).__init__() + super().__init__() self._coverage_dir = args.coverage_dir self._debug_socket = args.debug_socket
diff --git a/build/android/pylib/local/device/local_device_environment.py b/build/android/pylib/local/device/local_device_environment.py index c254d2e..a518ad7 100644 --- a/build/android/pylib/local/device/local_device_environment.py +++ b/build/android/pylib/local/device/local_device_environment.py
@@ -101,7 +101,7 @@ class LocalDeviceEnvironment(environment.Environment): def __init__(self, args, output_manager, _error_func): - super(LocalDeviceEnvironment, self).__init__(output_manager) + super().__init__(output_manager) self._current_try = 0 self._denylist = (device_denylist.Denylist(args.denylist_file) if args.denylist_file else None)
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py index 23c2143..8be351a 100644 --- a/build/android/pylib/local/device/local_device_gtest_run.py +++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -79,7 +79,7 @@ # No-op context manager. If we used Python 3, we could change this to # contextlib.ExitStack() -class _NullContextManager(object): +class _NullContextManager: def __enter__(self): pass def __exit__(self, *args): @@ -235,7 +235,7 @@ str(coverage_index), '%2m.profraw'])) -class _ApkDelegate(object): +class _ApkDelegate: def __init__(self, test_instance, tool): self._activity = test_instance.activity self._apk_helper = test_instance.apk_helper @@ -293,7 +293,6 @@ extras[gtest_test_instance.EXTRA_SHARD_NANO_TIMEOUT] = int( kwargs['timeout'] * _SECONDS_TO_NANOS) - # pylint: disable=redefined-variable-type command_line_file = _NullContextManager() if flags: if len(flags) > _MAX_INLINE_FLAGS_LENGTH: @@ -311,7 +310,6 @@ extras[_EXTRA_TEST_LIST] = test_list_file.name else: extras[_EXTRA_TEST] = test[0] - # pylint: enable=redefined-variable-type # We need to use GetAppWritablePath here instead of GetExternalStoragePath # since we will not have yet applied legacy storage permission workarounds @@ -368,7 +366,7 @@ device.ClearApplicationState(self._package, permissions=self._permissions) -class _ExeDelegate(object): +class _ExeDelegate: def __init__(self, tr, test_instance, tool): self._host_dist_dir = test_instance.exe_dist_dir @@ -462,14 +460,13 @@ def __init__(self, env, test_instance): assert isinstance(env, local_device_environment.LocalDeviceEnvironment) assert isinstance(test_instance, gtest_test_instance.GtestTestInstance) - super(LocalDeviceGtestRun, self).__init__(env, test_instance) + super().__init__(env, test_instance) if self._test_instance.apk_helper: self._installed_packages = [ self._test_instance.apk_helper.GetPackageName() ] - # pylint: disable=redefined-variable-type if self._test_instance.apk: self._delegate = _ApkDelegate(self._test_instance, env.tool) elif self._test_instance.exe_dist_dir: @@ -479,7 +476,6 @@ self._test_instance.isolated_script_test_perf_output) else: self._test_perf_output_filenames = itertools.repeat(None) - # pylint: enable=redefined-variable-type self._crashes = set() self._servers = collections.defaultdict(list)
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py index 065ca72..4e028033 100644 --- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py +++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -163,8 +163,7 @@ class LocalDeviceInstrumentationTestRun( local_device_test_run.LocalDeviceTestRun): def __init__(self, env, test_instance): - super(LocalDeviceInstrumentationTestRun, self).__init__( - env, test_instance) + super().__init__(env, test_instance) self._chrome_proxy = None self._context_managers = collections.defaultdict(list) self._flag_changers = {} @@ -1064,8 +1063,8 @@ if device.FileExists(trace_device_file.name): try: java_trace_json = device.ReadFile(trace_device_file.name) - except IOError: - raise Exception('error pulling trace file from device') + except IOError as e: + raise Exception('error pulling trace file from device') from e finally: trace_device_file.close()
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run_test.py b/build/android/pylib/local/device/local_device_instrumentation_test_run_test.py index 948e34c1..42af76ab 100755 --- a/build/android/pylib/local/device/local_device_instrumentation_test_run_test.py +++ b/build/android/pylib/local/device/local_device_instrumentation_test_run_test.py
@@ -19,7 +19,7 @@ class LocalDeviceInstrumentationTestRunTest(unittest.TestCase): def setUp(self): - super(LocalDeviceInstrumentationTestRunTest, self).setUp() + super().setUp() self._env = mock_environment.MockEnvironment() self._ti = mock_test_instance.MockTestInstance() self._obj = (
diff --git a/build/android/pylib/local/device/local_device_monkey_test_run.py b/build/android/pylib/local/device/local_device_monkey_test_run.py index 71dd9bd7..b32c9c4 100644 --- a/build/android/pylib/local/device/local_device_monkey_test_run.py +++ b/build/android/pylib/local/device/local_device_monkey_test_run.py
@@ -16,9 +16,6 @@ _CHROME_PACKAGE = constants.PACKAGE_INFO['chrome'].package class LocalDeviceMonkeyTestRun(local_device_test_run.LocalDeviceTestRun): - def __init__(self, env, test_instance): - super(LocalDeviceMonkeyTestRun, self).__init__(env, test_instance) - def TestPackage(self): return 'monkey'
diff --git a/build/android/pylib/local/device/local_device_test_run.py b/build/android/pylib/local/device/local_device_test_run.py index 186355d..3fa75c3 100644 --- a/build/android/pylib/local/device/local_device_test_run.py +++ b/build/android/pylib/local/device/local_device_test_run.py
@@ -44,15 +44,15 @@ class InvalidShardingSettings(Exception): def __init__(self, shard_index, total_shards): - super(InvalidShardingSettings, self).__init__( - 'Invalid sharding settings. shard_index: %d total_shards: %d' - % (shard_index, total_shards)) + super().__init__( + 'Invalid sharding settings. shard_index: %d total_shards: %d' % + (shard_index, total_shards)) class LocalDeviceTestRun(test_run.TestRun): def __init__(self, env, test_instance): - super(LocalDeviceTestRun, self).__init__(env, test_instance) + super().__init__(env, test_instance) self._tools = {} # This is intended to be filled by a child class. self._installed_packages = []
diff --git a/build/android/pylib/local/device/local_device_test_run_test.py b/build/android/pylib/local/device/local_device_test_run_test.py index 0f6c9b5..0de865e9 100755 --- a/build/android/pylib/local/device/local_device_test_run_test.py +++ b/build/android/pylib/local/device/local_device_test_run_test.py
@@ -45,8 +45,7 @@ # pylint: disable=abstract-method def __init__(self): - super(TestLocalDeviceTestRun, self).__init__( - mock.MagicMock(), mock.MagicMock()) + super().__init__(mock.MagicMock(), mock.MagicMock()) class TestLocalDeviceNonStringTestRun( @@ -55,8 +54,7 @@ # pylint: disable=abstract-method def __init__(self): - super(TestLocalDeviceNonStringTestRun, self).__init__( - mock.MagicMock(), mock.MagicMock()) + super().__init__(mock.MagicMock(), mock.MagicMock()) def _GetUniqueTestName(self, test): return test['name']
diff --git a/build/android/pylib/local/emulator/avd.py b/build/android/pylib/local/emulator/avd.py index e637646..d4b45619 100644 --- a/build/android/pylib/local/emulator/avd.py +++ b/build/android/pylib/local/emulator/avd.py
@@ -52,6 +52,8 @@ message_parts.append(' stderr:') message_parts.extend(' %s' % line for line in stderr.splitlines()) + # avd.py is executed with python2. + # pylint: disable=R1725 super(AvdException, self).__init__('\n'.join(message_parts)) @@ -67,7 +69,7 @@ return text_format.Merge(avd_proto_file.read(), avd_pb2.Avd()) -class _AvdManagerAgent(object): +class _AvdManagerAgent: """Private utility for interacting with avdmanager.""" def __init__(self, avd_home, sdk_root): @@ -154,10 +156,12 @@ for line in cmd_helper.IterCmdOutputLines(delete_cmd, env=self._env): logging.info(' %s', line) except subprocess.CalledProcessError as e: + # avd.py is executed with python2. + # pylint: disable=W0707 raise AvdException('AVD deletion failed: %s' % str(e), command=delete_cmd) -class AvdConfig(object): +class AvdConfig: """Represents a particular AVD configuration. This class supports creation, installation, and execution of an AVD @@ -359,9 +363,10 @@ for line in cmd_helper.IterCmdOutputLines(cipd_create_cmd): logging.info(' %s', line) except subprocess.CalledProcessError as e: - raise AvdException( - 'CIPD package creation failed: %s' % str(e), - command=cipd_create_cmd) + # avd.py is executed with python2. + # pylint: disable=W0707 + raise AvdException('CIPD package creation failed: %s' % str(e), + command=cipd_create_cmd) finally: if not keep: @@ -419,10 +424,11 @@ for line in cmd_helper.IterCmdOutputLines(ensure_cmd): logging.info(' %s', line) except subprocess.CalledProcessError as e: - raise AvdException( - 'Failed to install CIPD package %s: %s' % (pkg.package_name, - str(e)), - command=ensure_cmd) + # avd.py is executed with python2. + # pylint: disable=W0707 + raise AvdException('Failed to install CIPD package %s: %s' % + (pkg.package_name, str(e)), + command=ensure_cmd) def _MakeWriteable(self): # The emulator requires that some files are writable. @@ -505,7 +511,7 @@ return instance -class _AvdInstance(object): +class _AvdInstance: """Represents a single running instance of an AVD. This class should only be created directly by AvdConfig.StartInstance, @@ -610,6 +616,8 @@ logging.info('%s started', self._emulator_serial) except Exception as e: self.Stop() + # avd.py is executed with python2. + # pylint: disable=W0707 raise AvdException('Emulator failed to start: %s' % str(e)) def Stop(self):
diff --git a/build/android/pylib/local/emulator/local_emulator_environment.py b/build/android/pylib/local/emulator/local_emulator_environment.py index 60b424b..bea05cf 100644 --- a/build/android/pylib/local/emulator/local_emulator_environment.py +++ b/build/android/pylib/local/emulator/local_emulator_environment.py
@@ -22,8 +22,7 @@ class LocalEmulatorEnvironment(local_device_environment.LocalDeviceEnvironment): def __init__(self, args, output_manager, error_func): - super(LocalEmulatorEnvironment, self).__init__(args, output_manager, - error_func) + super().__init__(args, output_manager, error_func) self._avd_config = avd.AvdConfig(args.avd_config) if args.emulator_count < 1: error_func('--emulator-count must be >= 1') @@ -93,11 +92,11 @@ 'Running with fewer emulator instances than requested (%d vs %d)', len(self._emulator_instances), self._emulator_count) - super(LocalEmulatorEnvironment, self).SetUp() + super().SetUp() #override def TearDown(self): try: - super(LocalEmulatorEnvironment, self).TearDown() + super().TearDown() finally: parallelizer.SyncParallelizer(self._emulator_instances).Stop()
diff --git a/build/android/pylib/local/local_test_server_spawner.py b/build/android/pylib/local/local_test_server_spawner.py index f5f9875..15f34bf4 100644 --- a/build/android/pylib/local/local_test_server_spawner.py +++ b/build/android/pylib/local/local_test_server_spawner.py
@@ -62,7 +62,7 @@ class LocalTestServerSpawner(test_server.TestServer): def __init__(self, port, device, tool): - super(LocalTestServerSpawner, self).__init__() + super().__init__() self._device = device self._spawning_server = chrome_test_server_spawner.SpawningServer( port, PortForwarderAndroid(device, tool), MAX_TEST_SERVER_INSTANCES)
diff --git a/build/android/pylib/local/machine/local_machine_environment.py b/build/android/pylib/local/machine/local_machine_environment.py index 447204cf..e22dd92 100644 --- a/build/android/pylib/local/machine/local_machine_environment.py +++ b/build/android/pylib/local/machine/local_machine_environment.py
@@ -11,7 +11,7 @@ class LocalMachineEnvironment(environment.Environment): def __init__(self, _args, output_manager, _error_func): - super(LocalMachineEnvironment, self).__init__(output_manager) + super().__init__(output_manager) devil_chromium.Initialize( output_directory=constants.GetOutDirectory())
diff --git a/build/android/pylib/local/machine/local_machine_junit_test_run.py b/build/android/pylib/local/machine/local_machine_junit_test_run.py index 411a66d..76ecc04 100644 --- a/build/android/pylib/local/machine/local_machine_junit_test_run.py +++ b/build/android/pylib/local/machine/local_machine_junit_test_run.py
@@ -44,9 +44,6 @@ class LocalMachineJunitTestRun(test_run.TestRun): - def __init__(self, env, test_instance): - super(LocalMachineJunitTestRun, self).__init__(env, test_instance) - #override def TestPackage(self): return self._test_instance.suite
diff --git a/build/android/pylib/monkey/monkey_test_instance.py b/build/android/pylib/monkey/monkey_test_instance.py index 0d5aed6..2ee158d 100644 --- a/build/android/pylib/monkey/monkey_test_instance.py +++ b/build/android/pylib/monkey/monkey_test_instance.py
@@ -14,7 +14,7 @@ class MonkeyTestInstance(test_instance.TestInstance): def __init__(self, args, _): - super(MonkeyTestInstance, self).__init__() + super().__init__() self._categories = args.categories self._event_count = args.event_count
diff --git a/build/android/pylib/output/local_output_manager.py b/build/android/pylib/output/local_output_manager.py index 2b5c0f4..b71d992 100644 --- a/build/android/pylib/output/local_output_manager.py +++ b/build/android/pylib/output/local_output_manager.py
@@ -21,7 +21,7 @@ """ def __init__(self, output_dir): - super(LocalOutputManager, self).__init__() + super().__init__() timestamp = time.strftime( '%Y_%m_%dT%H_%M_%S', time.localtime()) self._output_root = os.path.abspath(os.path.join( @@ -36,8 +36,7 @@ class LocalArchivedFile(output_manager.ArchivedFile): def __init__(self, out_filename, out_subdir, datatype, out_root): - super(LocalArchivedFile, self).__init__( - out_filename, out_subdir, datatype) + super().__init__(out_filename, out_subdir, datatype) self._output_path = os.path.join(out_root, out_subdir, out_filename) def _Link(self):
diff --git a/build/android/pylib/output/noop_output_manager.py b/build/android/pylib/output/noop_output_manager.py index 99409955..254618e 100644 --- a/build/android/pylib/output/noop_output_manager.py +++ b/build/android/pylib/output/noop_output_manager.py
@@ -13,9 +13,6 @@ class NoopOutputManager(output_manager.OutputManager): - def __init__(self): - super(NoopOutputManager, self).__init__() - #override def _CreateArchivedFile(self, out_filename, out_subdir, datatype): del out_filename, out_subdir, datatype @@ -25,7 +22,7 @@ class NoopArchivedFile(output_manager.ArchivedFile): def __init__(self): - super(NoopArchivedFile, self).__init__(None, None, None) + super().__init__(None, None, None) def Link(self): """NoopArchivedFiles are not retained."""
diff --git a/build/android/pylib/output/remote_output_manager.py b/build/android/pylib/output/remote_output_manager.py index 9fdb4bf6..4f569894 100644 --- a/build/android/pylib/output/remote_output_manager.py +++ b/build/android/pylib/output/remote_output_manager.py
@@ -22,7 +22,7 @@ Args bucket: Bucket to use when saving to Google Storage. """ - super(RemoteOutputManager, self).__init__() + super().__init__() self._bucket = bucket #override @@ -43,7 +43,7 @@ class LogdogArchivedFile(output_manager.ArchivedFile): def __init__(self, out_filename, out_subdir, datatype): - super(LogdogArchivedFile, self).__init__(out_filename, out_subdir, datatype) + super().__init__(out_filename, out_subdir, datatype) self._stream_name = '%s_%s' % (out_subdir, out_filename) def _Link(self): @@ -57,8 +57,7 @@ class GoogleStorageArchivedFile(output_manager.ArchivedFile): def __init__(self, out_filename, out_subdir, datatype, bucket): - super(GoogleStorageArchivedFile, self).__init__( - out_filename, out_subdir, datatype) + super().__init__(out_filename, out_subdir, datatype) self._bucket = bucket self._upload_path = None self._content_addressed = None
diff --git a/build/android/pylib/results/flakiness_dashboard/json_results_generator.py b/build/android/pylib/results/flakiness_dashboard/json_results_generator.py index 8a1c58c..734e66b 100644 --- a/build/android/pylib/results/flakiness_dashboard/json_results_generator.py +++ b/build/android/pylib/results/flakiness_dashboard/json_results_generator.py
@@ -97,7 +97,7 @@ return trie -class TestResult(object): +class TestResult: """A simple class that represents a single test result.""" # Test modifier constants. @@ -127,7 +127,7 @@ return self.failed or self.modifier == self.DISABLED -class JSONResultsGeneratorBase(object): +class JSONResultsGeneratorBase: """A JSON results generator for generic tests.""" MAX_NUMBER_OF_BUILD_RESULTS_TO_LOG = 750 @@ -385,7 +385,6 @@ quote(self._builder_name), self.RESULTS_FILENAME, quote(self._test_type), quote(self._master_name))) - # pylint: disable=redefined-variable-type try: # FIXME: We should talk to the network via a Host object. results_file = urlopen(results_file_url) @@ -397,7 +396,6 @@ error = http_error except URLError as url_error: error = url_error - # pylint: enable=redefined-variable-type if old_results: # Strip the prefix and suffix so we can get the actual JSON object. @@ -625,7 +623,7 @@ return len(results) == 1 and results[0][1] == result_type -class _FileUploader(object): +class _FileUploader: def __init__(self, url, timeout_seconds): self._url = url
diff --git a/build/android/pylib/results/flakiness_dashboard/results_uploader.py b/build/android/pylib/results/flakiness_dashboard/results_uploader.py index 672ff3b..07f061f 100644 --- a/build/android/pylib/results/flakiness_dashboard/results_uploader.py +++ b/build/android/pylib/results/flakiness_dashboard/results_uploader.py
@@ -3,7 +3,7 @@ # found in the LICENSE file. """Uploads the results to the flakiness dashboard server.""" -# pylint: disable=E1002,R0201 +# pylint: disable=R0201 import logging import os @@ -25,18 +25,17 @@ """ def __init__(self, builder_name, build_name, build_number, tmp_folder, test_results_map, test_results_server, test_type, master_name): - super(JSONResultsGenerator, self).__init__( - builder_name=builder_name, - build_name=build_name, - build_number=build_number, - results_file_base_path=tmp_folder, - builder_base_url=None, - test_results_map=test_results_map, - svn_repositories=(('webkit', 'third_party/WebKit'), - ('chrome', '.')), - test_results_server=test_results_server, - test_type=test_type, - master_name=master_name) + super().__init__(builder_name=builder_name, + build_name=build_name, + build_number=build_number, + results_file_base_path=tmp_folder, + builder_base_url=None, + test_results_map=test_results_map, + svn_repositories=(('webkit', 'third_party/WebKit'), + ('chrome', '.')), + test_results_server=test_results_server, + test_type=test_type, + master_name=master_name) #override def _GetModifierChar(self, test_name): @@ -81,7 +80,7 @@ return '' -class ResultsUploader(object): +class ResultsUploader: """Handles uploading buildbot tests results to the flakiness dashboard.""" def __init__(self, tests_type): self._build_number = os.environ.get('BUILDBOT_BUILDNUMBER')
diff --git a/build/android/pylib/results/presentation/standard_gtest_merge.py b/build/android/pylib/results/presentation/standard_gtest_merge.py index 0b0b3f3..f4bec5c 100755 --- a/build/android/pylib/results/presentation/standard_gtest_merge.py +++ b/build/android/pylib/results/presentation/standard_gtest_merge.py
@@ -21,8 +21,8 @@ try: with open(summary_json) as f: summary = json.load(f) - except (IOError, ValueError): - raise Exception('Summary json cannot be loaded.') + except (IOError, ValueError) as e: + raise Exception('Summary json cannot be loaded.') from e # Merge all JSON files together. Keep track of missing shards. merged = {
diff --git a/build/android/pylib/results/presentation/test_results_presentation.py b/build/android/pylib/results/presentation/test_results_presentation.py index deca12a..5682b67 100755 --- a/build/android/pylib/results/presentation/test_results_presentation.py +++ b/build/android/pylib/results/presentation/test_results_presentation.py
@@ -54,7 +54,7 @@ } -class LinkTarget(object): +class LinkTarget: # Opens the linked document in a new window or tab. NEW_TAB = '_blank' # Opens the linked document in the same frame as it was clicked. @@ -268,7 +268,6 @@ def feedback_url(result_details_link): - # pylint: disable=redefined-variable-type url_args = [ ('labels', 'Pri-2,Type-Bug,Restrict-View-Google'), ('summary', 'Result Details Feedback:'), @@ -277,7 +276,6 @@ if result_details_link: url_args.append(('comment', 'Please check out: %s' % result_details_link)) url_args = urlencode(url_args) - # pylint: enable=redefined-variable-type return 'https://bugs.chromium.org/p/chromium/issues/entry?%s' % url_args
diff --git a/build/android/pylib/symbols/deobfuscator.py b/build/android/pylib/symbols/deobfuscator.py index 1fd188a4..6fe86f40 100644 --- a/build/android/pylib/symbols/deobfuscator.py +++ b/build/android/pylib/symbols/deobfuscator.py
@@ -19,7 +19,7 @@ _MAX_RESTARTS = 10 # Should be plenty unless tool is crashing on start-up. -class Deobfuscator(object): +class Deobfuscator: def __init__(self, mapping_path): script_path = os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'android', 'stacktrace', 'java_deobfuscate.py') @@ -136,7 +136,7 @@ self.Close() -class DeobfuscatorPool(object): +class DeobfuscatorPool: # As of Sep 2017, each instance requires about 500MB of RAM, as measured by: # /usr/bin/time -v build/android/stacktrace/java_deobfuscate.py \ # out/Release/apks/ChromePublic.apk.mapping
diff --git a/build/android/pylib/symbols/elf_symbolizer.py b/build/android/pylib/symbols/elf_symbolizer.py index 270263d..de32e365 100644 --- a/build/android/pylib/symbols/elf_symbolizer.py +++ b/build/android/pylib/symbols/elf_symbolizer.py
@@ -40,7 +40,7 @@ return False -class ELFSymbolizer(object): +class ELFSymbolizer: """An uber-fast (multiprocessing, pipelined and asynchronous) ELF symbolizer. This class is a frontend for addr2line (part of GNU binutils), designed to @@ -220,7 +220,7 @@ (time.time() - start_time)) - class Addr2Line(object): + class Addr2Line: """A python wrapper around an addr2line instance. The communication with the addr2line process looks as follows: @@ -477,7 +477,7 @@ return self._request_queue[0][2] if self._request_queue else 0 -class ELFSymbolInfo(object): +class ELFSymbolInfo: """The result of the symbolization passed as first arg. of each callback.""" def __init__(self, name, source_path, source_line, was_ambiguous=False,
diff --git a/build/android/pylib/symbols/stack_symbolizer.py b/build/android/pylib/symbols/stack_symbolizer.py index fdd4778..6e74108d 100644 --- a/build/android/pylib/symbols/stack_symbolizer.py +++ b/build/android/pylib/symbols/stack_symbolizer.py
@@ -27,7 +27,7 @@ raise RuntimeError('Unknown device ABI: %s' % device_abi) -class Symbolizer(object): +class Symbolizer: """A helper class to symbolize stack.""" def __init__(self, apk_under_test=None):
diff --git a/build/android/pylib/utils/argparse_utils.py b/build/android/pylib/utils/argparse_utils.py index bd603c9..51a5384 100644 --- a/build/android/pylib/utils/argparse_utils.py +++ b/build/android/pylib/utils/argparse_utils.py
@@ -33,11 +33,11 @@ default=argparse.SUPPRESS, custom_help_text=None, help=None): - super(CustomHelpAction, self).__init__(option_strings=option_strings, - dest=dest, - default=default, - nargs=0, - help=help) + super().__init__(option_strings=option_strings, + dest=dest, + default=default, + nargs=0, + help=help) if not custom_help_text: raise ValueError('custom_help_text is required')
diff --git a/build/android/pylib/utils/chrome_proxy_utils.py b/build/android/pylib/utils/chrome_proxy_utils.py index 149d0b9..84ef632 100644 --- a/build/android/pylib/utils/chrome_proxy_utils.py +++ b/build/android/pylib/utils/chrome_proxy_utils.py
@@ -18,7 +18,7 @@ DEFAULT_UPLOAD_BANDWIDTH_KBPS = 72000 -class WPRServer(object): +class WPRServer: """Utils to set up a webpagereplay_go_server instance.""" def __init__(self): @@ -88,7 +88,7 @@ return self._archive_path -class ChromeProxySession(object): +class ChromeProxySession: """Utils to help set up a Chrome Proxy.""" def __init__(self, device_proxy_port=DEFAULT_DEVICE_PORT):
diff --git a/build/android/pylib/utils/gold_utils_test.py b/build/android/pylib/utils/gold_utils_test.py index cc1da04..0552ff50 100755 --- a/build/android/pylib/utils/gold_utils_test.py +++ b/build/android/pylib/utils/gold_utils_test.py
@@ -66,14 +66,14 @@ class AndroidSkiaGoldSessionDiffLinksTest(fake_filesystem_unittest.TestCase): - class FakeArchivedFile(object): + class FakeArchivedFile: def __init__(self, path): self.name = path def Link(self): return 'file://' + self.name - class FakeOutputManager(object): + class FakeOutputManager: def __init__(self): self.output_dir = tempfile.mkdtemp()
diff --git a/build/android/pylib/utils/instrumentation_tracing.py b/build/android/pylib/utils/instrumentation_tracing.py index 85a4f6e..edab29d 100644 --- a/build/android/pylib/utils/instrumentation_tracing.py +++ b/build/android/pylib/utils/instrumentation_tracing.py
@@ -28,7 +28,8 @@ # Modules to exclude by default (to avoid problems like infinite loops) DEFAULT_EXCLUDE = [r'py_trace_event\..*'] -class _TraceArguments(object): + +class _TraceArguments: def __init__(self): """Wraps a dictionary to ensure safe evaluation of repr().""" self._arguments = {}
diff --git a/build/android/pylib/utils/logging_utils.py b/build/android/pylib/utils/logging_utils.py index 4874f25c..10891ec 100644 --- a/build/android/pylib/utils/logging_utils.py +++ b/build/android/pylib/utils/logging_utils.py
@@ -31,7 +31,7 @@ def __init__(self, wrapped_formatter=None): """Wraps a |logging.Formatter| and adds color.""" - super(_ColorFormatter, self).__init__() + super().__init__() self._wrapped_formatter = wrapped_formatter or logging.Formatter() #override @@ -63,20 +63,23 @@ """ def __init__(self, force_color=False): - super(ColorStreamHandler, self).__init__() + super().__init__() self.force_color = force_color self.setFormatter(logging.Formatter()) @property def is_tty(self): - isatty = getattr(self.stream, 'isatty', None) - return isatty and isatty() + try: + isatty = getattr(self.stream, 'isatty') + except AttributeError: + return False + return isatty() #override - def setFormatter(self, formatter): + def setFormatter(self, fmt): if self.force_color or self.is_tty: - formatter = _ColorFormatter(formatter) - super(ColorStreamHandler, self).setFormatter(formatter) + fmt = _ColorFormatter(fmt) + super().setFormatter(fmt) @staticmethod def MakeDefault(force_color=False):
diff --git a/build/android/pylib/utils/maven_downloader.py b/build/android/pylib/utils/maven_downloader.py index 7247f7c8..109e52b 100755 --- a/build/android/pylib/utils/maven_downloader.py +++ b/build/android/pylib/utils/maven_downloader.py
@@ -23,7 +23,7 @@ raise -class MavenDownloader(object): +class MavenDownloader: ''' Downloads and installs the requested artifacts from the Google Maven repo. The artifacts are expected to be specified in the format @@ -71,7 +71,7 @@ return self._debug -class _SingleArtifactDownloader(object): +class _SingleArtifactDownloader: '''Handles downloading and installing a single Maven artifact.''' _POM_FILE_TYPE = 'pom' @@ -122,7 +122,7 @@ raise Exception('Command "{}" failed'.format(' '.join(cmd))) except OSError as e: if e.errno == os.errno.ENOENT: - raise Exception('mvn command not found. Please install Maven.') + raise Exception('mvn command not found. Please install Maven.') from e raise return os.path.join(os.path.join(*group_id.split('.')),
diff --git a/build/android/pylib/utils/proguard.py b/build/android/pylib/utils/proguard.py index 7236277..5d38f51 100644 --- a/build/android/pylib/utils/proguard.py +++ b/build/android/pylib/utils/proguard.py
@@ -97,14 +97,16 @@ '-dump', proguard_output.name]) return Parse(proguard_output) -class _AnnotationElement(object): + +class _AnnotationElement: def __init__(self, name, ftype, depth): self.ref = None self.name = name self.ftype = ftype self.depth = depth -class _ParseState(object): + +class _ParseState: _INITIAL_VALUES = (lambda: None, list, dict) # Empty annotations are represented as 'None', not as an empty dictionary. _LAZY_INITIAL_VALUES = (lambda: None, list, lambda: None)
diff --git a/build/android/pylib/utils/time_profile.py b/build/android/pylib/utils/time_profile.py index 094799c..bbdacdbf 100644 --- a/build/android/pylib/utils/time_profile.py +++ b/build/android/pylib/utils/time_profile.py
@@ -6,7 +6,7 @@ import time -class TimeProfile(object): +class TimeProfile: """Class for simple profiling of action, with logging of cost.""" def __init__(self, description='operation'):
diff --git a/build/android/pylib/utils/xvfb.py b/build/android/pylib/utils/xvfb.py index cb9d50e..1009cf9 100644 --- a/build/android/pylib/utils/xvfb.py +++ b/build/android/pylib/utils/xvfb.py
@@ -16,7 +16,7 @@ return sys.platform.startswith('linux') -class Xvfb(object): +class Xvfb: """Class to start and stop Xvfb if relevant. Nop if not Linux.""" def __init__(self):
diff --git a/build/android/pylib/valgrind_tools.py b/build/android/pylib/valgrind_tools.py index 2b821a4..9b441f4 100644 --- a/build/android/pylib/valgrind_tools.py +++ b/build/android/pylib/valgrind_tools.py
@@ -35,7 +35,7 @@ EXTRA_OPTIONS = 'strict_memcmp=0,use_sigaltstack=1' def __init__(self, device): - super(AddressSanitizerTool, self).__init__() + super().__init__() self._device = device @classmethod
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py index 3622fe48..60704ca3d 100755 --- a/build/android/resource_sizes.py +++ b/build/android/resource_sizes.py
@@ -92,7 +92,7 @@ } -class _AccumulatingReporter(object): +class _AccumulatingReporter: def __init__(self): self._combined_metrics = collections.defaultdict(int) @@ -107,13 +107,12 @@ class _ChartJsonReporter(_AccumulatingReporter): def __init__(self, chartjson): - super(_ChartJsonReporter, self).__init__() + super().__init__() self._chartjson = chartjson self.trace_title_prefix = '' def __call__(self, graph_title, trace_title, value, units): - super(_ChartJsonReporter, self).__call__(graph_title, trace_title, value, - units) + super().__call__(graph_title, trace_title, value, units) perf_tests_results_helper.ReportPerfResult( self._chartjson, graph_title, self.trace_title_prefix + trace_title, @@ -296,7 +295,7 @@ return output -class _FileGroup(object): +class _FileGroup: """Represents a category that apk files can fall into.""" def __init__(self, name):
diff --git a/build/android/stacktrace/java_deobfuscate_test.py b/build/android/stacktrace/java_deobfuscate_test.py index d68323f1..312c7d6a 100755 --- a/build/android/stacktrace/java_deobfuscate_test.py +++ b/build/android/stacktrace/java_deobfuscate_test.py
@@ -101,7 +101,7 @@ class JavaDeobfuscateTest(unittest.TestCase): def __init__(self, *args, **kwargs): - super(JavaDeobfuscateTest, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self._map_file = None def setUp(self):
diff --git a/build/android/test_runner.py b/build/android/test_runner.py index b9a9106..3b215d8 100755 --- a/build/android/test_runner.py +++ b/build/android/test_runner.py
@@ -242,12 +242,10 @@ def ProcessCommonOptions(args): """Processes and handles all common options.""" run_tests_helper.SetLogLevel(args.verbose_count, add_handler=False) - # pylint: disable=redefined-variable-type if args.verbose_count > 0: handler = logging_utils.ColorStreamHandler() else: handler = logging.StreamHandler(sys.stdout) - # pylint: enable=redefined-variable-type handler.setFormatter(run_tests_helper.CustomFormatter()) logging.getLogger().addHandler(handler)
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index d9bc808..f795eb8 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -207,6 +207,7 @@ "metrics/throughput_ukm_reporter.h", "metrics/total_frame_counter.cc", "metrics/total_frame_counter.h", + "metrics/ukm_smoothness_data.cc", "metrics/ukm_smoothness_data.h", "metrics/video_playback_roughness_reporter.cc", "metrics/video_playback_roughness_reporter.h",
diff --git a/cc/metrics/ukm_smoothness_data.cc b/cc/metrics/ukm_smoothness_data.cc new file mode 100644 index 0000000..0daa46a --- /dev/null +++ b/cc/metrics/ukm_smoothness_data.cc
@@ -0,0 +1,11 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/metrics/ukm_smoothness_data.h" + +namespace cc { + +UkmSmoothnessData::UkmSmoothnessData() = default; + +} // namespace cc
diff --git a/cc/metrics/ukm_smoothness_data.h b/cc/metrics/ukm_smoothness_data.h index 592f792..8aaedcb 100644 --- a/cc/metrics/ukm_smoothness_data.h +++ b/cc/metrics/ukm_smoothness_data.h
@@ -5,6 +5,8 @@ #ifndef CC_METRICS_UKM_SMOOTHNESS_DATA_H_ #define CC_METRICS_UKM_SMOOTHNESS_DATA_H_ +#include "base/time/time.h" +#include "cc/cc_export.h" #include "cc/metrics/shared_metrics_buffer.h" namespace cc { @@ -12,9 +14,12 @@ // The smoothness metrics, containing the score measured using various // normalization strategies. The normalization strategies are detailed in // https://docs.google.com/document/d/1ENJXn2bPqvxycnVS9X35qDu1642DQyz42upj5ETOhSs/preview -struct UkmSmoothnessData { +struct CC_EXPORT UkmSmoothnessData { + UkmSmoothnessData(); + double avg_smoothness = 0.0; double worst_smoothness = 0.0; + double median_smoothness = 0.0; // Values are set to -1 to help with recognizing when these metrics are not // calculated. @@ -24,8 +29,21 @@ double above_threshold = 0.0; double percentile_95 = 0.0; + double variance = 0.0; double buckets[7] = {0}; base::TimeDelta time_max_delta = base::Milliseconds(1); + + double scroll_focused_median = 0.0; + double scroll_focused_percentile_95 = 0.0; + double scroll_focused_variance = 0.0; + + double main_focused_median = 0.0; + double main_focused_percentile_95 = 0.0; + double main_focused_variance = 0.0; + + double compositor_focused_median = 0.0; + double compositor_focused_percentile_95 = 0.0; + double compositor_focused_variance = 0.0; }; using UkmSmoothnessDataShared = SharedMetricsBuffer<UkmSmoothnessData>;
diff --git a/cc/test/test_layer_tree_frame_sink.cc b/cc/test/test_layer_tree_frame_sink.cc index 32087548..a5c97ce 100644 --- a/cc/test/test_layer_tree_frame_sink.cc +++ b/cc/test/test_layer_tree_frame_sink.cc
@@ -104,8 +104,7 @@ } scheduler = std::make_unique<viz::DisplayScheduler>( display_begin_frame_source_, compositor_task_runner_.get(), - display_output_surface->capabilities().max_frames_pending, - display_output_surface->capabilities().max_frames_pending_120hz); + display_output_surface->capabilities().pending_swap_params); } auto overlay_processor = std::make_unique<viz::OverlayProcessorStub>();
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index e368df8b..5cb50a7 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -479,6 +479,7 @@ "java/res/drawable/explore_sites_dense_tile_background.xml", "java/res/drawable/google_pay_plex.xml", "java/res/drawable/google_pay_with_divider.xml", + "java/res/drawable/gpp_maybe_grey.xml", "java/res/drawable/ic_add_box_rounded_corner.xml", "java/res/drawable/ic_add_to_home_screen.xml", "java/res/drawable/ic_arrow_forward_blue_24dp.xml",
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml b/chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml index 0c8b1cc..7ae3212 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml +++ b/chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml
@@ -5,7 +5,7 @@ <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> - <solid android:color="@color/default_bg_color" /> + <solid android:color="@macro/default_bg_color" /> <corners android:radius="@dimen/keyboard_accessory_bar_item_height" /> </shape> </item>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/layout/address_accessory_sheet.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/address_accessory_sheet.xml index 4d84962..876c3ad 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/res/layout/address_accessory_sheet.xml +++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/address_accessory_sheet.xml
@@ -11,4 +11,4 @@ android:layout_width="match_parent" android:clipToPadding="false" android:paddingBottom="@dimen/keyboard_accessory_sheet_footer_trailing_margin" - android:background="@color/default_bg_color"/> + android:background="@macro/default_bg_color"/>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/layout/credit_card_accessory_sheet.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/credit_card_accessory_sheet.xml index b7ce265d..bc9fed21 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/res/layout/credit_card_accessory_sheet.xml +++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/credit_card_accessory_sheet.xml
@@ -11,4 +11,4 @@ android:layout_width="match_parent" android:clipToPadding="false" android:paddingBottom="@dimen/keyboard_accessory_sheet_footer_trailing_margin" - android:background="@color/default_bg_color"/> + android:background="@macro/default_bg_color"/>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_modern.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_modern.xml index 9ea02d1..df59019 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_modern.xml +++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_modern.xml
@@ -34,7 +34,7 @@ android:layout_height="wrap_content" android:layout_gravity="start|bottom" android:orientation="horizontal" - android:background="@color/default_bg_color"> + android:background="@macro/default_bg_color"> <ImageView android:id="@+id/show_keyboard"
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet.xml index ece67e52..8b851152 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet.xml +++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet.xml
@@ -14,7 +14,7 @@ <org.chromium.chrome.browser.keyboard_accessory.sheet_component.NoSwipeViewPager android:id="@+id/keyboard_accessory_sheet" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:fillViewport="true" android:layout_height="match_parent" android:layout_width="match_parent"/>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet.xml index 3fecb4f..5be7bbd 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet.xml +++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/password_accessory_sheet.xml
@@ -11,4 +11,4 @@ android:layout_width="match_parent" android:clipToPadding="false" android:paddingBottom="@dimen/keyboard_accessory_sheet_footer_trailing_margin" - android:background="@color/default_bg_color"/> + android:background="@macro/default_bg_color"/>
diff --git a/chrome/android/features/start_surface/internal/java/res/layout/ss_bottom_bar_layout.xml b/chrome/android/features/start_surface/internal/java/res/layout/ss_bottom_bar_layout.xml index c7e56d6..59f978d0 100644 --- a/chrome/android/features/start_surface/internal/java/res/layout/ss_bottom_bar_layout.xml +++ b/chrome/android/features/start_surface/internal/java/res/layout/ss_bottom_bar_layout.xml
@@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/ss_bottom_bar_height" android:layout_gravity="bottom" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:visibility="invisible"> <ImageView android:layout_width="match_parent"
diff --git a/chrome/android/features/tab_ui/java/res/drawable/tab_strip_fading_edge_end.xml b/chrome/android/features/tab_ui/java/res/drawable/tab_strip_fading_edge_end.xml index 5a06e4b..b888b25c 100644 --- a/chrome/android/features/tab_ui/java/res/drawable/tab_strip_fading_edge_end.xml +++ b/chrome/android/features/tab_ui/java/res/drawable/tab_strip_fading_edge_end.xml
@@ -6,6 +6,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <gradient android:startColor="@color/white_alpha_8" - android:endColor="@color/default_bg_color" + android:endColor="@macro/default_bg_color" android:type="linear" /> </shape> \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/res/drawable/tab_strip_fading_edge_start.xml b/chrome/android/features/tab_ui/java/res/drawable/tab_strip_fading_edge_start.xml index be6579a..a81029c 100644 --- a/chrome/android/features/tab_ui/java/res/drawable/tab_strip_fading_edge_start.xml +++ b/chrome/android/features/tab_ui/java/res/drawable/tab_strip_fading_edge_start.xml
@@ -5,7 +5,7 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <gradient - android:startColor="@color/default_bg_color" + android:startColor="@macro/default_bg_color" android:endColor="@color/white_alpha_8" android:type="linear" /> </shape> \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/res/drawable/tab_strip_selected_ring.xml b/chrome/android/features/tab_ui/java/res/drawable/tab_strip_selected_ring.xml index d05e87636..cb6b781 100644 --- a/chrome/android/features/tab_ui/java/res/drawable/tab_strip_selected_ring.xml +++ b/chrome/android/features/tab_ui/java/res/drawable/tab_strip_selected_ring.xml
@@ -16,7 +16,7 @@ a 8,8 0 1,0 16,0 a 8,8 0 1,0 -16,0 z"/> - <path android:fillColor="@color/default_bg_color" android:fillType="evenOdd" + <path android:fillColor="@macro/default_bg_color" android:fillType="evenOdd" android:pathData=" M39.5,15 C39.25,15.32 39,15.32 38.65,15
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_layout.xml b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_layout.xml index bab41087..910cd52 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_layout.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_layout.xml
@@ -8,7 +8,7 @@ android:id="@+id/selectable_list" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:focusable="true" android:focusableInTouchMode="true" android:contentDescription="@string/accessibility_tab_selection_editor"/> \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java index 90d8b2e..93aa08c7 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
@@ -142,7 +142,7 @@ public static boolean isTabGroupsAndroidEnabled(Context context) { // Disable tab group for tablet. if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(context)) { - return false; + return CachedFeatureFlags.isEnabled(ChromeFeatureList.TAB_GROUPS_FOR_TABLETS); } return !DeviceClassManager.enableAccessibilityLayout(context)
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java index ff0b4fb..c57e673 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java
@@ -38,6 +38,7 @@ import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.Features; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; @@ -233,8 +234,7 @@ mContainerModel.set(TabListContainerProperties.IS_INCOGNITO, false); assertThat(mRecyclerView.getBackground(), instanceOf(ColorDrawable.class)); assertThat(((ColorDrawable) mRecyclerView.getBackground()).getColor(), - equalTo(ApiCompatibilityUtils.getColor( - mRecyclerView.getResources(), R.color.default_bg_color))); + equalTo(SemanticColorUtils.getDefaultBgColor(mRecyclerView.getContext()))); } @Test
diff --git a/chrome/android/java/res/drawable/bg_white_dialog.xml b/chrome/android/java/res/drawable/bg_white_dialog.xml index ce81ec1..ef3150f 100644 --- a/chrome/android/java/res/drawable/bg_white_dialog.xml +++ b/chrome/android/java/res/drawable/bg_white_dialog.xml
@@ -5,5 +5,5 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - <solid android:color="@color/default_bg_color" /> + <solid android:color="@macro/default_bg_color" /> </shape> \ No newline at end of file
diff --git a/chrome/android/java/res/drawable/custom_tabs_handle_view_shape.xml b/chrome/android/java/res/drawable/custom_tabs_handle_view_shape.xml index fadb6fe9..f4e8c7a 100644 --- a/chrome/android/java/res/drawable/custom_tabs_handle_view_shape.xml +++ b/chrome/android/java/res/drawable/custom_tabs_handle_view_shape.xml
@@ -13,5 +13,5 @@ android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" /> <solid - android:color="@color/default_bg_color" /> + android:color="@macro/default_bg_color" /> </shape>
diff --git a/chrome/android/java/res/drawable/gpp_maybe_grey.xml b/chrome/android/java/res/drawable/gpp_maybe_grey.xml new file mode 100644 index 0000000..85320ae --- /dev/null +++ b/chrome/android/java/res/drawable/gpp_maybe_grey.xml
@@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<!--Copyright 2021 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path android:fillColor="@android:color/darker_gray" + android:pathData="M12,2L4,5v6.09c0,5.05,3.41,9.76,8,10.91c4.59-1.15,8-5.86,8-10.91V5L12,2z M13,16h-2v-2h2V16z M13,12h-2V7h2V12z"/> +</vector>
diff --git a/chrome/android/java/res/drawable/ic_sync_badge_error_20dp.xml b/chrome/android/java/res/drawable/ic_sync_badge_error_20dp.xml index 62b1d3a..75ed68e 100644 --- a/chrome/android/java/res/drawable/ic_sync_badge_error_20dp.xml +++ b/chrome/android/java/res/drawable/ic_sync_badge_error_20dp.xml
@@ -15,8 +15,8 @@ android:strokeWidth="1" android:pathData="M11,21.5C16.799,21.5 21.5,16.799 21.5,11C21.5,5.201 16.799,0.5 11,0.5C5.201,0.5 0.5,5.201 0.5,11C0.5,16.799 5.201,21.5 11,21.5Z" android:fillColor="@color/default_text_color_error" - android:strokeColor="@color/default_bg_color"/> + android:strokeColor="@macro/default_bg_color"/> <path android:pathData="M9.7501,7.4688V6.1625C9.2501,6.2937 8.7814,6.5 8.3563,6.7625L9.2689,7.675C9.4251,7.6 9.5814,7.525 9.7501,7.4688ZM5.2876,6.8812L6.7626,8.3562C6.2814,9.1187 6.0001,10.025 6.0001,11C6.0001,12.3812 6.5689,13.625 7.4751,14.525L6.0001,16H9.7501V12.25L8.3501,13.65C7.6751,12.9688 7.2501,12.0375 7.2501,11C7.2501,10.375 7.4064,9.7875 7.6751,9.2688L12.7251,14.3187C12.5688,14.4 12.4126,14.475 12.2438,14.5312V15.8375C12.7438,15.7063 13.2126,15.5 13.6376,15.2375L15.1126,16.7125L15.9063,15.9188L6.0876,6.0875L5.2876,6.8812ZM16.0001,6H12.2501V9.75L13.6501,8.35C14.3251,9.0313 14.7501,9.9625 14.7501,11C14.7501,11.625 14.5938,12.2125 14.3251,12.7313L15.2376,13.6437C15.7188,12.8812 16.0001,11.975 16.0001,11C16.0001,9.6187 15.4313,8.375 14.5251,7.475L16.0001,6Z" - android:fillColor="@color/default_bg_color"/> + android:fillColor="@macro/default_bg_color"/> </vector>
diff --git a/chrome/android/java/res/drawable/ic_sync_error_48dp.xml b/chrome/android/java/res/drawable/ic_sync_error_48dp.xml index a5bc9ac..65f0869 100644 --- a/chrome/android/java/res/drawable/ic_sync_error_48dp.xml +++ b/chrome/android/java/res/drawable/ic_sync_error_48dp.xml
@@ -16,5 +16,5 @@ android:fillColor="@color/default_text_color_error"/> <path android:pathData="M18.7501,16.4687V15.1625C18.2501,15.2938 17.7813,15.5 17.3563,15.7625L18.2688,16.675C18.4251,16.6 18.5813,16.525 18.7501,16.4687ZM14.2876,15.8812L15.7626,17.3562C15.2813,18.1188 15.0001,19.025 15.0001,20C15.0001,21.3813 15.5688,22.625 16.4751,23.525L15.0001,25H18.7501V21.25L17.3501,22.65C16.6751,21.9687 16.2501,21.0375 16.2501,20C16.2501,19.375 16.4063,18.7875 16.6751,18.2687L21.7251,23.3187C21.5688,23.4 21.4126,23.475 21.2438,23.5312V24.8375C21.7438,24.7062 22.2126,24.5 22.6376,24.2375L24.1126,25.7125L24.9063,24.9188L15.0876,15.0875L14.2876,15.8812ZM25.0001,15H21.2501V18.75L22.6501,17.35C23.3251,18.0313 23.7501,18.9625 23.7501,20C23.7501,20.625 23.5938,21.2125 23.3251,21.7313L24.2376,22.6437C24.7188,21.8812 25.0001,20.975 25.0001,20C25.0001,18.6187 24.4313,17.375 23.5251,16.475L25.0001,15Z" - android:fillColor="@color/default_bg_color"/> + android:fillColor="@macro/default_bg_color"/> </vector>
diff --git a/chrome/android/java/res/drawable/ic_sync_off_48dp.xml b/chrome/android/java/res/drawable/ic_sync_off_48dp.xml index 3aebe05..da6e4277 100644 --- a/chrome/android/java/res/drawable/ic_sync_off_48dp.xml +++ b/chrome/android/java/res/drawable/ic_sync_off_48dp.xml
@@ -16,5 +16,5 @@ android:fillColor="@color/modern_grey_500"/> <path android:pathData="M18.7501,16.4687V15.1625C18.2501,15.2938 17.7813,15.5 17.3563,15.7625L18.2688,16.675C18.4251,16.6 18.5813,16.525 18.7501,16.4687ZM14.2876,15.8812L15.7626,17.3562C15.2813,18.1188 15.0001,19.025 15.0001,20C15.0001,21.3813 15.5688,22.625 16.4751,23.525L15.0001,25H18.7501V21.25L17.3501,22.65C16.6751,21.9687 16.2501,21.0375 16.2501,20C16.2501,19.375 16.4063,18.7875 16.6751,18.2687L21.7251,23.3187C21.5688,23.4 21.4126,23.475 21.2438,23.5312V24.8375C21.7438,24.7062 22.2126,24.5 22.6376,24.2375L24.1126,25.7125L24.9063,24.9188L15.0876,15.0875L14.2876,15.8812ZM25.0001,15H21.2501V18.75L22.6501,17.35C23.3251,18.0313 23.7501,18.9625 23.7501,20C23.7501,20.625 23.5938,21.2125 23.3251,21.7313L24.2376,22.6437C24.7188,21.8812 25.0001,20.975 25.0001,20C25.0001,18.6187 24.4313,17.375 23.5251,16.475L25.0001,15Z" - android:fillColor="@color/default_bg_color"/> + android:fillColor="@macro/default_bg_color"/> </vector>
diff --git a/chrome/android/java/res/drawable/ic_sync_on_48dp.xml b/chrome/android/java/res/drawable/ic_sync_on_48dp.xml index ab8418bcc..efacab5 100644 --- a/chrome/android/java/res/drawable/ic_sync_on_48dp.xml +++ b/chrome/android/java/res/drawable/ic_sync_on_48dp.xml
@@ -16,6 +16,6 @@ android:fillColor="@color/default_green"/> <path android:pathData="M17.3482,22.6516C15.8854,21.1888 15.8854,18.8112 17.3482,17.3483C17.7946,16.902 18.3293,16.5882 18.895,16.4203L18.895,15.1298C18.0067,15.3287 17.1582,15.7706 16.4643,16.4644C14.5109,18.4178 14.5109,21.5821 16.4643,23.5355L15.1385,24.8613L18.674,24.8613L18.674,21.3258L17.3482,22.6516ZM23.5354,16.4644L24.8612,15.1386L21.3257,15.1386L21.3257,18.6742L22.6515,17.3483C24.1143,18.8112 24.1143,21.1888 22.6515,22.6516C22.2051,23.098 21.6704,23.4118 21.1047,23.5797L21.1047,24.8702C21.993,24.6713 22.8415,24.2294 23.5354,23.5355C25.4888,21.5821 25.4888,18.4178 23.5354,16.4644Z" - android:fillColor="@color/default_bg_color" + android:fillColor="@macro/default_bg_color" android:fillType="evenOdd"/> </vector>
diff --git a/chrome/android/java/res/layout/autofill_editor_base_buttons.xml b/chrome/android/java/res/layout/autofill_editor_base_buttons.xml index ca991920..f1f66ff 100644 --- a/chrome/android/java/res/layout/autofill_editor_base_buttons.xml +++ b/chrome/android/java/res/layout/autofill_editor_base_buttons.xml
@@ -18,7 +18,7 @@ android:paddingEnd="@dimen/pref_autofill_field_horizontal_padding" android:paddingTop="@dimen/editor_dialog_section_buttons_vertical_padding" android:paddingBottom="@dimen/editor_dialog_section_buttons_vertical_padding" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" app:stackedMargin="@dimen/infobar_margin_between_stacked_buttons" app:primaryButtonText="@string/done" app:secondaryButtonText="@string/cancel"
diff --git a/chrome/android/java/res/layout/bookmark_main.xml b/chrome/android/java/res/layout/bookmark_main.xml index a199753..a0ab917 100644 --- a/chrome/android/java/res/layout/bookmark_main.xml +++ b/chrome/android/java/res/layout/bookmark_main.xml
@@ -8,4 +8,4 @@ android:id="@+id/selectable_list" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/default_bg_color" /> + android:background="@macro/default_bg_color" />
diff --git a/chrome/android/java/res/layout/contextual_search_related_searches_in_content_view.xml b/chrome/android/java/res/layout/contextual_search_related_searches_in_content_view.xml index 947d387..f34af1d2 100644 --- a/chrome/android/java/res/layout/contextual_search_related_searches_in_content_view.xml +++ b/chrome/android/java/res/layout/contextual_search_related_searches_in_content_view.xml
@@ -10,8 +10,7 @@ android:id="@+id/contextual_search_related_searches_in_content_view_id" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/overlay_panel_bar_background_color" + android:background="@macro/overlay_panel_bar_background_color" android:visibility="invisible"> <!-- ChipView elements and their container are dynamically added here. --> </FrameLayout> -
diff --git a/chrome/android/java/res/layout/contextual_search_related_searches_view.xml b/chrome/android/java/res/layout/contextual_search_related_searches_view.xml index a0bce78..764a8db5 100644 --- a/chrome/android/java/res/layout/contextual_search_related_searches_view.xml +++ b/chrome/android/java/res/layout/contextual_search_related_searches_view.xml
@@ -9,7 +9,7 @@ android:id="@+id/contextual_search_related_searches_view_id" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@color/overlay_panel_bar_background_color" + android:background="@macro/overlay_panel_bar_background_color" android:visibility="invisible"> <!-- ChipView elements and their container are dynamically added here. --> </FrameLayout>
diff --git a/chrome/android/java/res/layout/contextual_search_term_view.xml b/chrome/android/java/res/layout/contextual_search_term_view.xml index 2ca028a..75ea9f3 100644 --- a/chrome/android/java/res/layout/contextual_search_term_view.xml +++ b/chrome/android/java/res/layout/contextual_search_term_view.xml
@@ -13,7 +13,7 @@ style="@style/ContextualSearchTextView" android:layout_width="match_parent" android:layout_gravity="bottom" - android:background="@color/overlay_panel_bar_background_color" + android:background="@macro/overlay_panel_bar_background_color" android:layout_marginStart="7dp" android:layout_marginEnd="7dp" /> </FrameLayout>
diff --git a/chrome/android/java/res/layout/default_search_engine_first_run_fragment.xml b/chrome/android/java/res/layout/default_search_engine_first_run_fragment.xml index a1ee95e..8cf60b1 100644 --- a/chrome/android/java/res/layout/default_search_engine_first_run_fragment.xml +++ b/chrome/android/java/res/layout/default_search_engine_first_run_fragment.xml
@@ -9,7 +9,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/signin_body_background" + android:background="@macro/signin_body_background" android:contentDescription="@string/search_engine_dialog_title" android:orientation="vertical" > @@ -40,7 +40,7 @@ android:paddingStart="@dimen/signin_chooser_padding" android:paddingEnd="@dimen/signin_chooser_padding" android:paddingBottom="@dimen/signin_chooser_padding" - android:background="@color/signin_head_background" + android:background="@macro/signin_head_background" android:importantForAccessibility="no" android:textAppearance="@style/TextAppearance.Headline.Primary" android:text="@string/search_engine_dialog_title" />
diff --git a/chrome/android/java/res/layout/explore_sites_page_layout.xml b/chrome/android/java/res/layout/explore_sites_page_layout.xml index eb66c0c9..e8917d7 100644 --- a/chrome/android/java/res/layout/explore_sites_page_layout.xml +++ b/chrome/android/java/res/layout/explore_sites_page_layout.xml
@@ -11,7 +11,7 @@ android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/explore_sites_category_recycler" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"/>
diff --git a/chrome/android/java/res/layout/history_main.xml b/chrome/android/java/res/layout/history_main.xml index d8dbe18f..0bd670b7 100644 --- a/chrome/android/java/res/layout/history_main.xml +++ b/chrome/android/java/res/layout/history_main.xml
@@ -7,4 +7,4 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/default_bg_color" /> \ No newline at end of file + android:background="@macro/default_bg_color" /> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/incognito_history_placeholder.xml b/chrome/android/java/res/layout/incognito_history_placeholder.xml index 05446e4..aff0452 100644 --- a/chrome/android/java/res/layout/incognito_history_placeholder.xml +++ b/chrome/android/java/res/layout/incognito_history_placeholder.xml
@@ -9,7 +9,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/default_bg_color"> + android:background="@macro/default_bg_color"> <LinearLayout android:layout_width="match_parent"
diff --git a/chrome/android/java/res/layout/recent_tabs_page.xml b/chrome/android/java/res/layout/recent_tabs_page.xml index 79dd6d7..ce5ba34 100644 --- a/chrome/android/java/res/layout/recent_tabs_page.xml +++ b/chrome/android/java/res/layout/recent_tabs_page.xml
@@ -16,7 +16,7 @@ android:layout_height="match_parent" android:layout_width="match_parent" android:layout_marginTop="@dimen/toolbar_height_no_shadow" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:focusable="true" android:focusableInTouchMode="true" > @@ -25,10 +25,10 @@ android:paddingTop="@dimen/recent_tabs_group_view_vertical_padding" android:layout_height="match_parent" android:layout_width="match_parent" - android:cacheColorHint="@color/default_bg_color" + android:cacheColorHint="@macro/default_bg_color" android:childDivider="@null" android:divider="@null" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:listSelector="@android:color/transparent" android:scrollbarStyle="outsideOverlay" />
diff --git a/chrome/android/java/res/layout/settings_activity.xml b/chrome/android/java/res/layout/settings_activity.xml index 309d95b..8da4d47 100644 --- a/chrome/android/java/res/layout/settings_activity.xml +++ b/chrome/android/java/res/layout/settings_activity.xml
@@ -8,7 +8,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/default_bg_color"> + android:background="@macro/default_bg_color"> <com.google.android.material.appbar.AppBarLayout android:id="@+id/app_bar_layout"
diff --git a/chrome/android/java/res/layout/status_indicator_container.xml b/chrome/android/java/res/layout/status_indicator_container.xml index a8e27af..d5c9f87 100644 --- a/chrome/android/java/res/layout/status_indicator_container.xml +++ b/chrome/android/java/res/layout/status_indicator_container.xml
@@ -9,7 +9,7 @@ android:id="@+id/status_indicator" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/default_bg_color"> + android:background="@macro/default_bg_color"> <org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables android:id="@+id/status_text"
diff --git a/chrome/android/java/res/layout/suspended_tab.xml b/chrome/android/java/res/layout/suspended_tab.xml index 084e14f..2a7d70c3 100644 --- a/chrome/android/java/res/layout/suspended_tab.xml +++ b/chrome/android/java/res/layout/suspended_tab.xml
@@ -11,7 +11,7 @@ android:layout_height="match_parent" android:fillViewport="true"> <LinearLayout - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:fillViewport="true" android:layout_height="wrap_content" android:layout_width="match_parent"
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml index c3c278c..43825c03 100644 --- a/chrome/android/java/res/values/colors.xml +++ b/chrome/android/java/res/values/colors.xml
@@ -35,8 +35,8 @@ <!-- Account Signin Colors --> <!-- As in dimens.xml, signin uses values from the First Run Experience --> - <color name="signin_head_background">@color/default_bg_color</color> - <color name="signin_body_background">@color/default_bg_color</color> + <macro name="signin_head_background">@macro/default_bg_color</macro> + <macro name="signin_body_background">@macro/default_bg_color</macro> <color name="signin_header_animation_background">@color/modern_grey_50</color> <color name="signin_header_animation_line_light">#E8E9EB</color> <color name="signin_header_animation_line_dark">#BDC0C5</color> @@ -44,17 +44,13 @@ <!-- NTP and Home sheet colors. Also used on the bookmarks and recent tabs pages. --> <color name="ntp_bg_incognito">@color/default_bg_color_dark</color> - <color name="suggestions_modern_bg">@color/default_bg_color</color> <color name="google_logo_tint">@android:color/transparent</color> <!-- Incognito NTP Colors. --> <color name="incognito_emphasis">@android:color/white</color> <!-- Overlay Panel colors --> - <color name="overlay_panel_bar_background_color">@color/default_bg_color</color> - - <!-- Contextual Search colors --> - <color name="contextual_search_promo_background_color">@color/default_bg_color_elev_0</color> + <macro name="overlay_panel_bar_background_color">@macro/default_bg_color</macro> <!-- Find in Page colors --> <color name="find_in_page_query_white_color">@android:color/white</color> @@ -68,7 +64,7 @@ <!-- Bookmark widget colors --> <color name="bookmark_widget_pressed_highlight">@color/black_alpha_11</color> - <color name="bookmark_widget_background">@color/default_bg_color</color> + <color name="bookmark_widget_background">@color/default_bg_color_baseline</color> <!-- History Navigation UI colors --> <color name="navigation_bubble_background_color">@color/default_bg_color_elev_2</color>
diff --git a/chrome/android/java/res/values/styles.xml b/chrome/android/java/res/values/styles.xml index de69550e..cea8c0e21 100644 --- a/chrome/android/java/res/values/styles.xml +++ b/chrome/android/java/res/values/styles.xml
@@ -233,7 +233,7 @@ <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_gravity">bottom</item> - <item name="android:background">@color/overlay_panel_bar_background_color</item> + <item name="android:background">@macro/overlay_panel_bar_background_color</item> <item name="android:visibility">invisible</item> <!-- 60dp padding minus 7dp for fading edge --> <item name="android:paddingStart">53dp</item> @@ -270,7 +270,7 @@ <item name="android:layout_gravity">bottom</item> <item name="android:layout_marginStart">7dp</item> <item name="android:layout_marginEnd">7dp</item> - <item name="android:background">@color/overlay_panel_bar_background_color</item> + <item name="android:background">@macro/overlay_panel_bar_background_color</item> <item name="android:ellipsize">end</item> <item name="android:includeFontPadding">false</item> <item name="android:singleLine">true</item>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index e045b55..7a42e48 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -1684,12 +1684,11 @@ if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled(this)) { dialogVisibilitySupplier = () -> { assert mStartSurfaceSupplier.get() != null; - assert getToolbarManager().getTabGroupUi() != null; // Return true if dialog from either tab switcher or tab strip is visible. ToolbarManager toolbarManager = getToolbarManager(); TabGroupUi tabGroupUi = toolbarManager.getTabGroupUi(); - boolean isDialogVisible = tabGroupUi.isTabGridDialogVisible(); + boolean isDialogVisible = tabGroupUi != null && tabGroupUi.isTabGridDialogVisible(); Supplier<Boolean> tabSwitcherDialogVisibilitySupplier = mStartSurfaceSupplier.get().getTabGridDialogVisibilitySupplier();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java index cf473bfa..acf4b51 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java
@@ -28,8 +28,10 @@ import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.TextView; + import androidx.annotation.VisibleForTesting; import androidx.appcompat.content.res.AppCompatResources; + import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.annotations.UsedByReflection; import org.chromium.chrome.R; @@ -38,6 +40,7 @@ import org.chromium.chrome.browser.tab.TabFavicon; import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.components.browser_ui.styles.ChromeColors; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; /** * A widget that shows a single row of the {@link AccessibilityTabModelListView} list. @@ -335,7 +338,7 @@ mDescriptionView, R.style.TextAppearance_TextMedium_Primary_Baseline_Light); ApiCompatibilityUtils.setImageTintList(mCloseButton, mIncognitoCloseIconColor); } else { - setBackgroundResource(R.color.default_bg_color); + setBackgroundColor(SemanticColorUtils.getDefaultBgColor(getContext())); mFaviconView.getBackground().setLevel(mDefaultLevel); ApiCompatibilityUtils.setTextAppearance( mTitleView, R.style.TextAppearance_TextLarge_Primary);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java index fdcdbe0c..9c739a2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java
@@ -169,8 +169,7 @@ ApiCompatibilityUtils.setImageTintList( mIncognitoButtonIcon, mTabIconSelectedLightColor); } else { - setBackgroundColor( - ApiCompatibilityUtils.getColor(getResources(), R.color.default_bg_color)); + setBackgroundColor(SemanticColorUtils.getDefaultBgColor(getContext())); mStackButtonWrapper.setSelectedTabIndicatorColor( mTabIconSelectedDarkColor.getDefaultColor()); ApiCompatibilityUtils.setImageTintList(mStandardButtonIcon, mTabIconSelectedDarkColor);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java index 0a2fbd9..5fb9224 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -106,6 +106,7 @@ add(ChromeFeatureList.SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT); add(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID); add(ChromeFeatureList.TAB_GROUPS_ANDROID); + add(ChromeFeatureList.TAB_GROUPS_FOR_TABLETS); add(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID); add(ChromeFeatureList.TAB_TO_GTS_ANIMATION); add(ChromeFeatureList.THEME_REFACTOR_ANDROID);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/prefeditor/EditorDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/prefeditor/EditorDialog.java index ac32ce97..9bd7b6f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/prefeditor/EditorDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/prefeditor/EditorDialog.java
@@ -39,12 +39,12 @@ import androidx.appcompat.widget.Toolbar.OnMenuItemClickListener; import androidx.core.view.MarginLayoutParamsCompat; -import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; import org.chromium.chrome.browser.autofill.AutofillUiUtils; import org.chromium.chrome.browser.autofill.settings.CreditCardNumberFormattingTextWatcher; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.browser_ui.settings.SettingsUtils; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.AlwaysDismissedDialog; import org.chromium.components.browser_ui.widget.FadingEdgeScrollView; import org.chromium.components.browser_ui.widget.TintedDrawable; @@ -189,8 +189,7 @@ */ private void prepareToolbar() { EditorDialogToolbar toolbar = (EditorDialogToolbar) mLayout.findViewById(R.id.action_bar); - toolbar.setBackgroundColor( - ApiCompatibilityUtils.getColor(toolbar.getResources(), R.color.default_bg_color)); + toolbar.setBackgroundColor(SemanticColorUtils.getDefaultBgColor(toolbar.getContext())); toolbar.setTitleTextAppearance( toolbar.getContext(), R.style.TextAppearance_Headline_Primary); toolbar.setTitle(mEditorModel.getTitle());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java index 759d02d..0726acc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
@@ -29,6 +29,7 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.subscriptions.CommerceSubscriptionsServiceFactory; import org.chromium.chrome.browser.sync.SyncService; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.browser.ui.signin.PersonalizedSigninPromoView; import org.chromium.chrome.browser.ui.signin.SigninPromoController.SyncPromoState; import org.chromium.components.bookmarks.BookmarkId; @@ -56,6 +57,7 @@ private final ImageFetcher mImageFetcher; private final List<BookmarkId> mTopLevelFolders = new ArrayList<>(); + private final SnackbarManager mSnackbarManager; // There can only be one promo header at a time. This takes on one of the values: // ViewType.PERSONALIZED_SIGNIN_PROMO, ViewType.SYNC_PROMO, or ViewType.INVALID. @@ -117,7 +119,7 @@ } }; - BookmarkItemsAdapter(Context context) { + BookmarkItemsAdapter(Context context, SnackbarManager snackbarManager) { super(context); mSyncService = SyncService.get(); mSyncService.addSyncStateChangedListener(this); @@ -127,6 +129,7 @@ Profile.getLastUsedRegularProfile().getProfileKey(), GlobalDiscardableReferencePool.getReferencePool()); mCommerceSubscriptionsServiceFactory = new CommerceSubscriptionsServiceFactory(); + mSnackbarManager = snackbarManager; } /** @@ -229,7 +232,8 @@ ((PowerBookmarkShoppingItemRow) vh.itemView) .init(mImageFetcher, mDelegate.getModel(), mCommerceSubscriptionsServiceFactory.getForLastUsedProfile() - .getSubscriptionsManager()); + .getSubscriptionsManager(), + mSnackbarManager); } else { vh = createViewHolderHelper(parent, R.layout.bookmark_item_row); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java index 1ed65e3..3122561 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
@@ -208,7 +208,7 @@ mSelectableListLayout.initializeEmptyView( R.string.bookmarks_folder_empty, R.string.bookmark_no_result); - mAdapter = new BookmarkItemsAdapter(mContext); + mAdapter = new BookmarkItemsAdapter(mContext, snackbarManager); mAdapterDataObserver = new AdapterDataObserver() { @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRow.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRow.java index 5abd8e1..8251621 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRow.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRow.java
@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.power_bookmarks.ProductPrice; import org.chromium.chrome.browser.subscriptions.CommerceSubscription; import org.chromium.chrome.browser.subscriptions.SubscriptionsManager; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.browser_ui.widget.RoundedCornerOutlineProvider; import org.chromium.components.image_fetcher.ImageFetcher; @@ -43,6 +44,7 @@ private CurrencyFormatter mCurrencyFormatter; private CommerceSubscription mSubscription; private boolean mSubscriptionChangeInProgress; + private SnackbarManager mSnackbarManager; /** * Constructor for inflating from XML. @@ -60,10 +62,11 @@ * @param subscriptionsManager Used to manage the price-tracking subscriptions. */ void init(ImageFetcher imageFetcher, BookmarkModel bookmarkModel, - SubscriptionsManager subscriptionsManager) { + SubscriptionsManager subscriptionsManager, SnackbarManager snackbarManager) { mImageFetcher = imageFetcher; mBookmarkModel = bookmarkModel; mSubscriptionsManager = subscriptionsManager; + mSnackbarManager = snackbarManager; } // BookmarkItemRow overrides: @@ -157,8 +160,9 @@ if (mSubscriptionChangeInProgress) return; mSubscriptionChangeInProgress = true; - PowerBookmarkUtils.setPriceTrackingEnabled(mSubscriptionsManager, mBookmarkModel, - mBookmarkId, !mIsPriceTrackingEnabled, subscriptionCallback); + PowerBookmarkUtils.setPriceTrackingEnabledWithSnackbars(mSubscriptionsManager, + mBookmarkModel, mBookmarkId, !mIsPriceTrackingEnabled, mSnackbarManager, + getContext().getResources(), subscriptionCallback); }); } @@ -176,4 +180,8 @@ void setCurrencyFormatterForTesting(CurrencyFormatter currencyFormatter) { mCurrencyFormatter = currencyFormatter; } + + View getPriceTrackingButtonForTesting() { + return mEndStartButtonView; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java index 8a08e72..aad5abc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java
@@ -4,12 +4,15 @@ package org.chromium.chrome.browser.bookmarks; +import android.content.res.Resources; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.common.primitives.UnsignedLongs; import org.chromium.base.Callback; +import org.chromium.chrome.R; import org.chromium.chrome.browser.commerce.shopping_list.ShoppingDataProviderBridge; import org.chromium.chrome.browser.power_bookmarks.PowerBookmarkMeta; import org.chromium.chrome.browser.power_bookmarks.PowerBookmarkType; @@ -20,6 +23,8 @@ import org.chromium.chrome.browser.subscriptions.CommerceSubscription.TrackingIdType; import org.chromium.chrome.browser.subscriptions.SubscriptionsManager; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.components.bookmarks.BookmarkId; /** Utilities for use in power bookmarks. */ @@ -61,6 +66,7 @@ * @param bookmarkBridge The BookmarkBridge used to query bookmarks. * @param bookmarkId The BookmarkId to check the price-tracking status of. * @param enabled Whether price-tracking should be enabled. + * @param callback The status callback. */ public static void setPriceTrackingEnabled(@NonNull SubscriptionsManager subscriptionsManager, @NonNull BookmarkBridge bookmarkBridge, @Nullable BookmarkId bookmarkId, @@ -93,6 +99,57 @@ } /** + * Checks if the given {@link BookmarkId} is price-tracked. + * + * @param subscriptionsManager Manages price-tracking subscriptions. + * @param bookmarkBridge The BookmarkBridge used to query bookmarks. + * @param bookmarkId The BookmarkId to check the price-tracking status of. + * @param enabled Whether price-tracking should be enabled. + * @param snackbarManager Manages snackbars, non-null if a message should be sent to alert the + * users of price-tracking events. + * @param resources Used to retrieve resources. + * @param callback The status callback, may be called multiple times depending if the user + * retries on failure. + */ + public static void setPriceTrackingEnabledWithSnackbars( + @NonNull SubscriptionsManager subscriptionsManager, + @NonNull BookmarkBridge bookmarkBridge, @Nullable BookmarkId bookmarkId, + boolean enabled, SnackbarManager snackbarManager, Resources resources, + Callback<Integer> callback) { + // Action to retry the subscription request on failure. + SnackbarManager.SnackbarController retrySnackbarControllerAction = + new SnackbarManager.SnackbarController() { + @Override + public void onAction(Object actionData) { + setPriceTrackingEnabledWithSnackbars(subscriptionsManager, bookmarkBridge, + bookmarkId, enabled, snackbarManager, resources, callback); + } + }; + // Wrapper which shows a snackbar and forwards the result. + Callback<Integer> wrapperCallback = (status) -> { + Snackbar snackbar; + if (status == SubscriptionsManager.StatusCode.OK) { + snackbar = Snackbar.make( + resources.getString(enabled ? R.string.price_tracking_enabled_snackbar + : R.string.price_tracking_disabled_snackbar), + null, Snackbar.TYPE_NOTIFICATION, Snackbar.UMA_PRICE_TRACKING_SUCCESS); + } else { + snackbar = + Snackbar.make(resources.getString(R.string.price_tracking_error_snackbar), + retrySnackbarControllerAction, Snackbar.TYPE_NOTIFICATION, + Snackbar.UMA_PRICE_TRACKING_FAILURE) + .setAction(resources.getString( + R.string.price_tracking_error_snackbar_action), + null); + } + snackbarManager.showSnackbar(snackbar); + callback.onResult(status); + }; + setPriceTrackingEnabled( + subscriptionsManager, bookmarkBridge, bookmarkId, enabled, wrapperCallback); + } + + /** * Gets the power bookmark associated with the given tab. * @param bookmarkBridge The {@link BookmarkBridge} to retrieve bookmark info. * @param tab The current {@link Tab} to check.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java index 741fa92..d52b4ac 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java
@@ -18,6 +18,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.PanelState; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason; +import org.chromium.chrome.browser.ui.theme.ChromeSemanticColorUtils; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; @@ -149,8 +150,7 @@ mBarHeight = mContext.getResources().getDimension(bar_height_dimen) * mPxToDp; final Resources resources = mContext.getResources(); - mBarBackgroundColor = ApiCompatibilityUtils.getColor( - resources, R.color.overlay_panel_bar_background_color); + mBarBackgroundColor = ChromeSemanticColorUtils.getOverlayPanelBarBackgroundColor(mContext); mIconColor = SemanticColorUtils.getDefaultIconColor(context); mDragHandlebarColor = ApiCompatibilityUtils.getColor(resources, R.color.drag_handlebar_color);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelHelp.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelHelp.java index 173f5609..fb2e83e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelHelp.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelHelp.java
@@ -13,7 +13,6 @@ import androidx.annotation.Nullable; -import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.MathUtils; import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; @@ -21,6 +20,7 @@ import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelInflater; import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel.ContextualSearchHelpSectionHost; import org.chromium.chrome.browser.layouts.animation.CompositorAnimator; +import org.chromium.chrome.browser.ui.theme.ChromeSemanticColorUtils; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; @@ -85,8 +85,8 @@ mIsEnabled = helpSectionHost.isPanelHelpEnabled(); mDpToPx = context.getResources().getDisplayMetrics().density; // We match the Opt-in promo background color so the views are seamless when together. - mContainerBackgroundColor = ApiCompatibilityUtils.getColor( - context.getResources(), R.color.contextual_search_promo_background_color); + mContainerBackgroundColor = + ChromeSemanticColorUtils.getContextualSearchPromoBackgroundColor(context); mOverlayPanel = panel; mContext = context;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java index 1cf22c42..0071958 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java
@@ -14,7 +14,6 @@ import android.widget.Button; import android.widget.TextView; -import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.MathUtils; import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; @@ -27,6 +26,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.layouts.animation.CompositorAnimator; import org.chromium.chrome.browser.settings.SettingsLauncherImpl; +import org.chromium.chrome.browser.ui.theme.ChromeSemanticColorUtils; import org.chromium.components.browser_ui.settings.SettingsLauncher; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; @@ -94,8 +94,8 @@ R.id.contextual_search_promo, context, container, resourceLoader); mDpToPx = context.getResources().getDisplayMetrics().density; - mBackgroundColor = ApiCompatibilityUtils.getColor( - context.getResources(), R.color.contextual_search_promo_background_color); + mBackgroundColor = + ChromeSemanticColorUtils.getContextualSearchPromoBackgroundColor(context); mHost = host; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java index 420c833b..3962843 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java
@@ -8,7 +8,6 @@ import android.content.res.Resources; import android.graphics.RectF; -import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.MathUtils; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.ObservableSupplierImpl; @@ -29,6 +28,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.theme.TopUiThemeColorProvider; import org.chromium.chrome.browser.toolbar.top.TopToolbarOverlayCoordinator; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.animation.Interpolators; import org.chromium.components.browser_ui.widget.gesture.SwipeGestureListener.ScrollDirection; import org.chromium.ui.base.DeviceFormFactor; @@ -458,17 +458,13 @@ } } - /** - * @return The background color of the scene layer. - */ + /** Returns the background color of the scene layer. */ private int getBackgroundColor() { - int colorId = R.color.default_bg_color; - if (mTabModelSelector != null && mTabModelSelector.isIncognitoSelected()) { - colorId = R.color.default_bg_color_dark; + return getContext().getColor(R.color.default_bg_color_dark); + } else { + return SemanticColorUtils.getDefaultBgColor(getContext()); } - - return ApiCompatibilityUtils.getColor(getContext().getResources(), colorId); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java index c22b6d6e..601f7f12 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.components.browser_ui.styles.ChromeColors; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.ui.resources.ResourceManager; import org.chromium.ui.util.ColorUtils; @@ -160,21 +161,13 @@ TabListSceneLayerJni.get().finishBuildingFrame(mNativePtr, TabListSceneLayer.this); } - /** - * @return The background color of the scene layer. - */ + /** Returns the background color of the scene layer. */ protected int getTabListBackgroundColor(Context context) { - int colorId = R.color.default_bg_color; - - if (TabUiFeatureUtilities.isGridTabSwitcherEnabled(context)) { - if (mTabModelSelector != null && mTabModelSelector.isIncognitoSelected()) { - colorId = R.color.default_bg_color_dark; - } else { - colorId = R.color.default_bg_color; - } + if (TabUiFeatureUtilities.isGridTabSwitcherEnabled(context) && mTabModelSelector != null + && mTabModelSelector.isIncognitoSelected()) { + return context.getColor(R.color.default_bg_color_dark); } - - return ApiCompatibilityUtils.getColor(context.getResources(), colorId); + return SemanticColorUtils.getDefaultBgColor(context); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java index 0ed5c1d..4b3126a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
@@ -144,8 +144,8 @@ ? activity.getResources().getDimensionPixelSize(R.dimen.context_menu_small_width) : null; mDialog = createContextMenuDialog(activity, layout, menu, isPopup, touchPointXPx, - touchPointYPx, dialogTopMarginPx, dialogBottomMarginPx, popupMargin, - desiredPopupContentWidth); + touchPointYPx, mTopContentOffsetPx, dialogTopMarginPx, dialogBottomMarginPx, + popupMargin, desiredPopupContentWidth); mDialog.setOnShowListener(dialogInterface -> onMenuShown.run()); mDialog.setOnDismissListener(dialogInterface -> mOnMenuClosed.run()); @@ -248,6 +248,7 @@ * @param isPopup Whether the context menu is being shown in a {@link AnchoredPopupWindow}. * @param touchPointXPx The x-coordinate of the touch that triggered the context menu. * @param touchPointYPx The y-coordinate of the touch that triggered the context menu. + * @param topContentOffsetPx The content offset from the top of the context menu. * @param topMarginPx An explicit top margin for the dialog, or -1 to use default * defined in XML. * @param bottomMarginPx An explicit bottom margin for the dialog, or -1 to use default @@ -257,15 +258,18 @@ * @return Returns a final dialog that does not have a background can be displayed using * {@link AlertDialog#show()}. */ - private ContextMenuDialog createContextMenuDialog(Activity activity, View layout, View view, - boolean isPopup, float touchPointXPx, float touchPointYPx, int topMarginPx, - int bottomMarginPx, @Nullable Integer popupMargin, + @VisibleForTesting + static ContextMenuDialog createContextMenuDialog(Activity activity, View layout, View view, + boolean isPopup, float touchPointXPx, float touchPointYPx, float topContentOffsetPx, + int topMarginPx, int bottomMarginPx, @Nullable Integer popupMargin, @Nullable Integer desiredPopupContentWidth) { // TODO(sinansahin): Refactor ContextMenuDialog as well. + boolean shouldRemoveScrim = + isPopup && ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE); final ContextMenuDialog dialog = new ContextMenuDialog(activity, R.style.Theme_Chromium_AlertDialog, touchPointXPx, - touchPointYPx, mTopContentOffsetPx, topMarginPx, bottomMarginPx, layout, - view, isPopup, popupMargin, desiredPopupContentWidth); + touchPointYPx, topContentOffsetPx, topMarginPx, bottomMarginPx, layout, + view, isPopup, shouldRemoveScrim, popupMargin, desiredPopupContentWidth); dialog.setContentView(layout); return dialog;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider.java index fdd0d1f..216f9621 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider.java
@@ -219,6 +219,10 @@ Context context = ContextUtils.getApplicationContext(); if (context == null) return; AppWidgetManager manager = AppWidgetManager.getInstance(context); + if (manager == null) { + // The device does not support widgets. Abort. + return; + } dinoWidget.updateWidgets(context, manager, prefs, null); smallWidget.updateWidgets(context, manager, prefs, null); });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java index c106812..07a9443 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java
@@ -4,13 +4,10 @@ package org.chromium.chrome.browser.suggestions; -import android.content.res.Resources; import android.text.TextUtils; import androidx.annotation.IntDef; -import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.R; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.components.browser_ui.widget.displaystyle.UiConfig; @@ -44,14 +41,6 @@ private SuggestionsConfig() {} /** - * @param resources The resources to fetch the color from. - * @return The background color for the suggestions sheet content. - */ - public static int getBackgroundColor(Resources resources) { - return ApiCompatibilityUtils.getColor(resources, R.color.suggestions_modern_bg); - } - - /** * Returns the current tile style, that depends on the enabled features and the screen size. */ @TileStyle
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkTest.java index c555266..40d8270 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkTest.java
@@ -31,6 +31,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.subscriptions.SubscriptionsManager; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ChromeRenderTestRule; import org.chromium.components.image_fetcher.ImageFetcher; @@ -62,6 +63,8 @@ private SubscriptionsManager mSubscriptionsManager; @Mock private BookmarkModel mBookmarkModel; + @Mock + private SnackbarManager mSnackbarManager; private Bitmap mBitmap; private PowerBookmarkShoppingItemRow mPowerBookmarkShoppingItemRow; @@ -117,7 +120,7 @@ ((TextView) mPowerBookmarkShoppingItemRow.findViewById(R.id.description)) .setText("http://google.com"); mPowerBookmarkShoppingItemRow.init( - mImageFetcher, mBookmarkModel, mSubscriptionsManager); + mImageFetcher, mBookmarkModel, mSubscriptionsManager, mSnackbarManager); mPowerBookmarkShoppingItemRow.setCurrencyFormatterForTesting(mCurrencyFormatter); }); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java index eba9316..e63f7ce 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java
@@ -78,6 +78,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.externalauth.ExternalAuthUtils; import org.chromium.components.policy.PolicyService; import org.chromium.components.signin.base.CoreAccountInfo; @@ -739,8 +740,8 @@ mFragment.getView().findViewById(R.id.signin_fre_progress_spinner); // Replace the progress bar with a dummy to allow other checks. Currently the // progress bar cannot be stopped otherwise due to some espresso issues (crbug/1115067). - progressBar.setIndeterminateDrawable( - new ColorDrawable(mFragment.getResources().getColor(R.color.default_bg_color))); + progressBar.setIndeterminateDrawable(new ColorDrawable( + SemanticColorUtils.getDefaultBgColor(mFragment.getContext()))); }); onView(withText(R.string.fre_welcome)).check(matches(isDisplayed())); onView(withText(TEST_EMAIL1)).check(matches(not(isDisplayed())));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java index 321a92d9..69f51a70 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java
@@ -138,7 +138,7 @@ @SmallTest @UiThreadTest public void testColorAndTint() { - int bgColor = getActivity().getResources().getColor(R.color.default_bg_color); + int bgColor = SemanticColorUtils.getDefaultBgColor(getActivity()); int textColor = SemanticColorUtils.getDefaultTextColor(getActivity()); assertEquals("Wrong initial background color.", bgColor, ((ColorDrawable) mContainer.getBackground()).getColor());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java index 565cac067..d39ad02 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java
@@ -16,6 +16,7 @@ import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; +import android.os.Build; import android.text.TextUtils; import androidx.test.filters.SmallTest; @@ -34,6 +35,7 @@ import org.chromium.base.test.UiThreadTest; import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; @@ -121,6 +123,8 @@ @Test @SmallTest + @DisableIf. + Build(sdk_is_less_than = Build.VERSION_CODES.N, message = "https://crbug.com/1278039") @Feature("TabPersistentStore") public void testNtpSaveBehavior() { when(mNormalTabModel.index()).thenReturn(TabList.INVALID_TAB_INDEX);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java index 5183e9791..5b7b4986 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
@@ -13,7 +13,11 @@ import android.app.Activity; import android.util.Pair; +import android.view.View; +import androidx.annotation.Nullable; + +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -23,6 +27,10 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.shadow.api.Shadow; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; @@ -31,10 +39,13 @@ import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item; import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator.ContextMenuGroup; import org.chromium.chrome.browser.contextmenu.ContextMenuCoordinator.ListItemType; +import org.chromium.chrome.browser.contextmenu.ContextMenuCoordinatorTest.ShadowContextMenuDialog; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver; import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserverJni; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.test.util.browser.Features; +import org.chromium.components.browser_ui.widget.ContextMenuDialog; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; @@ -48,7 +59,27 @@ * Unit tests for the context menu. */ @RunWith(BaseRobolectricTestRunner.class) +@Config(shadows = ShadowContextMenuDialog.class) public class ContextMenuCoordinatorTest { + /** + * Shadow class used to capture the inputs for {@link + * ContextMenuCoordinator#createContextMenuDialog}. + */ + @Implements(ContextMenuDialog.class) + public static class ShadowContextMenuDialog { + boolean mShouldRemoveScrim; + + public ShadowContextMenuDialog() {} + + @Implementation + public void __constructor__(Activity ownerActivity, int theme, float touchPointXPx, + float touchPointYPx, float topContentOffsetPx, int topMarginPx, int bottomMarginPx, + View layout, View contentView, boolean isPopup, boolean shouldRemoveScrim, + @Nullable Integer popupMargin, @Nullable Integer desiredPopupContentWidth) { + mShouldRemoveScrim = shouldRemoveScrim; + } + } + @Rule public TestRule mProcessor = new Features.JUnitProcessor(); @Rule @@ -159,6 +190,31 @@ assertThat(itemList.get(2).type, equalTo(ListItemType.CONTEXT_MENU_ITEM)); } + @Test + public void testCreateContextMenuDialog() { + View contentView = Mockito.mock(View.class); + View rootView = Mockito.mock(View.class); + + ContextMenuDialog dialog = ContextMenuCoordinator.createContextMenuDialog( + mActivity, rootView, contentView, /*isPopup=*/false, 0, 0, 0, 0, 0, 0, 0); + ShadowContextMenuDialog shadowDialog = (ShadowContextMenuDialog) Shadow.extract(dialog); + + Assert.assertFalse("Dialog should have scrim behind.", shadowDialog.mShouldRemoveScrim); + } + + @Test + @Features.EnableFeatures(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE) + public void testCreateContextMenuDialog_PopupStyle() { + View contentView = Mockito.mock(View.class); + View rootView = Mockito.mock(View.class); + + ContextMenuDialog dialog = ContextMenuCoordinator.createContextMenuDialog( + mActivity, rootView, contentView, /*isPopup=*/true, 0, 0, 0, 0, 0, 0, 0); + ShadowContextMenuDialog shadowDialog = (ShadowContextMenuDialog) Shadow.extract(dialog); + + Assert.assertTrue("Dialog should remove scrim behind.", shadowDialog.mShouldRemoveScrim); + } + private ListItem createListItem(@Item int item) { final PropertyModel model = new PropertyModel.Builder(ContextMenuItemProperties.ALL_KEYS)
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java index dc52013..eee86b6b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java
@@ -36,6 +36,7 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.Supplier; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.R; import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.tab.Tab; @@ -118,10 +119,13 @@ mDestroyedUserDataHost = new UserDataHost(); mDestroyedUserDataHost.destroy(); + Activity activity = Robolectric.buildActivity(Activity.class).get(); + activity.setTheme(R.style.Theme_BrowserUI_DayNight); + doReturn(false).when(mTab).isIncognito(); doReturn(null).when(mTab).getUrl(); - doReturn(Robolectric.buildActivity(Activity.class).get()).when(mTab).getContext(); - doReturn(Robolectric.buildActivity(Activity.class).get()).when(mTab2).getContext(); + doReturn(activity).when(mTab).getContext(); + doReturn(activity).when(mTab2).getContext(); doReturn(new MockTabViewManager()).when(mTab).getTabViewManager(); doReturn(new MockTabViewManager()).when(mTab2).getTabViewManager(); doReturn(true).when(mTab).isInitialized();
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index ca406bc..12c65c8 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -9317,6 +9317,9 @@ <message name="IDS_TRANSLATE_BUBBLE_TARGET_LANG_COMBOBOX_ACCNAME" desc="Accessible name for the target language selection combobox."> Choose the language to translate the page to </message> + <message name="IDS_TRANSLATE_BUBBLE_TRANSLATION_COMPLETE_ANNOUNCEMENT" desc="Text announced to the user via the screenreader when translation has finished."> + Translation to <ph name="language">$1<ex>French</ex></ph> complete + </message> <if expr="not use_titlecase"> <message name="IDS_TRANSLATE_BUBBLE_ADVANCED_BUTTON" desc="Text to show for the translate bubble button to jump to the advanced panel."> Options @@ -11860,12 +11863,18 @@ </message> <!-- Tailored security Android message for consented primary accounts --> - <message name="IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_TITLE" desc="Title shown in the Android message when the account tailored security setting changes for a consented primary account"> + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_TITLE" desc="Title shown in the Android message when the account tailored security setting changes for a consented primary account"> Enhanced Safe Browsing is on </message> - <message name="IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_DESCRIPTION" desc="Description shown in the Android message when the account tailored security setting changes for a consented primary account"> + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_DESCRIPTION" desc="Description shown in the Android message when the account tailored security setting changes for a consented primary account"> You’re on Chrome’s strongest security </message> + <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_TITLE" desc="Title shown in the Android message when the account tailored security setting changes for a consented primary account"> + Enhanced Safe Browsing is off + </message> + <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION" desc="Description shown in the Android message when the account tailored security setting changes for a consented primary account"> + You’re getting standard protection + </message> <message name="IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_OK_BUTTON" desc="The text on the ok button in the Android message when the account tailored security setting changes for a consented primary account"> OK </message>
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..c445166e --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +cae0cee1c314d11faf3ca5eca13ee1a0900227ca \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_TITLE.png.sha1 new file mode 100644 index 0000000..c445166e --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_TITLE.png.sha1
@@ -0,0 +1 @@ +cae0cee1c314d11faf3ca5eca13ee1a0900227ca \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_DESCRIPTION.png.sha1 similarity index 100% rename from chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_DESCRIPTION.png.sha1 rename to chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_DESCRIPTION.png.sha1
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_TITLE.png.sha1 similarity index 100% rename from chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_TITLE.png.sha1 rename to chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_TITLE.png.sha1
diff --git a/chrome/app/generated_resources_grd/IDS_TRANSLATE_BUBBLE_TRANSLATION_COMPLETE_ANNOUNCEMENT.png.sha1 b/chrome/app/generated_resources_grd/IDS_TRANSLATE_BUBBLE_TRANSLATION_COMPLETE_ANNOUNCEMENT.png.sha1 new file mode 100644 index 0000000..a2139ddf --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TRANSLATE_BUBBLE_TRANSLATION_COMPLETE_ANNOUNCEMENT.png.sha1
@@ -0,0 +1 @@ +1c1b994ab05a8f2109922791fd06a4d05795f183 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index bcfa8796..76be7fa 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -623,28 +623,6 @@ "lifetime/application_lifetime.h", "lifetime/browser_shutdown.cc", "lifetime/browser_shutdown.h", - "lite_video/lite_video_decider.cc", - "lite_video/lite_video_decider.h", - "lite_video/lite_video_features.cc", - "lite_video/lite_video_features.h", - "lite_video/lite_video_hint.cc", - "lite_video/lite_video_hint.h", - "lite_video/lite_video_hint_cache.cc", - "lite_video/lite_video_hint_cache.h", - "lite_video/lite_video_keyed_service.cc", - "lite_video/lite_video_keyed_service.h", - "lite_video/lite_video_keyed_service_factory.cc", - "lite_video/lite_video_keyed_service_factory.h", - "lite_video/lite_video_navigation_metrics.cc", - "lite_video/lite_video_navigation_metrics.h", - "lite_video/lite_video_observer.cc", - "lite_video/lite_video_observer.h", - "lite_video/lite_video_switches.cc", - "lite_video/lite_video_switches.h", - "lite_video/lite_video_user_blocklist.cc", - "lite_video/lite_video_user_blocklist.h", - "lite_video/lite_video_util.cc", - "lite_video/lite_video_util.h", "login_detection/login_detection_keyed_service.cc", "login_detection/login_detection_keyed_service.h", "login_detection/login_detection_keyed_service_factory.cc", @@ -4470,6 +4448,7 @@ "//chrome/app/vector_icons", "//chrome/browser/cart:mojo_bindings", "//chrome/browser/enterprise/signals:utils", + "//chrome/browser/media/router/discovery:discovery", "//chrome/browser/new_tab_page/chrome_colors:generate_chrome_colors_info", "//chrome/browser/new_tab_page/chrome_colors:generate_colors_info", "//chrome/browser/policy:path_parser", @@ -4525,6 +4504,9 @@ "//extensions/buildflags", ] allow_circular_includes_from += [ + # TODO(crbug.com/1030821): Eliminate usages of browser.h from Media Router. + "//chrome/browser/media/router/discovery:discovery", + # TODO(crbug.com/1200215): Remove cycles and simplify all dependencies. "//chrome/browser/web_applications", "//chrome/browser/web_applications/app_service", @@ -5504,6 +5486,7 @@ "//ui/aura_extra", "//ui/base:fullscreen_win", "//ui/color:accent_color_observer", + "//ui/color:color_switches", ] allow_circular_includes_from += [ "//chrome/browser/safe_browsing/chrome_cleaner" ]
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 5787068..d910dde 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -38,7 +38,6 @@ #include "chrome/browser/browser_features.h" #include "chrome/browser/commerce/commerce_feature_list.h" #include "chrome/browser/flag_descriptions.h" -#include "chrome/browser/lite_video/lite_video_switches.h" #include "chrome/browser/login_detection/login_detection_util.h" #include "chrome/browser/navigation_predictor/navigation_predictor_features.h" #include "chrome/browser/navigation_predictor/search_engine_preconnector.h" @@ -280,6 +279,7 @@ #if defined(OS_WIN) #include "base/win/windows_version.h" #include "chrome/browser/win/titlebar_config.h" +#include "ui/color/color_switches.h" // nogncheck #endif // OS_WIN #if defined(TOOLKIT_VIEWS) @@ -338,35 +338,6 @@ {flag_descriptions::kTouchSelectionStrategyDirection, blink::switches::kTouchTextSelectionStrategy, "direction"}}; -const FeatureEntry::Choice kLiteVideoDefaultDownlinkBandwidthKbps[] = { - {flags_ui::kGenericExperimentChoiceDefault, "", ""}, - {"100", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "100"}, - {"150", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "150"}, - {"200", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "200"}, - {"250", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "250"}, - {"300", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "300"}, - {"350", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "350"}, - {"400", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "400"}, - {"450", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "450"}, - {"500", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "500"}, - {"600", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "600"}, - {"700", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "700"}, - {"800", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "800"}, - {"900", lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, - "900"}}; - #if defined(OS_WIN) const FeatureEntry::Choice kUseAngleChoicesWindows[] = { {flag_descriptions::kUseAngleDefault, "", ""}, @@ -2189,26 +2160,6 @@ base::size(kRequestDesktopSiteForTablets1920), nullptr}}; #endif // OS_ANDROID -#if defined(OS_ANDROID) -const FeatureEntry::FeatureParam kOmniboxOnDeviceHeadSuggestRelevance1000[] = { - {OmniboxFieldTrial::kOnDeviceHeadSuggestMaxScoreForNonUrlInput, "1000"}, - {OmniboxFieldTrial::kOnDeviceHeadSuggestDemoteMode, "decrease-relevances"}}; -const FeatureEntry::FeatureParam - kOmniboxOnDeviceHeadSuggestNoDelayRelevance1000[] = { - {OmniboxFieldTrial::kOnDeviceHeadSuggestDelaySuggestRequestMs, "0"}, - {OmniboxFieldTrial::kOnDeviceHeadSuggestMaxScoreForNonUrlInput, "1000"}, - {OmniboxFieldTrial::kOnDeviceHeadSuggestDemoteMode, - "decrease-relevances"}}; - -const FeatureEntry::FeatureVariation - kOmniboxOnDeviceHeadSuggestNonIncognitoExperimentVariations[] = { - {"relevance-1000", kOmniboxOnDeviceHeadSuggestRelevance1000, - base::size(kOmniboxOnDeviceHeadSuggestRelevance1000), nullptr}, - {"no-delay-relevance-1000", - kOmniboxOnDeviceHeadSuggestNoDelayRelevance1000, - base::size(kOmniboxOnDeviceHeadSuggestNoDelayRelevance1000), nullptr}}; -#endif // defined(OS_ANDROID) - // TODO(crbug.com/991082,1015377): Remove after proper support for back-forward // cache is implemented. const FeatureEntry::FeatureParam kBackForwardCache_ForceCaching[] = { @@ -4143,10 +4094,6 @@ flag_descriptions::kVirtualKeyboardDarkModeName, flag_descriptions::kVirtualKeyboardDarkModeDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kVirtualKeyboardDarkMode)}, - {"enable-cros-ime-emoji-suggest-addition", - flag_descriptions::kImeEmojiSuggestAdditionName, - flag_descriptions::kImeEmojiSuggestAdditionDescription, kOsCrOS, - FEATURE_VALUE_TYPE(chromeos::features::kEmojiSuggestAddition)}, {"enable-cros-ime-mozc-proto", flag_descriptions::kImeMozcProtoName, flag_descriptions::kImeMozcProtoDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kImeMozcProto)}, @@ -4513,22 +4460,6 @@ kOmniboxOnFocusSuggestionsContextualWebVariations, "OmniboxGoogleOnContent")}, - {"omnibox-on-device-head-suggestions-incognito", - flag_descriptions::kOmniboxOnDeviceHeadSuggestionsIncognitoName, - flag_descriptions::kOmniboxOnDeviceHeadSuggestionsIncognitoDescription, - kOsAll, FEATURE_VALUE_TYPE(omnibox::kOnDeviceHeadProviderIncognito)}, - -#if defined(OS_ANDROID) - {"omnibox-on-device-head-suggestions-non-incognito", - flag_descriptions::kOmniboxOnDeviceHeadSuggestionsNonIncognitoName, - flag_descriptions::kOmniboxOnDeviceHeadSuggestionsNonIncognitoDescription, - kOsAll, - FEATURE_WITH_PARAMS_VALUE_TYPE( - omnibox::kOnDeviceHeadProviderNonIncognito, - kOmniboxOnDeviceHeadSuggestNonIncognitoExperimentVariations, - "OmniboxOnDeviceHeadNonIncognitoTuningMobile")}, -#endif // defined(OS_ANDROID) - {"omnibox-on-focus-suggestions-contextual-web", flag_descriptions::kOmniboxOnFocusSuggestionsContextualWebName, flag_descriptions::kOmniboxOnFocusSuggestionsContextualWebDescription, @@ -5019,6 +4950,10 @@ flag_descriptions::kNtpRealboxSuggestionAnswersName, flag_descriptions::kNtpRealboxSuggestionAnswersDescription, kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kNtpRealboxSuggestionAnswers)}, + + {"ntp-realbox-tail-suggest", flag_descriptions::kNtpRealboxTailSuggestName, + flag_descriptions::kNtpRealboxTailSuggestDescription, kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kNtpRealboxTailSuggest)}, #endif // !defined(OS_ANDROID) #if defined(DCHECK_IS_CONFIGURABLE) @@ -6495,10 +6430,6 @@ FEATURE_VALUE_TYPE(features::kCopyLinkToText)}, #endif // !defined(OS_ANDROID) - {"shared-highlighting-use-blocklist", - flag_descriptions::kSharedHighlightingUseBlocklistName, - flag_descriptions::kSharedHighlightingUseBlocklistDescription, kOsAll, - FEATURE_VALUE_TYPE(shared_highlighting::kSharedHighlightingUseBlocklist)}, {"shared-highlighting-v2", flag_descriptions::kSharedHighlightingV2Name, flag_descriptions::kSharedHighlightingV2Description, kOsAll, FEATURE_VALUE_TYPE(shared_highlighting::kSharedHighlightingV2)}, @@ -6638,20 +6569,6 @@ kOsAll, SINGLE_VALUE_TYPE(switches::kEnableBluetoothSerialPortProfileInSerialApi)}, - {"enable-lite-video", flag_descriptions::kLiteVideoName, - flag_descriptions::kLiteVideoDescription, kOsAll, - FEATURE_VALUE_TYPE(features::kLiteVideo)}, - - {"lite-video-default-downlink-bandwidth-kbps", - flag_descriptions::kLiteVideoDownlinkBandwidthKbpsName, - flag_descriptions::kLiteVideoDownlinkBandwidthKbpsDescription, kOsAll, - MULTI_VALUE_TYPE(kLiteVideoDefaultDownlinkBandwidthKbps)}, - - {"lite-video-force-override-decision", - flag_descriptions::kLiteVideoForceOverrideDecisionName, - flag_descriptions::kLiteVideoForceOverrideDecisionDescription, kOsAll, - SINGLE_VALUE_TYPE(lite_video::switches::kLiteVideoForceOverrideDecision)}, - {"add-passwords-in-settings", flag_descriptions::kAddPasswordsInSettingsName, flag_descriptions::kAddPasswordsInSettingsDescription, kOsDesktop, @@ -7686,6 +7603,11 @@ flag_descriptions::kGridTabSwitcherForTabletsName, flag_descriptions::kGridTabSwitcherForTabletsDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kGridTabSwitcherForTablets)}, + + {"enable-tab-groups-for-tablets", + flag_descriptions::kTabGroupsForTabletsName, + flag_descriptions::kTabGroupsForTabletsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabGroupsForTablets)}, #endif // defined(OS_ANDROID) #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -7729,6 +7651,13 @@ "SnoopingProtection")}, #endif +#if defined(OS_WIN) + {"pervasive-system-accent-color", + flag_descriptions::kPervasiveSystemAccentColorName, + flag_descriptions::kPervasiveSystemAccentColorDescription, kOsWin, + SINGLE_VALUE_TYPE(switches::kPervasiveSystemAccentColor)}, +#endif + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/resource_id.h b/chrome/browser/android/resource_id.h index 8166739..4c1ead3b 100644 --- a/chrome/browser/android/resource_id.h +++ b/chrome/browser/android/resource_id.h
@@ -55,6 +55,8 @@ R.drawable.ic_photo_camera_black) DECLARE_RESOURCE_ID(IDR_ANDROID_MESSAGE_SETTINGS, R.drawable.settings_cog) DECLARE_RESOURCE_ID(IDR_ANDROID_MESSAGE_SAFETY_CHECK, R.drawable.safety_check) +DECLARE_RESOURCE_ID(IDR_ANDROID_MESSAGE_GPP_MAYBE_GREY, + R.drawable.gpp_maybe_grey) // Autofill popup and keyboard accessory images. // We use Android's |VectorDrawableCompat| for the following images that are
diff --git a/chrome/browser/android/webapps/launchpad/java/res/layout/launchpad_page_layout.xml b/chrome/browser/android/webapps/launchpad/java/res/layout/launchpad_page_layout.xml index c3b273cb..80b83ab1 100644 --- a/chrome/browser/android/webapps/launchpad/java/res/layout/launchpad_page_layout.xml +++ b/chrome/browser/android/webapps/launchpad/java/res/layout/launchpad_page_layout.xml
@@ -17,7 +17,7 @@ <androidx.recyclerview.widget.RecyclerView android:id="@+id/launchpad_recycler" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"
diff --git a/chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac_unittest.cc b/chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac_unittest.cc index 872172bc..7a7f6266 100644 --- a/chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac_unittest.cc +++ b/chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac_unittest.cc
@@ -411,9 +411,9 @@ // Install a dummy app with shortcut menu items auto web_app_info = std::make_unique<WebApplicationInfo>(); - WebApplicationShortcutsMenuItemInfo shortcut_info1; - WebApplicationShortcutsMenuItemInfo shortcut_info2; - WebApplicationShortcutsMenuItemInfo shortcut_info3; + WebAppShortcutsMenuItemInfo shortcut_info1; + WebAppShortcutsMenuItemInfo shortcut_info2; + WebAppShortcutsMenuItemInfo shortcut_info3; web_app_info->start_url = GURL("https://mytestpwa.com/"); web_app_info->title = u"WebAppTestWithShortcutMenuItems";
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index 2285838..aab0ac3c 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -55,6 +55,7 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" +#include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/ui_test_utils.h" @@ -89,6 +90,7 @@ #include "content/public/common/url_constants.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/content_mock_cert_verifier.h" #include "content/public/test/download_test_observer.h" #include "content/public/test/fake_speech_recognition_manager.h" #include "content/public/test/find_test_utils.h" @@ -108,7 +110,9 @@ #include "extensions/browser/app_window/native_app_window.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_embedder.h" #include "extensions/browser/guest_view/web_view/web_view_guest.h" +#include "extensions/browser/process_map.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_urls.h" #include "extensions/common/extensions_client.h" #include "extensions/common/features/feature_channel.h" #include "extensions/common/identifiability_metrics.h" @@ -5043,3 +5047,84 @@ IN_PROC_BROWSER_TEST_F(WebViewPPAPITest, Shim_TestPluginLoadPermission) { TestHelper("testPluginLoadPermission", "web_view/shim", NO_TEST_SERVER); } + +// Helper class to set up a fake Chrome Web Store URL which can be loaded in +// tests. +class WebstoreWebViewTest : public WebViewTest { + public: + WebstoreWebViewTest() : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} + + WebstoreWebViewTest(const WebstoreWebViewTest&) = delete; + WebstoreWebViewTest& operator=(const WebstoreWebViewTest&) = delete; + + ~WebstoreWebViewTest() override = default; + + void SetUpCommandLine(base::CommandLine* command_line) override { + https_server_.ServeFilesFromSourceDirectory("chrome/test/data"); + ASSERT_TRUE(https_server_.InitializeAndListen()); + + // Override the webstore URL. + command_line->AppendSwitchASCII( + ::switches::kAppsGalleryURL, + https_server()->GetURL("chrome.foo.com", "/frame_tree").spec()); + mock_cert_verifier_.SetUpCommandLine(command_line); + WebViewTest::SetUpCommandLine(command_line); + } + + void SetUpOnMainThread() override { + https_server_.StartAcceptingConnections(); + mock_cert_verifier_.mock_cert_verifier()->set_default_result(net::OK); + WebViewTest::SetUpOnMainThread(); + } + + void SetUpInProcessBrowserTestFixture() override { + WebViewTest::SetUpInProcessBrowserTestFixture(); + mock_cert_verifier_.SetUpInProcessBrowserTestFixture(); + } + + void TearDownInProcessBrowserTestFixture() override { + WebViewTest::TearDownInProcessBrowserTestFixture(); + mock_cert_verifier_.TearDownInProcessBrowserTestFixture(); + } + + net::EmbeddedTestServer* https_server() { return &https_server_; } + + private: + net::EmbeddedTestServer https_server_; + content::ContentMockCertVerifier mock_cert_verifier_; +}; + +// Ensure that an attempt to load Chrome Web Store in a <webview> is blocked +// and does not result in a renderer kill. See https://crbug.com/1197674. +IN_PROC_BROWSER_TEST_F(WebstoreWebViewTest, NoRendererKillWithChromeWebStore) { + LoadAppWithGuest("web_view/simple"); + content::WebContents* guest = GetGuestWebContents(); + ASSERT_TRUE(guest); + + // Navigate <webview> to a Chrome Web Store URL. This should result in an + // error and shouldn't lead to a renderer kill. + const GURL webstore_url = + https_server()->GetURL("chrome.foo.com", "/frame_tree/simple.htm"); + content::TestNavigationObserver error_observer( + guest, content::MessageLoopRunner::QuitMode::IMMEDIATE, + /*ignore_uncommitted_navigations=*/false); + EXPECT_TRUE( + ExecuteScript(guest, "location.href = '" + webstore_url.spec() + "';")); + error_observer.Wait(); + EXPECT_FALSE(error_observer.last_navigation_succeeded()); + EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, error_observer.last_net_error_code()); + + content::RenderFrameHost* guest_rfh = guest->GetMainFrame(); + EXPECT_TRUE(guest_rfh->IsRenderFrameLive()); + + // Double-check that after the attempted navigation the <webview> is not + // considered an extension process and does not have privileged webstore + // APIs. + auto* process_map = extensions::ProcessMap::Get(guest->GetBrowserContext()); + EXPECT_FALSE(process_map->Contains(guest_rfh->GetProcess()->GetID())); + EXPECT_TRUE( + process_map->GetExtensionsInProcess(guest_rfh->GetProcess()->GetID()) + .empty()); + EXPECT_EQ(false, content::EvalJs(guest, "!!chrome.webstorePrivate")); + EXPECT_EQ(false, content::EvalJs(guest, "!!chrome.dashboardPrivate")); +}
diff --git a/chrome/browser/apps/intent_helper/chromeos_intent_picker_helpers.cc b/chrome/browser/apps/intent_helper/chromeos_intent_picker_helpers.cc index 92c47ee..06168dc4 100644 --- a/chrome/browser/apps/intent_helper/chromeos_intent_picker_helpers.cc +++ b/chrome/browser/apps/intent_helper/chromeos_intent_picker_helpers.cc
@@ -128,6 +128,10 @@ PickerShowState::kOmnibox) { return; } + + IntentHandlingMetrics::RecordIntentPickerIconEvent( + IntentHandlingMetrics::IntentPickerIconEvent::kAutoPopOut); + content::WebContents* web_contents = navigation_handle->GetWebContents(); IntentPickerAutoDisplayService* ui_auto_display_service = IntentPickerAutoDisplayService::Get(
diff --git a/chrome/browser/apps/intent_helper/intent_picker_helpers.cc b/chrome/browser/apps/intent_helper/intent_picker_helpers.cc index 5e9a21f..6ec2145 100644 --- a/chrome/browser/apps/intent_helper/intent_picker_helpers.cc +++ b/chrome/browser/apps/intent_helper/intent_picker_helpers.cc
@@ -21,6 +21,7 @@ #if defined(OS_CHROMEOS) #include "chrome/browser/apps/intent_helper/chromeos_intent_picker_helpers.h" +#include "chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h" #elif defined(OS_MAC) #include "chrome/browser/apps/intent_helper/mac_intent_picker_helpers.h" #endif // defined(OS_CHROMEOS) @@ -157,6 +158,12 @@ std::vector<IntentPickerAppInfo> apps = FindAppsForUrl(web_contents, url, {}); if (apps.empty()) return; + +#if defined(OS_CHROMEOS) + apps::IntentHandlingMetrics::RecordIntentPickerIconEvent( + apps::IntentHandlingMetrics::IntentPickerIconEvent::kIconClicked); +#endif + IntentPickerTabHelper::LoadAppIcons( web_contents, std::move(apps), base::BindOnce(&OnAppIconsLoaded, web_contents,
diff --git a/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.cc b/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.cc index dd121fad..8feaca1 100644 --- a/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.cc +++ b/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.cc
@@ -169,6 +169,11 @@ RecordDestinationPlatformMetric(platform); } +void IntentHandlingMetrics::RecordIntentPickerIconEvent( + IntentPickerIconEvent event) { + UMA_HISTOGRAM_ENUMERATION("ChromeOS.Intents.IntentPickerIconEvent", event); +} + #if BUILDFLAG(IS_CHROMEOS_ASH) void IntentHandlingMetrics::RecordExternalProtocolMetrics( arc::Scheme scheme,
diff --git a/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h b/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h index 9c0db17..537f86b 100644 --- a/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h +++ b/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h
@@ -96,6 +96,19 @@ kMaxValue = MAC_OS, }; + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + enum class IntentPickerIconEvent { + // The intent picker icon was shown in the Omnibox. + kIconShown = 0, + // The intent picker icon in the Omnibox was clicked. + kIconClicked = 1, + // The intent picker dialog automatically popped out. This has the same + // effect as kIconClicked, but without the user interaction. + kAutoPopOut = 2, + kMaxValue = kAutoPopOut, + }; + IntentHandlingMetrics(); // Records metrics for the outcome of a user selection in the http/https @@ -111,6 +124,10 @@ // app, as the result of a user previously setting a preference for that app. static void RecordPreferredAppLinkClickMetrics(Platform platform); + // Records metrics for usage of the intent picker icon which appears in the + // Omnibox. + static void RecordIntentPickerIconEvent(IntentPickerIconEvent event); + #if BUILDFLAG(IS_CHROMEOS_ASH) static void RecordExternalProtocolMetrics(arc::Scheme scheme, apps::PickerEntryType entry_type,
diff --git a/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc b/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc index 0cbd6ed..9fc3e00 100644 --- a/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc +++ b/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc
@@ -69,8 +69,8 @@ // Calculate the amount of disk space, in bytes, needed in |share_dir| to // stream |total_file_size| bytes from Android to the Chrome OS file system. -static const int64_t CalculateRequiredSpace(const base::FilePath share_dir, - const uint64_t total_file_size) { +static int64_t CalculateRequiredSpace(const base::FilePath share_dir, + const uint64_t total_file_size) { DVLOG(1) << __func__; int64_t free_disk_space = base::SysInfo::AmountOfFreeDiskSpace(share_dir); VLOG(1) << "Free disk space: " << free_disk_space;
diff --git a/chrome/browser/ash/crostini/crostini_manager.cc b/chrome/browser/ash/crostini/crostini_manager.cc index 878c6068..cc3ed66 100644 --- a/chrome/browser/ash/crostini/crostini_manager.cc +++ b/chrome/browser/ash/crostini/crostini_manager.cc
@@ -2032,21 +2032,10 @@ ContainerId container_id, CrostiniResultCallback callback, RestartObserver* observer) { - RestartOptions options; - auto it = restart_options_.find(container_id); - if (it != restart_options_.end()) { - options = std::move(it->second); - restart_options_.erase(it); - } - return RestartCrostiniWithOptions(std::move(container_id), std::move(options), + return RestartCrostiniWithOptions(std::move(container_id), RestartOptions(), std::move(callback), observer); } -void CrostiniManager::SetRestartOptions(ContainerId container_id, - RestartOptions restart_options) { - restart_options_[container_id] = std::move(restart_options); -} - CrostiniManager::RestartId CrostiniManager::RestartCrostiniWithOptions( ContainerId container_id, RestartOptions options,
diff --git a/chrome/browser/ash/crostini/crostini_manager.h b/chrome/browser/ash/crostini/crostini_manager.h index 94ad21d..833c038b 100644 --- a/chrome/browser/ash/crostini/crostini_manager.h +++ b/chrome/browser/ash/crostini/crostini_manager.h
@@ -460,12 +460,6 @@ CrostiniResultCallback callback, RestartObserver* observer = nullptr); - // Set options for the next restart of |container_id|. The restart will - // consume the options. - // TODO(crbug:1261319): Get rid of the need for this. - void SetRestartOptions(ContainerId container_id, - RestartOptions restart_options); - // Aborts a restart. A "next" restarter with the same ContainerId will run, if // there is one. |callback| will be called once the restart has finished // aborting @@ -865,9 +859,6 @@ export_lxd_container_callbacks_; std::map<ContainerId, CrostiniResultCallback> import_lxd_container_callbacks_; - // Restart options that are required to start particular containers - std::map<ContainerId, RestartOptions> restart_options_; - // Callbacks to run after Tremplin is started, keyed by vm_name. These are // used if StartTerminaVm completes but we need to wait from Tremplin to // start.
diff --git a/chrome/browser/ash/input_method/assistive_suggester.cc b/chrome/browser/ash/input_method/assistive_suggester.cc index cf53c9bf..953ed40 100644 --- a/chrome/browser/ash/input_method/assistive_suggester.cc +++ b/chrome/browser/ash/input_method/assistive_suggester.cc
@@ -208,8 +208,7 @@ } bool AssistiveSuggester::IsEmojiSuggestAdditionEnabled() { - return base::FeatureList::IsEnabled(features::kEmojiSuggestAddition) && - profile_->GetPrefs()->GetBoolean( + return profile_->GetPrefs()->GetBoolean( prefs::kEmojiSuggestionEnterpriseAllowed) && profile_->GetPrefs()->GetBoolean(prefs::kEmojiSuggestionEnabled); } @@ -244,9 +243,6 @@ } DisabledReason AssistiveSuggester::GetDisabledReasonForEmoji() { - if (!base::FeatureList::IsEnabled(features::kEmojiSuggestAddition)) { - return DisabledReason::kFeatureFlagOff; - } if (!profile_->GetPrefs()->GetBoolean( prefs::kEmojiSuggestionEnterpriseAllowed)) { return DisabledReason::kEnterpriseSettingsOff;
diff --git a/chrome/browser/ash/input_method/assistive_suggester_unittest.cc b/chrome/browser/ash/input_method/assistive_suggester_unittest.cc index 82b1bd4..03aaf5f 100644 --- a/chrome/browser/ash/input_method/assistive_suggester_unittest.cc +++ b/chrome/browser/ash/input_method/assistive_suggester_unittest.cc
@@ -103,6 +103,9 @@ true, 1); histogram_tester_.ExpectUniqueSample( "InputMethod.Assistive.UserPref.MultiWord", true, 1); + // Emoji is default to true now, so need to set emoji pref false to test + // IsAssistiveFeatureEnabled correctly. + profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnabled, false); ui::IMEBridge::Initialize(); } @@ -113,11 +116,10 @@ base::HistogramTester histogram_tester_; }; -TEST_F(AssistiveSuggesterTest, - EmojiSuggestionPrefFalseFeatureFlagTrue_UserPrefEnabledFalse) { +TEST_F(AssistiveSuggesterTest, EmojiSuggestion_UserPrefEnabledFalse) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( - /*enabled_features=*/{features::kEmojiSuggestAddition}, + /*enabled_features=*/{}, /*disabled_features=*/{features::kAssistPersonalInfo, features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnterpriseAllowed, @@ -127,11 +129,10 @@ EXPECT_FALSE(assistive_suggester_->IsAssistiveFeatureEnabled()); } -TEST_F(AssistiveSuggesterTest, - EmojiSuggestionPrefFalseFeatureFlagTrue_EnterprisePrefEnabledFalse) { +TEST_F(AssistiveSuggesterTest, EmojiSuggestion_EnterprisePrefEnabledFalse) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( - /*enabled_features=*/{features::kEmojiSuggestAddition}, + /*enabled_features=*/{}, /*disabled_features=*/{features::kAssistPersonalInfo, features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnterpriseAllowed, @@ -141,11 +142,10 @@ EXPECT_FALSE(assistive_suggester_->IsAssistiveFeatureEnabled()); } -TEST_F(AssistiveSuggesterTest, - EmojiSuggestionPrefTrueFeatureFlagTrue_BothPrefsEnabledTrue) { +TEST_F(AssistiveSuggesterTest, EmojiSuggestion_BothPrefsEnabledTrue) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( - /*enabled_features=*/{features::kEmojiSuggestAddition}, + /*enabled_features=*/{}, /*disabled_features=*/{features::kAssistPersonalInfo, features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnterpriseAllowed, @@ -155,11 +155,10 @@ EXPECT_TRUE(assistive_suggester_->IsAssistiveFeatureEnabled()); } -TEST_F(AssistiveSuggesterTest, - EmojiSuggestionPrefTrueFeatureFlagTrue_BothPrefsEnabledFalse) { +TEST_F(AssistiveSuggesterTest, EmojiSuggestion_BothPrefsEnabledFalse) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( - /*enabled_features=*/{features::kEmojiSuggestAddition}, + /*enabled_features=*/{}, /*disabled_features=*/{features::kAssistPersonalInfo, features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnterpriseAllowed, @@ -175,8 +174,7 @@ feature_list.InitWithFeatures( /*enabled_features=*/{features::kAssistEmojiEnhanced}, /*disabled_features=*/{features::kAssistPersonalInfo, - features::kAssistMultiWord, - features::kEmojiSuggestAddition}); + features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnterpriseAllowed, false); profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnabled, false); @@ -185,26 +183,10 @@ } TEST_F(AssistiveSuggesterTest, - EnhancedEmojiSuggestDisabledWhenStandardEmojiDisabledAndPrefsEnabled) { - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures( - /*enabled_features=*/{features::kAssistEmojiEnhanced}, - /*disabled_features=*/{features::kAssistPersonalInfo, - features::kAssistMultiWord, - features::kEmojiSuggestAddition}); - profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnterpriseAllowed, - true); - profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnabled, true); - - EXPECT_FALSE(assistive_suggester_->IsAssistiveFeatureEnabled()); -} - -TEST_F(AssistiveSuggesterTest, EnhancedEmojiSuggestEnabledWhenStandardEmojiEnabledAndPrefsEnabled) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( - /*enabled_features=*/{features::kAssistEmojiEnhanced, - features::kEmojiSuggestAddition}, + /*enabled_features=*/{features::kAssistEmojiEnhanced}, /*disabled_features=*/{features::kAssistPersonalInfo, features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnterpriseAllowed, @@ -220,8 +202,7 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kAssistPersonalInfo}, - /*disabled_features=*/{features::kEmojiSuggestAddition, - features::kAssistMultiWord}); + /*disabled_features=*/{features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kAssistPersonalInfoEnabled, false); EXPECT_FALSE(assistive_suggester_->IsAssistiveFeatureEnabled()); @@ -233,8 +214,7 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kAssistPersonalInfo}, - /*disabled_features=*/{features::kEmojiSuggestAddition, - features::kAssistMultiWord}); + /*disabled_features=*/{features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kAssistPersonalInfoEnabled, true); EXPECT_TRUE(assistive_suggester_->IsAssistiveFeatureEnabled()); @@ -245,8 +225,7 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kAssistMultiWord}, - /*disabled_features=*/{features::kEmojiSuggestAddition, - features::kAssistPersonalInfo}); + /*disabled_features=*/{features::kAssistPersonalInfo}); profile_->GetPrefs()->SetBoolean(prefs::kAssistPredictiveWritingEnabled, true); @@ -258,8 +237,7 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kAssistMultiWord}, - /*disabled_features=*/{features::kEmojiSuggestAddition, - features::kAssistPersonalInfo}); + /*disabled_features=*/{features::kAssistPersonalInfo}); profile_->GetPrefs()->SetBoolean(prefs::kAssistPredictiveWritingEnabled, false); @@ -271,8 +249,7 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{}, - /*disabled_features=*/{features::kEmojiSuggestAddition, - features::kAssistPersonalInfo, + /*disabled_features=*/{features::kAssistPersonalInfo, features::kAssistMultiWord}); profile_->GetPrefs()->SetBoolean(prefs::kAssistPredictiveWritingEnabled, false); @@ -284,8 +261,7 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kAssistMultiWord}, - /*disabled_features=*/{features::kEmojiSuggestAddition, - features::kAssistPersonalInfo}); + /*disabled_features=*/{features::kAssistPersonalInfo}); EXPECT_TRUE(assistive_suggester_->IsAssistiveFeatureEnabled()); } @@ -696,28 +672,11 @@ chrome_keyboard_controller_client_; }; -TEST_F(AssistiveSuggesterEmojiTest, - ShouldReturnPrefixBasedEmojiSuggestionsWhenStandardFlagEnabledOnly) { - feature_list_.InitWithFeatures( - /*enabled_features=*/{features::kEmojiSuggestAddition}, - /*disabled_features=*/{}); - +TEST_F(AssistiveSuggesterEmojiTest, ShouldReturnPrefixBasedEmojiSuggestions) { assistive_suggester_->OnFocus(5); EXPECT_TRUE(assistive_suggester_->OnSurroundingTextChanged(u"happy ", 6, 6)); } -TEST_F(AssistiveSuggesterEmojiTest, - ShouldNotReturnPrefixBasedEmojiSuggestionsWhenBothEmojiFlagsAreEnabled) { - feature_list_.InitWithFeatures( - /*enabled_features=*/{features::kEmojiSuggestAddition, - features::kAssistEmojiEnhanced}, - /*disabled_features=*/{}); - - assistive_suggester_->OnFocus(5); - - EXPECT_FALSE(assistive_suggester_->OnSurroundingTextChanged(u"happy ", 6, 6)); -} - } // namespace input_method } // namespace ash
diff --git a/chrome/browser/ash/input_method/emoji_suggester.cc b/chrome/browser/ash/input_method/emoji_suggester.cc index 630d38c..826a8306 100644 --- a/chrome/browser/ash/input_method/emoji_suggester.cc +++ b/chrome/browser/ash/input_method/emoji_suggester.cc
@@ -42,7 +42,7 @@ const int kMaxCandidateSize = 5; const char kSpaceChar = ' '; constexpr char kTrimLeadingChars[] = "("; -constexpr char kEmojiMapFilePathTemplateName[] = "/emoji/emoji-map%s.csv"; +constexpr char kEmojiMapFilePathName[] = "/emoji/emoji-map.csv"; const int kMaxSuggestionIndex = 31; const int kMaxSuggestionSize = kMaxSuggestionIndex + 1; const int kNoneHighlighted = -1; @@ -53,11 +53,7 @@ std::string emoji_data; base::FilePath::StringType path(ime::kBundledInputMethodsDirPath); - std::string value = base::GetFieldTrialParamValueByFeature( - features::kEmojiSuggestAddition, "map"); - std::string file_path = - base::StringPrintf(kEmojiMapFilePathTemplateName, value.c_str()); - path.append(FILE_PATH_LITERAL(file_path)); + path.append(FILE_PATH_LITERAL(kEmojiMapFilePathName)); if (!base::ReadFileToString(base::FilePath(path), &emoji_data)) LOG(WARNING) << "Emoji map file missing."; return emoji_data;
diff --git a/chrome/browser/ash/input_method/native_input_method_engine_browsertest.cc b/chrome/browser/ash/input_method/native_input_method_engine_browsertest.cc index f2f6a8e..c92375d 100644 --- a/chrome/browser/ash/input_method/native_input_method_engine_browsertest.cc +++ b/chrome/browser/ash/input_method/native_input_method_engine_browsertest.cc
@@ -131,7 +131,6 @@ /*enabled_features=*/{features::kAssistPersonalInfo, features::kAssistPersonalInfoEmail, features::kAssistPersonalInfoName, - features::kEmojiSuggestAddition, features::kMultilingualTyping, features::kOnDeviceGrammarCheck}, /*disabled_features=*/{}); @@ -1127,8 +1126,7 @@ NativeInputMethodEngineAssistiveOff() { feature_list_.InitWithFeatures( /*enabled_features=*/{features::kAssistPersonalInfoName}, - /*disabled_features=*/{features::kAssistPersonalInfo, - features::kEmojiSuggestAddition}); + /*disabled_features=*/{features::kAssistPersonalInfo}); } ~NativeInputMethodEngineAssistiveOff() override = default; @@ -1181,19 +1179,5 @@ DisabledReason::kFeatureFlagOff, 1); } -IN_PROC_BROWSER_TEST_F(NativeInputMethodEngineAssistiveOff, - EmojiSuggestionDisabledReasonkFeatureFlagOff) { - base::HistogramTester histogram_tester; - engine_->get_assistive_suggester_for_testing() - ->get_emoji_suggester_for_testing() - ->LoadEmojiMapForTesting(kEmojiData); - - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), - GURL(chrome::kChromeUINewTabURL))); - ui_test_utils::SendToOmniboxAndSubmit(browser(), "happy "); - - histogram_tester.ExpectUniqueSample("InputMethod.Assistive.Disabled.Emoji", - DisabledReason::kFeatureFlagOff, 1); -} // namespace } // namespace input_method } // namespace ash
diff --git a/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc b/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc index 651ef8a..fa36387 100644 --- a/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc +++ b/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc
@@ -208,7 +208,6 @@ features::kAssistPersonalInfo, features::kAssistPersonalInfoEmail, features::kAssistPersonalInfoName, - features::kEmojiSuggestAddition, }); } @@ -217,7 +216,6 @@ features::kAssistPersonalInfo, features::kAssistPersonalInfoEmail, features::kAssistPersonalInfoName, - features::kEmojiSuggestAddition, features::kAssistMultiWord, }); } @@ -227,7 +225,6 @@ features::kAssistPersonalInfo, features::kAssistPersonalInfoEmail, features::kAssistPersonalInfoName, - features::kEmojiSuggestAddition, features::kAssistMultiWord, features::kLacrosSupport, }); @@ -714,8 +711,7 @@ feature_list_.InitWithFeatures( /*enabled_features=*/{features::kAssistPersonalInfo, features::kAssistPersonalInfoEmail, - features::kAssistPersonalInfoName, - features::kEmojiSuggestAddition}, + features::kAssistPersonalInfoName}, /*disabled_features=*/{}); // Needed by NativeInputMethodEngine to interact with the input field.
diff --git a/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc b/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc index c831132..1ee7e2e 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc
@@ -266,7 +266,9 @@ void SetUpInProcessBrowserTestFixture() override { AutoEnrollmentWithStatistics::SetUpInProcessBrowserTestFixture(); // Session manager client is initialized by DeviceStateMixin. - FakeSessionManagerClient::Get()->set_force_state_keys_missing(true); + FakeSessionManagerClient::Get()->set_state_keys_handling( + FakeSessionManagerClient::ServerBackedStateKeysHandling:: + kForceNotAvailable); } }; @@ -348,6 +350,49 @@ system::ScopedFakeStatisticsProvider fake_statistics_provider_; }; +// Requesting state keys hangs forever, but that should not matter because we're +// running on reven. +class EnrollmentOnRevenWithNoStateKeysResponse + : public EnrollmentLocalPolicyServerBase { + public: + EnrollmentOnRevenWithNoStateKeysResponse() = default; + + EnrollmentOnRevenWithNoStateKeysResponse( + const EnrollmentOnRevenWithNoStateKeysResponse&) = delete; + EnrollmentOnRevenWithNoStateKeysResponse& operator=( + const EnrollmentOnRevenWithNoStateKeysResponse&) = delete; + + ~EnrollmentOnRevenWithNoStateKeysResponse() override = default; + + // EnrollmentLocalPolicyServerBase: + void SetUpInProcessBrowserTestFixture() override { + EnrollmentLocalPolicyServerBase::SetUpInProcessBrowserTestFixture(); + // Session manager client is initialized by DeviceStateMixin. + FakeSessionManagerClient::Get()->set_state_keys_handling( + FakeSessionManagerClient::ServerBackedStateKeysHandling::kNoResponse); + // reven devices are also marked 'nochrome' which is important because it + // disables Forced Re-Enrollment (FRE). If FRE is enabled, state keys are + // required. + fake_statistics_provider_.SetMachineStatistic( + chromeos::system::kFirmwareTypeKey, + chromeos::system::kFirmwareTypeValueNonchrome); + // When using a fresh ScopedFakeStatisticsProvider we also need to configure + // a few entries (serial number, machine model). + // ConfigureFakeStatisticsForZeroTouch does that for us. + policy_server_.ConfigureFakeStatisticsForZeroTouch( + &fake_statistics_provider_); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + EnrollmentLocalPolicyServerBase::SetUpCommandLine(command_line); + + command_line->AppendSwitch(switches::kRevenBranding); + } + + private: + system::ScopedFakeStatisticsProvider fake_statistics_provider_; +}; + // Simple manual enrollment. IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, ManualEnrollment) { TriggerEnrollmentAndSignInSuccessfully(); @@ -358,6 +403,19 @@ EXPECT_TRUE(InstallAttributes::Get()->IsCloudManaged()); } +// The test case is the same as EnrollmentLocalPolicyServerBase.ManualEnrollment +// but the environment is different (simulate reven board, simulate state keys +// not being available). +IN_PROC_BROWSER_TEST_F(EnrollmentOnRevenWithNoStateKeysResponse, + ManualEnrollment) { + TriggerEnrollmentAndSignInSuccessfully(); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); + test::OobeJS().ExpectTrue("Oobe.isEnrollmentSuccessfulForTest()"); + EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); + EXPECT_TRUE(InstallAttributes::Get()->IsCloudManaged()); +} + // Simple manual enrollment with device attributes prompt. IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, ManualEnrollmentWithDeviceAttributes) {
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_test_helper.h b/chrome/browser/ash/policy/dlp/dlp_content_manager_test_helper.h index 8ce763ea..5aa77a30 100644 --- a/chrome/browser/ash/policy/dlp/dlp_content_manager_test_helper.h +++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_test_helper.h
@@ -21,7 +21,7 @@ class DlpReportingManager; // This class is an interface to DlpContentManager and is used in tests to -// access some of it's private methods. +// access some of its private methods. class DlpContentManagerTestHelper { public: DlpContentManagerTestHelper();
diff --git a/chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.cc b/chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.cc index a55170ab..9fc897a 100644 --- a/chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.cc +++ b/chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.cc
@@ -7,8 +7,8 @@ #include <memory> #include <utility> +#include "ash/constants/ash_switches.h" #include "base/bind.h" -#include "base/command_line.h" #include "base/logging.h" #include "base/values.h" #include "chrome/browser/ash/login/login_pref_names.h" @@ -249,10 +249,15 @@ return; } + // Currently reven devices don't support sever-backed state keys, but they + // also don't support FRE/AutoRE so don't block initialization of device + // policy on state keys being available on reven. + // TODO(b/208705225): Remove this special case when reven supports state keys. + const bool allow_init_without_state_keys = ash::switches::IsRevenBranding(); // TODO(b/181140445): If we had a separate state keys upload request to DM // Server we could drop the `state_keys_broker_->available()` requirement. if (policy_store_->is_initialized() && policy_store_->has_policy() && - state_keys_broker_->available()) { + (allow_init_without_state_keys || state_keys_broker_->available())) { StartConnection(CreateClient(enterprise_service_)); } }
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_handler.cc b/chrome/browser/ash/policy/enrollment/enrollment_handler.cc index dc09017..7d29bb3f 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_handler.cc +++ b/chrome/browser/ash/policy/enrollment/enrollment_handler.cc
@@ -7,6 +7,7 @@ #include <utility> #include "ash/components/attestation/attestation_flow.h" +#include "ash/constants/ash_switches.h" #include "base/base64.h" #include "base/bind.h" #include "base/command_line.h" @@ -312,6 +313,15 @@ return; } + // Currently reven devices don't support sever-backed state keys, but they + // also don't support FRE/AutoRE so don't block enrollment on the + // availablility of state keys. + // TODO(b/208705225): Remove this special case when reven supports state keys. + if (ash::switches::IsRevenBranding()) { + LOG(WARNING) << "Skipping state keys."; + HandleStateKeysResult({}); + return; + } LOG(WARNING) << "Requesting state keys."; state_keys_broker_->RequestStateKeys( base::BindOnce(&EnrollmentHandler::HandleStateKeysResult, @@ -455,7 +465,7 @@ // TODO(crbug.com/1271134): Logging as "WARNING" to make sure it's preserved // in the logs. - LOG(WARNING) << "State keys generated."; + LOG(WARNING) << "State keys generated, success=" << !state_keys.empty(); SetStep(STEP_LOADING_STORE); StartRegistration(); }
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc index f9f7a04..9096b1a 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc
@@ -11,25 +11,84 @@ namespace reporting { namespace { -void HandleCpuResult(MetricCallback callback, + +ThunderboltSecurityLevel TranslateThunderboltSecurityLevel( + cros_healthd::ThunderboltSecurityLevel security_level) { + switch (security_level) { + case cros_healthd::ThunderboltSecurityLevel::kNone: + return THUNDERBOLT_SECURITY_NONE_LEVEL; + case cros_healthd::ThunderboltSecurityLevel::kUserLevel: + return THUNDERBOLT_SECURITY_USER_LEVEL; + case cros_healthd::ThunderboltSecurityLevel::kSecureLevel: + return THUNDERBOLT_SECURITY_SECURE_LEVEL; + case cros_healthd::ThunderboltSecurityLevel::kDpOnlyLevel: + return THUNDERBOLT_SECURITY_DP_ONLY_LEVEL; + case cros_healthd::ThunderboltSecurityLevel::kUsbOnlyLevel: + return THUNDERBOLT_SECURITY_USB_ONLY_LEVEL; + case cros_healthd::ThunderboltSecurityLevel::kNoPcieLevel: + return THUNDERBOLT_SECURITY_NO_PCIE_LEVEL; + } + + NOTREACHED(); +} + +void HandleBusResult(MetricCallback callback, CrosHealthdMetricSampler::MetricType metric_type, - chromeos::cros_healthd::mojom::TelemetryInfoPtr result) { + cros_healthd::TelemetryInfoPtr result) { bool anything_reported = false; MetricData metric_data; - auto* keylocker_info_out = metric_data.mutable_info_data() - ->mutable_cpu_info() - ->mutable_keylocker_info(); + const auto& bus_result = result->bus_result; + + if (!bus_result.is_null()) { + switch (bus_result->which()) { + case cros_healthd::BusResult::Tag::ERROR: { + DVLOG(1) << "cros_healthd: Error getting bus info: " + << bus_result->get_error()->msg; + break; + } + + case cros_healthd::BusResult::Tag::BUS_DEVICES: { + for (const auto& bus_device : bus_result->get_bus_devices()) { + const auto& bus_info = bus_device->bus_info; + if (bus_info->is_thunderbolt_bus_info()) { + if (metric_type == CrosHealthdMetricSampler::MetricType::kInfo) { + auto* const thunderbolt_info_out = + metric_data.mutable_info_data() + ->mutable_bus_device_info() + ->mutable_thunderbolt_info(); + anything_reported = true; + thunderbolt_info_out->set_security_level( + TranslateThunderboltSecurityLevel( + bus_info->get_thunderbolt_bus_info()->security_level)); + } + } + } + break; + } + } + } + + if (anything_reported) { + std::move(callback).Run(metric_data); + } +} + +void HandleCpuResult(MetricCallback callback, + CrosHealthdMetricSampler::MetricType metric_type, + cros_healthd::TelemetryInfoPtr result) { + bool anything_reported = false; + MetricData metric_data; const auto& cpu_result = result->cpu_result; if (!cpu_result.is_null()) { switch (cpu_result->which()) { - case chromeos::cros_healthd::mojom::CpuResult::Tag::ERROR: { + case cros_healthd::CpuResult::Tag::ERROR: { DVLOG(1) << "cros_healthd: Error getting CPU info: " << cpu_result->get_error()->msg; break; } - case chromeos::cros_healthd::mojom::CpuResult::Tag::CPU_INFO: { + case cros_healthd::CpuResult::Tag::CPU_INFO: { const auto& cpu_info = cpu_result->get_cpu_info(); if (cpu_info.is_null()) { DVLOG(1) << "Null CpuInfo from cros_healthd"; @@ -38,6 +97,9 @@ // Gather keylocker info. if (metric_type == CrosHealthdMetricSampler::MetricType::kInfo) { + auto* const keylocker_info_out = metric_data.mutable_info_data() + ->mutable_cpu_info() + ->mutable_keylocker_info(); auto* keylocker_info = cpu_info->keylocker_info.get(); if (keylocker_info) { keylocker_info_out->set_supported(true); @@ -60,11 +122,10 @@ } } -void OnHealthdInfoReceived( - MetricCallback callback, - cros_healthd::ProbeCategoryEnum probe_category, - CrosHealthdMetricSampler::MetricType metric_type, - chromeos::cros_healthd::mojom::TelemetryInfoPtr result) { +void OnHealthdInfoReceived(MetricCallback callback, + cros_healthd::ProbeCategoryEnum probe_category, + CrosHealthdMetricSampler::MetricType metric_type, + cros_healthd::TelemetryInfoPtr result) { if (!result) { DVLOG(1) << "cros_healthd: null telemetry result"; return; @@ -75,6 +136,10 @@ HandleCpuResult(std::move(callback), metric_type, std::move(result)); break; } + case cros_healthd::ProbeCategoryEnum::kBus: { + HandleBusResult(std::move(callback), metric_type, std::move(result)); + break; + } default: { NOTREACHED(); return;
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc index 8eaabd4..68f7d20 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc
@@ -14,8 +14,14 @@ namespace cros_healthd = chromeos::cros_healthd::mojom; +struct TbtTestCase { + std::string test_name; + cros_healthd::ThunderboltSecurityLevel healthd_security_level; + reporting::ThunderboltSecurityLevel reporting_security_level; +}; + namespace reporting { -namespace { +namespace test { cros_healthd::KeylockerInfoPtr CreateKeylockerInfo(bool configured) { return cros_healthd::KeylockerInfo::New(configured); @@ -36,6 +42,24 @@ return telemetry_info; } +cros_healthd::TelemetryInfoPtr CreateBusResult( + cros_healthd::ThunderboltSecurityLevel security_level) { + auto telemetry_info = cros_healthd::TelemetryInfo::New(); + std::vector<cros_healthd::BusDevicePtr> bus_devices; + + auto tbt_device = cros_healthd::BusDevice::New(); + // Subtract one from security level to offset the unspecified index. + tbt_device->bus_info = cros_healthd::BusInfo::NewThunderboltBusInfo( + cros_healthd::ThunderboltBusInfo::New( + security_level, + std::vector<cros_healthd::ThunderboltBusInterfaceInfoPtr>())); + bus_devices.push_back(std::move(tbt_device)); + + telemetry_info->bus_result = + cros_healthd::BusResult::NewBusDevices(std::move(bus_devices)); + return telemetry_info; +} + MetricData CollectData(cros_healthd::TelemetryInfoPtr telemetry_info, cros_healthd::ProbeCategoryEnum probe_category, CrosHealthdMetricSampler::MetricType metric_type) { @@ -48,7 +72,22 @@ sampler.Collect(metric_collect_event.cb()); return metric_collect_event.result(); } -} // namespace + +MetricData CollectError(cros_healthd::TelemetryInfoPtr telemetry_info, + cros_healthd::ProbeCategoryEnum probe_category, + CrosHealthdMetricSampler::MetricType metric_type) { + MetricData data; + base::RunLoop run_loop; + chromeos::cros_healthd::FakeCrosHealthdClient::Get() + ->SetProbeTelemetryInfoResponseForTesting(telemetry_info); + CrosHealthdMetricSampler sampler(probe_category, metric_type); + + sampler.Collect(base::BindLambdaForTesting( + [&data](MetricData metric_data) { data = std::move(metric_data); })); + run_loop.RunUntilIdle(); + + return data; +} class CrosHealthdMetricSamplerTest : public testing::Test { public: @@ -65,6 +104,24 @@ base::test::SingleThreadTaskEnvironment task_environment_; }; +class CrosHealthdMetricSamplerTbtTest + : public CrosHealthdMetricSamplerTest, + public testing::WithParamInterface<TbtTestCase> {}; + +TEST_P(CrosHealthdMetricSamplerTbtTest, TestTbtSecurityLevels) { + const TbtTestCase& test_case = GetParam(); + MetricData result = + CollectData(CreateBusResult(test_case.healthd_security_level), + cros_healthd::ProbeCategoryEnum::kBus, + CrosHealthdMetricSampler::MetricType::kInfo); + ASSERT_TRUE(result.has_info_data()); + ASSERT_TRUE(result.info_data().has_bus_device_info()); + ASSERT_TRUE(result.info_data().bus_device_info().has_thunderbolt_info()); + EXPECT_EQ( + result.info_data().bus_device_info().thunderbolt_info().security_level(), + test_case.reporting_security_level); +} + TEST_F(CrosHealthdMetricSamplerTest, TestKeylockerConfigured) { MetricData result = CollectData(CreateCpuResult(CreateKeylockerInfo(true)), cros_healthd::ProbeCategoryEnum::kCpu, @@ -102,20 +159,49 @@ } TEST_F(CrosHealthdMetricSamplerTest, TestMojomError) { - MetricData data; auto telemetry_info = cros_healthd::TelemetryInfo::New(); telemetry_info->cpu_result = cros_healthd::CpuResult::NewError(cros_healthd::ProbeError::New( cros_healthd::ErrorType::kFileReadError, "")); - chromeos::cros_healthd::FakeCrosHealthdClient::Get() - ->SetProbeTelemetryInfoResponseForTesting(telemetry_info); + const auto& cpu_data = CollectError( + std::move(telemetry_info), cros_healthd::ProbeCategoryEnum::kCpu, + CrosHealthdMetricSampler::MetricType::kInfo); + ASSERT_FALSE(cpu_data.has_info_data()); - // The metric callback should not be ran in this case so TestEvent cannot - // be used. - CrosHealthdMetricSampler sampler(cros_healthd::ProbeCategoryEnum::kCpu, - CrosHealthdMetricSampler::MetricType::kInfo); - sampler.Collect(base::BindLambdaForTesting( - [&data](MetricData metric_data) { data = std::move(metric_data); })); - ASSERT_FALSE(data.has_info_data()); + telemetry_info = cros_healthd::TelemetryInfo::New(); + telemetry_info->bus_result = + cros_healthd::BusResult::NewError(cros_healthd::ProbeError::New( + cros_healthd::ErrorType::kFileReadError, "")); + const auto& bus_data = CollectError( + std::move(telemetry_info), cros_healthd::ProbeCategoryEnum::kCpu, + CrosHealthdMetricSampler::MetricType::kInfo); + + ASSERT_FALSE(bus_data.has_info_data()); } + +INSTANTIATE_TEST_SUITE_P( + CrosHealthdMetricSamplerTbtTests, + CrosHealthdMetricSamplerTbtTest, + testing::ValuesIn<TbtTestCase>({ + {"TbtSecurityNoneLevel", cros_healthd::ThunderboltSecurityLevel::kNone, + THUNDERBOLT_SECURITY_NONE_LEVEL}, + {"TbtSecurityUserLevel", + cros_healthd::ThunderboltSecurityLevel::kUserLevel, + THUNDERBOLT_SECURITY_USER_LEVEL}, + {"TbtSecuritySecureLevel", + cros_healthd::ThunderboltSecurityLevel::kSecureLevel, + THUNDERBOLT_SECURITY_SECURE_LEVEL}, + {"TbtSecurityDpOnlyLevel", + cros_healthd::ThunderboltSecurityLevel::kDpOnlyLevel, + THUNDERBOLT_SECURITY_DP_ONLY_LEVEL}, + {"TbtSecurityUsbOnlyLevel", + cros_healthd::ThunderboltSecurityLevel::kUsbOnlyLevel, + THUNDERBOLT_SECURITY_USB_ONLY_LEVEL}, + {"TbtSecurityNoPcieLevel", + cros_healthd::ThunderboltSecurityLevel::kNoPcieLevel, + THUNDERBOLT_SECURITY_NO_PCIE_LEVEL}, + }), + [](const testing::TestParamInfo<CrosHealthdMetricSamplerTbtTest::ParamType>& + info) { return info.param.test_name; }); +} // namespace test } // namespace reporting
diff --git a/chrome/browser/ash/web_applications/sample_system_web_app_info.cc b/chrome/browser/ash/web_applications/sample_system_web_app_info.cc index 795f9b3f..1834314 100644 --- a/chrome/browser/ash/web_applications/sample_system_web_app_info.cc +++ b/chrome/browser/ash/web_applications/sample_system_web_app_info.cc
@@ -39,14 +39,14 @@ info->user_display_mode = blink::mojom::DisplayMode::kStandalone; { - WebApplicationShortcutsMenuItemInfo shortcut; + WebAppShortcutsMenuItemInfo shortcut; shortcut.name = u"Inter Frame Communication Demo"; shortcut.url = GURL("chrome://sample-system-web-app/inter_frame_communication.html"); info->shortcuts_menu_item_infos.push_back(std::move(shortcut)); } { - WebApplicationShortcutsMenuItemInfo shortcut; + WebAppShortcutsMenuItemInfo shortcut; shortcut.name = u"Component Playground"; shortcut.url = GURL("chrome://sample-system-web-app/component_playground.html");
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index b8dbd2e..4cc1819 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -44,8 +44,6 @@ #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/history/web_history_service_factory.h" #include "chrome/browser/language/url_language_histogram_factory.h" -#include "chrome/browser/lite_video/lite_video_keyed_service.h" -#include "chrome/browser/lite_video/lite_video_keyed_service_factory.h" #include "chrome/browser/login_detection/login_detection_prefs.h" #include "chrome/browser/media/history/media_history_keyed_service.h" #include "chrome/browser/media/history/media_history_keyed_service_factory.h" @@ -548,11 +546,6 @@ if (optimization_guide_keyed_service) optimization_guide_keyed_service->ClearData(); - LiteVideoKeyedService* lite_video_keyed_service = - LiteVideoKeyedServiceFactory::GetForProfile(profile_); - if (lite_video_keyed_service) - lite_video_keyed_service->ClearData(delete_begin_, delete_end_); - PrefetchProxyService* prefetch_proxy_service = PrefetchProxyServiceFactory::GetForProfile(profile_); if (prefetch_proxy_service) {
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc index 91524138..661048d 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -49,8 +49,6 @@ #include "chrome/browser/favicon/favicon_service_factory.h" #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/language/url_language_histogram_factory.h" -#include "chrome/browser/lite_video/lite_video_keyed_service.h" -#include "chrome/browser/lite_video/lite_video_keyed_service_factory.h" #include "chrome/browser/password_manager/account_password_store_factory.h" #include "chrome/browser/password_manager/password_store_factory.h" #include "chrome/browser/permissions/permission_actions_history_factory.h" @@ -3263,32 +3261,6 @@ EXPECT_EQ(domains.size(), 0u); } -class ChromeBrowsingDataRemoverDelegateLiteVideoTest - : public ChromeBrowsingDataRemoverDelegateTest { - public: - ChromeBrowsingDataRemoverDelegateLiteVideoTest() { - // Both LiteVideo and Lite mode must be enabled for the - // LiteVideoKeyedService to be created. - feature_list_.InitAndEnableFeature(features::kLiteVideo); - } -}; -TEST_F(ChromeBrowsingDataRemoverDelegateLiteVideoTest, - LiteVideoClearHistoryData) { - base::HistogramTester histogram_tester; - base::CommandLine::ForCurrentProcess()->AppendSwitch( - "enable-spdy-proxy-auth"); - - LiteVideoKeyedService* lite_video_keyed_service = - LiteVideoKeyedServiceFactory::GetForProfile(GetProfile()); - lite_video_keyed_service->Initialize(GetProfile()->GetPath()); - - BlockUntilBrowsingDataRemoved(base::Time(), base::Time::Max(), - constants::DATA_TYPE_HISTORY, false); - - histogram_tester.ExpectUniqueSample("LiteVideo.UserBlocklist.ClearBlocklist", - true, 1); -} - // Verify that clearing secure payment confirmation credentials data works. TEST_F(ChromeBrowsingDataRemoverDelegateTest, RemoveSecurePaymentConfirmationCredentials) {
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc index 49092e7..65a49a5 100644 --- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc +++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -18,7 +18,6 @@ #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" #include "chrome/browser/headless/headless_mode_util.h" -#include "chrome/browser/lite_video/lite_video_observer.h" #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/net/net_error_tab_helper.h" #include "chrome/browser/net_benchmarking.h" @@ -487,13 +486,6 @@ return true; } #endif - if (interface_name == lite_video::mojom::LiteVideoService::Name_) { - LiteVideoObserver::BindLiteVideoService( - mojo::PendingAssociatedReceiver<lite_video::mojom::LiteVideoService>( - std::move(*handle)), - render_frame_host); - return true; - } #if BUILDFLAG(ENABLE_OFFLINE_PAGES) if (interface_name == offline_pages::mojom::MhtmlPageNotifier::Name_) { offline_pages::OfflinePageTabHelper::BindHtmlPageNotifier(
diff --git a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.cc b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.cc index 5698619..85793b0 100644 --- a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.cc +++ b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.cc
@@ -46,6 +46,22 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) } +#if BUILDFLAG(IS_CHROMEOS_ASH) +// Map ui::EndpointType to DlpRulesManager::Component for VMs. +DlpRulesManager::Component GetComponent(ui::EndpointType endpoint_type) { + switch (endpoint_type) { + case ui::EndpointType::kCrostini: + return DlpRulesManager::Component::kCrostini; + case ui::EndpointType::kPluginVm: + return DlpRulesManager::Component::kPluginVm; + case ui::EndpointType::kArc: + return DlpRulesManager::Component::kArc; + default: + return DlpRulesManager::Component::kUnknownComponent; + } +} +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + bool IsFilesApp(const ui::DataTransferEndpoint* const data_dst) { if (!data_dst || !data_dst->IsUrlType()) return false; @@ -151,6 +167,40 @@ return level; } + +void ReportWarningProceededEvent(const ui::DataTransferEndpoint* const data_src, + const ui::DataTransferEndpoint* const data_dst, + const std::string& src_pattern, + const std::string& dst_pattern, + DlpReportingManager* reporting_manager) { + if (!reporting_manager) + return; + + if (data_dst && IsVM(data_dst->type())) { +#if BUILDFLAG(IS_CHROMEOS_ASH) + reporting_manager->ReportWarningProceededEvent( + src_pattern, GetComponent(data_dst->type()), + DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kNotSet); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + } else { + reporting_manager->ReportWarningProceededEvent( + src_pattern, dst_pattern, DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kNotSet); + } +} + +bool MaybeReportWarningProceededEvent(const ui::DataTransferEndpoint data_src, + const ui::DataTransferEndpoint data_dst, + std::string src_pattern, + std::string dst_pattern, + DlpReportingManager* reporting_manager, + bool should_proceed) { + if (should_proceed) + ReportWarningProceededEvent(&data_src, &data_dst, src_pattern, dst_pattern, + reporting_manager); + return should_proceed; +} } // namespace // static @@ -170,8 +220,8 @@ DlpRulesManager::Level level = IsDataTransferAllowed( dlp_rules_manager_, data_src, data_dst, size, &src_pattern, &dst_pattern); - ReportEvent(data_src, data_dst, src_pattern, dst_pattern, level, - /*is_clipboard_event=*/true); + MaybeReportEvent(data_src, data_dst, src_pattern, dst_pattern, level, + /*is_clipboard_event=*/true); bool notify_on_paste = ShouldNotifyOnPaste(data_dst); @@ -187,11 +237,17 @@ case DlpRulesManager::Level::kWarn: if (notify_on_paste) { if (data_dst && IsVM(data_dst->type())) { + ReportEvent(data_src, data_dst, src_pattern, dst_pattern, + DlpRulesManager::Level::kWarn, + /*is_clipboard_event=*/true); WarnOnPaste(data_src, data_dst); } else if (ShouldCancelOnWarn(data_dst)) { is_read_allowed = false; } else if (!(data_dst && data_dst->IsUrlType()) && !ShouldPasteOnWarn(data_dst)) { + ReportEvent(data_src, data_dst, src_pattern, dst_pattern, + DlpRulesManager::Level::kWarn, + /*is_clipboard_event=*/true); WarnOnPaste(data_src, data_dst); is_read_allowed = false; } @@ -239,12 +295,21 @@ DCHECK_EQ(level, DlpRulesManager::Level::kWarn); if (ShouldNotifyOnPaste(data_dst)) { - if (ShouldPasteOnWarn(data_dst)) + if (ShouldPasteOnWarn(data_dst)) { + ReportWarningProceededEvent(data_src, data_dst, src_pattern, dst_pattern, + dlp_rules_manager_.GetReportingManager()); std::move(callback).Run(true); - else if (ShouldCancelOnWarn(data_dst)) + } else if (ShouldCancelOnWarn(data_dst)) { std::move(callback).Run(false); - else - WarnOnBlinkPaste(data_src, data_dst, web_contents, std::move(callback)); + } else { + auto reporting_callback = base::BindOnce( + &MaybeReportWarningProceededEvent, *data_src, *data_dst, src_pattern, + dst_pattern, dlp_rules_manager_.GetReportingManager()); + ReportEvent(data_src, data_dst, src_pattern, dst_pattern, + DlpRulesManager::Level::kWarn, /*is_clipboard_event=*/true); + WarnOnBlinkPaste(data_src, data_dst, web_contents, + std::move(reporting_callback).Then(std::move(callback))); + } } else { std::move(callback).Run(true); } @@ -260,8 +325,8 @@ IsDataTransferAllowed(dlp_rules_manager_, data_src, data_dst, absl::nullopt, &src_pattern, &dst_pattern); - ReportEvent(data_src, data_dst, src_pattern, dst_pattern, level, - /*is_clipboard_event*/ false); + MaybeReportEvent(data_src, data_dst, src_pattern, dst_pattern, level, + /*is_clipboard_event*/ false); switch (level) { case DlpRulesManager::Level::kBlock: @@ -370,10 +435,6 @@ const std::string& dst_pattern, DlpRulesManager::Level level, bool is_clipboard_event) { - if (level != DlpRulesManager::Level::kReport && - level != DlpRulesManager::Level::kBlock) - return; - auto* reporting_manager = dlp_rules_manager_.GetReportingManager(); if (!reporting_manager) return; @@ -419,6 +480,20 @@ } } +void DataTransferDlpController::MaybeReportEvent( + const ui::DataTransferEndpoint* const data_src, + const ui::DataTransferEndpoint* const data_dst, + const std::string& src_pattern, + const std::string& dst_pattern, + DlpRulesManager::Level level, + bool is_clipboard_event) { + if (level == DlpRulesManager::Level::kReport || + level == DlpRulesManager::Level::kBlock) { + ReportEvent(data_src, data_dst, src_pattern, dst_pattern, level, + is_clipboard_event); + } +} + DataTransferDlpController::LastReportedEndpoints::LastReportedEndpoints() = default;
diff --git a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.h b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.h index a619f13c..dc586ad 100644 --- a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.h +++ b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.h
@@ -89,6 +89,13 @@ DlpRulesManager::Level level, bool is_clipboard_event); + void MaybeReportEvent(const ui::DataTransferEndpoint* const data_src, + const ui::DataTransferEndpoint* const data_dst, + const std::string& src_pattern, + const std::string& dst_pattern, + DlpRulesManager::Level level, + bool is_clipboard_event); + // The solution for the issue of sending multiple reporting events for a // single user action. When a user triggers a paste (for instance by pressing // ctrl+V) clipboard API receives multiple mojo calls. For each call we check
diff --git a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc index 12782a0a..867ef4c 100644 --- a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc +++ b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc
@@ -118,6 +118,8 @@ bool ShouldPasteOnWarn( const ui::DataTransferEndpoint* const data_dst) override { + if (force_paste_on_warn_) + return true; return helper_->DidUserApproveDst(data_dst); } @@ -135,6 +137,7 @@ FakeClipboardNotifier* helper_ = nullptr; absl::optional<ui::DataTransferEndpoint> blink_data_dst_; base::RepeatingClosure blink_quit_cb_ = base::DoNothing(); + bool force_paste_on_warn_ = false; }; class MockDlpRulesManager : public DlpRulesManagerImpl { @@ -533,6 +536,28 @@ ~DataTransferDlpBlinkBrowserTest() override = default; protected: + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + + rules_manager_ = std::make_unique<::testing::NiceMock<MockDlpRulesManager>>( + g_browser_process->local_state()); + + reporting_manager_ = std::make_unique<DlpReportingManager>(); + SetReportQueueForReportingManager(reporting_manager_.get(), events, + base::SequencedTaskRunnerHandle::Get()); + ON_CALL(*rules_manager_, GetReportingManager) + .WillByDefault(::testing::Return(reporting_manager_.get())); + + dlp_controller_ = + std::make_unique<FakeDlpController>(*rules_manager_, &helper); + } + + void TearDownOnMainThread() override { + dlp_controller_.reset(); + reporting_manager_.reset(); + rules_manager_.reset(); + } + content::WebContents* GetActiveWebContents() { return browser()->tab_strip_model()->GetActiveWebContents(); } @@ -550,6 +575,12 @@ content::EXECUTE_SCRIPT_DEFAULT_OPTIONS, /*world_id=*/1); } + + std::unique_ptr<::testing::NiceMock<MockDlpRulesManager>> rules_manager_; + std::unique_ptr<DlpReportingManager> reporting_manager_; + std::vector<DlpPolicyEvent> events; + FakeClipboardNotifier helper; + std::unique_ptr<FakeDlpController> dlp_controller_; }; // Flaky on MSan bots: crbug.com/1230617 @@ -562,11 +593,8 @@ ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(ui_test_utils::NavigateToURL( browser(), embedded_test_server()->GetURL("/title1.html"))); - MockDlpRulesManager rules_manager(g_browser_process->local_state()); - FakeClipboardNotifier helper; - FakeDlpController dlp_controller(rules_manager, &helper); - + // TODO(1276069): Refactor duplicated code below. { ListPrefUpdate update(g_browser_process->local_state(), policy_prefs::kDlpRulesList); @@ -625,18 +653,29 @@ // Send paste event and wait till the notification is displayed. base::RunLoop run_loop; - dlp_controller.SetBlinkQuitCallback(run_loop.QuitClosure()); + dlp_controller_->SetBlinkQuitCallback(run_loop.QuitClosure()); GetActiveWebContents()->Paste(); run_loop.Run(); - ASSERT_TRUE(dlp_controller.ObserveWidget()); + ASSERT_TRUE(dlp_controller_->ObserveWidget()); + EXPECT_EQ(events.size(), 1u); + EXPECT_THAT(events[0], + IsDlpPolicyEvent(CreateDlpPolicyEvent( + kMailUrl, "*", DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kWarn))); - EXPECT_CALL(dlp_controller, OnWidgetClosing); - helper.BlinkProceedPressed(dlp_controller.blink_data_dst_.value()); + EXPECT_CALL(*dlp_controller_, OnWidgetClosing); + ASSERT_TRUE(dlp_controller_->blink_data_dst_.has_value()); + helper.BlinkProceedPressed(dlp_controller_->blink_data_dst_.value()); EXPECT_EQ(kClipboardText1, EvalJs(GetActiveWebContents(), "p")); + EXPECT_EQ(events.size(), 2u); + EXPECT_THAT(events[1], + IsDlpPolicyEvent(CreateDlpPolicyWarningProceededEvent( + kMailUrl, "*", DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kNotSet))); - testing::Mock::VerifyAndClearExpectations(&dlp_controller); + testing::Mock::VerifyAndClearExpectations(&dlp_controller_); } // Flaky on MSan bots: crbug.com/1230617 @@ -649,11 +688,8 @@ ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(ui_test_utils::NavigateToURL( browser(), embedded_test_server()->GetURL("/title1.html"))); - MockDlpRulesManager rules_manager(g_browser_process->local_state()); - FakeClipboardNotifier helper; - FakeDlpController dlp_controller(rules_manager, &helper); - + // TODO(1276069): Refactor duplicated code below. { ListPrefUpdate update(g_browser_process->local_state(), policy_prefs::kDlpRulesList); @@ -712,19 +748,107 @@ // Send paste event and wait till the notification is displayed. base::RunLoop run_loop; - dlp_controller.SetBlinkQuitCallback(run_loop.QuitClosure()); + dlp_controller_->SetBlinkQuitCallback(run_loop.QuitClosure()); GetActiveWebContents()->Paste(); run_loop.Run(); - ASSERT_TRUE(dlp_controller.ObserveWidget()); - ASSERT_TRUE(dlp_controller.blink_data_dst_.has_value()); + ASSERT_TRUE(dlp_controller_->ObserveWidget()); + ASSERT_TRUE(dlp_controller_->blink_data_dst_.has_value()); + EXPECT_EQ(events.size(), 1u); + EXPECT_THAT(events[0], + IsDlpPolicyEvent(CreateDlpPolicyEvent( + kMailUrl, "*", DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kWarn))); - EXPECT_CALL(dlp_controller, OnWidgetClosing); - helper.CancelWarningPressed(dlp_controller.blink_data_dst_.value()); + EXPECT_CALL(*dlp_controller_, OnWidgetClosing); + helper.CancelWarningPressed(dlp_controller_->blink_data_dst_.value()); EXPECT_EQ("", EvalJs(GetActiveWebContents(), "p")); + EXPECT_EQ(events.size(), 1u); - testing::Mock::VerifyAndClearExpectations(&dlp_controller); + testing::Mock::VerifyAndClearExpectations(&dlp_controller_); +} + +#if defined(MEMORY_SANITIZER) +#define MAYBE_CancelWarn DISABLED_CancelWarn +#else +#define MAYBE_ShouldProceedWarn ShouldProceedWarn +#endif +IN_PROC_BROWSER_TEST_F(DataTransferDlpBlinkBrowserTest, + MAYBE_ShouldProceedWarn) { + ASSERT_TRUE(embedded_test_server()->Start()); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("/title1.html"))); + + // TODO(1276069): Refactor duplicated code below. + { + ListPrefUpdate update(g_browser_process->local_state(), + policy_prefs::kDlpRulesList); + base::Value rule(base::Value::Type::DICTIONARY); + base::Value src_urls(base::Value::Type::DICTIONARY); + base::Value src_urls_list(base::Value::Type::LIST); + src_urls_list.Append(base::Value(kMailUrl)); + src_urls.SetKey("urls", std::move(src_urls_list)); + rule.SetKey("sources", std::move(src_urls)); + + base::Value dst_urls(base::Value::Type::DICTIONARY); + base::Value dst_urls_list(base::Value::Type::LIST); + dst_urls_list.Append(base::Value("*")); + dst_urls.SetKey("urls", std::move(dst_urls_list)); + rule.SetKey("destinations", std::move(dst_urls)); + + base::Value restrictions(base::Value::Type::DICTIONARY); + base::Value restrictions_list(base::Value::Type::LIST); + base::Value class_level_dict(base::Value::Type::DICTIONARY); + class_level_dict.SetKey("class", base::Value("CLIPBOARD")); + class_level_dict.SetKey("level", base::Value("WARN")); + restrictions_list.Append(std::move(class_level_dict)); + rule.SetKey("restrictions", std::move(restrictions_list)); + + update->Append(std::move(rule)); + } + + SetClipboardText(kClipboardText116, + std::make_unique<ui::DataTransferEndpoint>( + url::Origin::Create(GURL(kMailUrl)))); + + EXPECT_TRUE( + ExecJs(GetActiveWebContents(), + "var p = new Promise((resolve, reject) => {" + " window.document.onpaste = async (event) => {" + " if (event.clipboardData.items.length !== 1) {" + " reject('There were ' + event.clipboardData.items.length +" + " ' clipboard items. Expected 1.');" + " }" + " if (event.clipboardData.items[0].kind != 'string') {" + " reject('The clipboard item was of kind: ' +" + " event.clipboardData.items[0].kind + '. Expected ' +" + " 'string.');" + " }" + " const clipboardDataItem = event.clipboardData.items[0];" + " clipboardDataItem.getAsString((clipboardDataText)=> {" + " resolve(clipboardDataText);});" + " };" + "});")); + + content::UpdateUserActivationStateInterceptor user_activation_interceptor( + GetActiveWebContents()->GetMainFrame()); + user_activation_interceptor.UpdateUserActivationState( + blink::mojom::UserActivationUpdateType::kNotifyActivation, + blink::mojom::UserActivationNotificationType::kTest); + + dlp_controller_->force_paste_on_warn_ = true; + GetActiveWebContents()->Paste(); + EXPECT_FALSE(dlp_controller_->ObserveWidget()); + EXPECT_EQ(kClipboardText1, EvalJs(GetActiveWebContents(), "p")); + + EXPECT_EQ(events.size(), 1u); + EXPECT_THAT(events[0], + IsDlpPolicyEvent(CreateDlpPolicyWarningProceededEvent( + kMailUrl, "*", DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kNotSet))); + + testing::Mock::VerifyAndClearExpectations(&dlp_controller_); } // Test case for crbug.com/1213143 @@ -740,18 +864,8 @@ ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(ui_test_utils::NavigateToURL( browser(), embedded_test_server()->GetURL("/title1.html"))); - MockDlpRulesManager rules_manager(g_browser_process->local_state()); - FakeClipboardNotifier helper; - FakeDlpController dlp_controller(rules_manager, &helper); - - DlpReportingManager reporting_manager; - std::vector<DlpPolicyEvent> events; - SetReportQueueForReportingManager(&reporting_manager, events, - base::SequencedTaskRunnerHandle::Get()); - EXPECT_CALL(rules_manager, GetReportingManager) - .WillRepeatedly(::testing::Return(&reporting_manager)); - + // TODO(1276069): Refactor duplicated code below. { ListPrefUpdate update(g_browser_process->local_state(), policy_prefs::kDlpRulesList); @@ -809,7 +923,7 @@ blink::mojom::UserActivationNotificationType::kTest); GetActiveWebContents()->Paste(); - EXPECT_FALSE(dlp_controller.ObserveWidget()); + EXPECT_FALSE(dlp_controller_->ObserveWidget()); EXPECT_EQ(kClipboardText1, EvalJs(GetActiveWebContents(), "p")); EXPECT_EQ(events.size(), 1u); @@ -817,6 +931,7 @@ IsDlpPolicyEvent(CreateDlpPolicyEvent( kMailUrl, "*", DlpRulesManager::Restriction::kClipboard, DlpRulesManager::Level::kReport))); + // TODO(1276063): This EXPECT_GE is always true, because it is compared to 0. // The histogram sum may not have any samples when the time difference is very // small (almost 0), because UmaHistogramTimes requires the time difference to // be >= 1.
diff --git a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc index d6dd426..abcbe9c 100644 --- a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc +++ b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc
@@ -121,16 +121,25 @@ : public ::testing::TestWithParam< std::tuple<absl::optional<ui::EndpointType>, bool>> { protected: - DataTransferDlpControllerTest() - : rules_manager_(), dlp_controller_(rules_manager_) {} + DataTransferDlpControllerTest() : dlp_controller_(rules_manager_) {} ~DataTransferDlpControllerTest() override = default; + void SetUp() override { + SetReportQueueForReportingManager( + &reporting_manager_, events_, + base::ThreadPool::CreateSequencedTaskRunner({})); + ON_CALL(rules_manager_, GetReportingManager) + .WillByDefault(::testing::Return(&reporting_manager_)); + } + content::BrowserTaskEnvironment task_environment_; content::RenderViewHostTestEnabler rvh_test_enabler_; - ::testing::StrictMock<MockDlpRulesManager> rules_manager_; + ::testing::NiceMock<MockDlpRulesManager> rules_manager_; ::testing::StrictMock<MockDlpController> dlp_controller_; base::HistogramTester histogram_tester_; + DlpReportingManager reporting_manager_; + std::vector<DlpPolicyEvent> events_; #if BUILDFLAG(IS_CHROMEOS_LACROS) chromeos::LacrosService lacros_service_; #endif // BUILDFLAG(IS_CHROMEOS_LACROS) @@ -209,6 +218,14 @@ dlp_controller_.PasteIfAllowed(&data_src, &data_dst, absl::nullopt, web_contents->GetMainFrame(), callback.Get()); + // We are not expecting warning proceeded event here. Warning proceeded event + // is sent after a user accept the warn dialogue. + // However, DataTransferDlpController::WarnOnBlinkPaste method is mocked + // and consequently the dialog is not displayed. + EXPECT_EQ(events_.size(), 1u); + EXPECT_THAT(events_[0], IsDlpPolicyEvent(CreateDlpPolicyEvent( + "", "", DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kWarn))); } TEST_F(DataTransferDlpControllerTest, PasteIfAllowed_ProceedDst) { @@ -232,6 +249,10 @@ EXPECT_CALL(callback, Run(true)); dlp_controller_.PasteIfAllowed(&data_src, &data_dst, absl::nullopt, web_contents->GetMainFrame(), callback.Get()); + EXPECT_EQ(events_.size(), 1u); + EXPECT_THAT(events_[0], IsDlpPolicyEvent(CreateDlpPolicyWarningProceededEvent( + "", "", DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kWarn))); } TEST_F(DataTransferDlpControllerTest, PasteIfAllowed_CancelDst) { @@ -255,12 +276,14 @@ EXPECT_CALL(callback, Run(false)); dlp_controller_.PasteIfAllowed(&data_src, &data_dst, absl::nullopt, web_contents->GetMainFrame(), callback.Get()); + EXPECT_TRUE(events_.empty()); } // Create a version of the test class for parameterized testing. class DlpControllerTest : public DataTransferDlpControllerTest { protected: void SetUp() override { + DataTransferDlpControllerTest::SetUp(); data_src_ = ui::DataTransferEndpoint(url::Origin::Create(GURL(kExample1Url))); absl::optional<ui::EndpointType> endpoint_type; @@ -268,20 +291,12 @@ data_dst_ = CreateEndpoint(base::OptionalOrNullptr(endpoint_type), do_notify_); dst_ptr_ = base::OptionalOrNullptr(data_dst_); - - SetReportQueueForReportingManager( - &reporting_manager_, events_, - base::ThreadPool::CreateSequencedTaskRunner({})); - EXPECT_CALL(rules_manager_, GetReportingManager) - .WillRepeatedly(::testing::Return(&reporting_manager_)); } ui::DataTransferEndpoint data_src_{ui::EndpointType::kDefault}; bool do_notify_; absl::optional<ui::DataTransferEndpoint> data_dst_; ui::DataTransferEndpoint* dst_ptr_; - DlpReportingManager reporting_manager_; - std::vector<DlpPolicyEvent> events_; }; INSTANTIATE_TEST_SUITE_P( @@ -410,6 +425,13 @@ EXPECT_EQ(!show_warning, dlp_controller_.IsClipboardReadAllowed( &data_src_, dst_ptr_, absl::nullopt)); + if (show_warning) { + EXPECT_EQ(events_.size(), 1u); + EXPECT_THAT(events_[0], + IsDlpPolicyEvent(CreateDlpPolicyEvent( + "", "", DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kWarn))); + } testing::Mock::VerifyAndClearExpectations(&dlp_controller_); // ShouldPasteOnWarn returns true. @@ -421,7 +443,9 @@ .WillRepeatedly(testing::Return(false)); EXPECT_EQ(true, dlp_controller_.IsClipboardReadAllowed(&data_src_, dst_ptr_, absl::nullopt)); + EXPECT_EQ(events_.size(), show_warning ? 1u : 0u); testing::Mock::VerifyAndClearExpectations(&dlp_controller_); + histogram_tester_.ExpectBucketCount( GetDlpHistogramPrefix() + dlp::kClipboardReadBlockedUMA, false, show_warning ? 1 : 2); @@ -462,25 +486,18 @@ class DlpControllerVMsTest : public DataTransferDlpControllerTest { protected: void SetUp() override { + DataTransferDlpControllerTest::SetUp(); data_src_ = ui::DataTransferEndpoint(url::Origin::Create(GURL(kExample1Url))); std::tie(endpoint_type_, do_notify_) = GetParam(); ASSERT_TRUE(endpoint_type_.has_value()); data_dst_ = ui::DataTransferEndpoint(endpoint_type_.value(), do_notify_); - - SetReportQueueForReportingManager( - &reporting_manager_, events_, - base::ThreadPool::CreateSequencedTaskRunner({})); - EXPECT_CALL(rules_manager_, GetReportingManager) - .WillRepeatedly(::testing::Return(&reporting_manager_)); } ui::DataTransferEndpoint data_src_{ui::EndpointType::kDefault}; absl::optional<ui::EndpointType> endpoint_type_; bool do_notify_; ui::DataTransferEndpoint data_dst_{ui::EndpointType::kDefault}; - DlpReportingManager reporting_manager_; - std::vector<DlpPolicyEvent> events_; }; INSTANTIATE_TEST_SUITE_P( @@ -616,6 +633,13 @@ EXPECT_EQ(true, dlp_controller_.IsClipboardReadAllowed(&data_src, &data_dst, absl::nullopt)); + if (do_notify) { + EXPECT_EQ(events_.size(), 1u); + EXPECT_THAT(events_[0], IsDlpPolicyEvent(CreateDlpPolicyEvent( + "", GetComponent(endpoint_type.value()), + DlpRulesManager::Restriction::kClipboard, + DlpRulesManager::Level::kWarn))); + } testing::Mock::VerifyAndClearExpectations(&dlp_controller_); histogram_tester_.ExpectUniqueSample( GetDlpHistogramPrefix() + dlp::kClipboardReadBlockedUMA, false, 1);
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_tab_helper.h b/chrome/browser/chromeos/policy/dlp/dlp_content_tab_helper.h index 746d89e3..f067cd0 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_content_tab_helper.h +++ b/chrome/browser/chromeos/policy/dlp/dlp_content_tab_helper.h
@@ -36,8 +36,8 @@ // is managed and it's not an incognito profile. static void MaybeCreateForWebContents(content::WebContents* web_contents); - // Allows to create DlpContentTabHelper even the user is not managed and do - // not initialize DlpRulesManager in tests. + // Allows to create DlpContentTabHelper even if the user is not managed and + // without the need to initialize DlpRulesManager in tests. using ScopedIgnoreDlpRulesManager = base::AutoReset<bool>; static ScopedIgnoreDlpRulesManager IgnoreDlpRulesManagerForTesting();
diff --git a/chrome/browser/content_creation/notes/internal/android/java/res/drawable/note_title_outline.xml b/chrome/browser/content_creation/notes/internal/android/java/res/drawable/note_title_outline.xml index 1f51186..7d190d76 100644 --- a/chrome/browser/content_creation/notes/internal/android/java/res/drawable/note_title_outline.xml +++ b/chrome/browser/content_creation/notes/internal/android/java/res/drawable/note_title_outline.xml
@@ -6,6 +6,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > - <solid android:color="@color/default_bg_color" /> + <solid android:color="@macro/default_bg_color" /> <corners android:radius="15dp" /> </shape> \ No newline at end of file
diff --git a/chrome/browser/content_creation/notes/internal/android/java/res/layout/creation_dialog.xml b/chrome/browser/content_creation/notes/internal/android/java/res/layout/creation_dialog.xml index c3e5d08..26ee9bea 100644 --- a/chrome/browser/content_creation/notes/internal/android/java/res/layout/creation_dialog.xml +++ b/chrome/browser/content_creation/notes/internal/android/java/res/layout/creation_dialog.xml
@@ -9,7 +9,7 @@ android:id="@+id/dialog_layout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:orientation="vertical" android:contentDescription="@string/content_creation_note_dialog_description" android:importantForAccessibility="yes">
diff --git a/chrome/browser/content_creation/notes/internal/android/java/res/layout/top_bar.xml b/chrome/browser/content_creation/notes/internal/android/java/res/layout/top_bar.xml index 7bc7a01..b3f0177 100644 --- a/chrome/browser/content_creation/notes/internal/android/java/res/layout/top_bar.xml +++ b/chrome/browser/content_creation/notes/internal/android/java/res/layout/top_bar.xml
@@ -9,7 +9,7 @@ android:id="@+id/top_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/default_bg_color"> + android:background="@macro/default_bg_color"> <LinearLayout android:layout_width="match_parent"
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc index 0055f66..753b3fc 100644 --- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc +++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
@@ -59,6 +59,9 @@ namespace { +constexpr base::FilePath::CharType kLiteVideoOptOutDBFilename[] = + FILE_PATH_LITERAL("lite_video_opt_out.db"); + // Deletes Previews opt-out database file. Opt-out database is no longer needed // since Previews has been turned down. void DeletePreviewsOptOutDatabaseOnDBThread( @@ -66,6 +69,13 @@ sql::Database::Delete(previews_optout_database_file); } +// Deletes LiteVideos opt-out database file. Opt-out database is no longer +// needed since LiteVideos has been turned down. +void DeleteLiteVideosOptOutDatabaseOnDBThread( + const base::FilePath& optout_database_file) { + sql::Database::Delete(optout_database_file); +} + // Assume that any proxy host ending with this suffix is a Data Reduction Proxy. const char kDataReductionProxyDefaultHostSuffix[] = ".googlezip.net"; @@ -227,6 +237,11 @@ base::BindOnce(DeletePreviewsOptOutDatabaseOnDBThread, profile_path.Append(chrome::kPreviewsOptOutDBFilename))); + db_task_runner->PostTask( + FROM_HERE, + base::BindOnce(DeleteLiteVideosOptOutDatabaseOnDBThread, + profile_path.Append(kLiteVideoOptOutDBFilename))); + #if defined(OS_ANDROID) // On mobile we write Data Reduction Proxy prefs directly to the pref service. // On desktop we store Data Reduction Proxy prefs in memory, writing to disk
diff --git a/chrome/browser/data_saver/lite_video_browsertest.cc b/chrome/browser/data_saver/lite_video_browsertest.cc deleted file mode 100644 index ab625f1..0000000 --- a/chrome/browser/data_saver/lite_video_browsertest.cc +++ /dev/null
@@ -1,903 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/command_line.h" -#include "base/strings/utf_string_conversions.h" -#include "base/task/thread_pool/thread_pool_instance.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "build/build_config.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h" -#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" -#include "chrome/browser/lite_video/lite_video_decider.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_hint.h" -#include "chrome/browser/lite_video/lite_video_keyed_service.h" -#include "chrome/browser/lite_video/lite_video_keyed_service_factory.h" -#include "chrome/browser/lite_video/lite_video_navigation_metrics.h" -#include "chrome/browser/lite_video/lite_video_switches.h" -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/chrome_features.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "chrome/test/base/ui_test_utils.h" -#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h" -#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" -#include "components/data_reduction_proxy/proto/data_store.pb.h" -#include "components/metrics/content/subprocess_metrics_provider.h" -#include "components/prefs/pref_service.h" -#include "components/ukm/test_ukm_recorder.h" -#include "content/public/common/content_features.h" -#include "content/public/common/content_switches.h" -#include "content/public/test/browser_test.h" -#include "content/public/test/browser_test_utils.h" -#include "content/public/test/prerender_test_util.h" -#include "media/base/media_switches.h" -#include "media/base/test_data_util.h" -#include "net/dns/mock_host_resolver.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "services/metrics/public/cpp/ukm_builders.h" -#include "services/metrics/public/cpp/ukm_source.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" -#include "url/url_util.h" - -namespace { - -// Retries fetching |histogram_name| until it contains at least |count| samples. -void RetryForHistogramUntilCountReached( - const base::HistogramTester& histogram_tester, - const std::string& histogram_name, - size_t count) { - while (true) { - base::ThreadPoolInstance::Get()->FlushForTesting(); - base::RunLoop().RunUntilIdle(); - - content::FetchHistogramsFromChildProcesses(); - metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); - - const std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples(histogram_name); - size_t total_count = 0; - for (const auto& bucket : buckets) { - total_count += bucket.count; - } - if (total_count >= count) { - break; - } - } -} - -class LiteVideoBrowserTest : public InProcessBrowserTest { - public: - explicit LiteVideoBrowserTest(bool enable_lite_mode = true, - bool enable_lite_video_feature = true, - int max_rebuffers_before_stop = 1, - bool should_disable_lite_videos_on_seek = false) - : enable_lite_mode_(enable_lite_mode) { - std::vector<base::test::ScopedFeatureList::FeatureAndParams> - enabled_features; - base::FieldTrialParams params; - params["max_rebuffers_per_frame"] = - base::NumberToString(max_rebuffers_before_stop); - params["disable_on_media_player_seek"] = - should_disable_lite_videos_on_seek ? "true" : "false"; - - if (enable_lite_video_feature) - enabled_features.emplace_back(features::kLiteVideo, params); - - std::vector<base::Feature> disabled_features = { - // Disable fallback after decode error to avoid unexpected test pass on - // the fallback path. - media::kFallbackAfterDecodeError, - - // Disable out of process audio on Linux due to process spawn - // failures. http://crbug.com/986021 - features::kAudioServiceOutOfProcess, - }; - - scoped_feature_list_.InitWithFeaturesAndParameters(enabled_features, - disabled_features); - } - - LiteVideoBrowserTest(const LiteVideoBrowserTest&) = delete; - LiteVideoBrowserTest& operator=(const LiteVideoBrowserTest&) = delete; - - ~LiteVideoBrowserTest() override = default; - - void SetUpCommandLine(base::CommandLine* command_line) override { - command_line->AppendSwitchASCII( - switches::kAutoplayPolicy, - switches::autoplay::kNoUserGestureRequiredPolicy); - if (enable_lite_mode_) - command_line->AppendSwitch("enable-spdy-proxy-auth"); - command_line->AppendSwitch( - lite_video::switches::kLiteVideoForceOverrideDecision); - } - - void SetUp() override { - http_server_.ServeFilesFromSourceDirectory(media::GetTestDataPath()); - ASSERT_TRUE(http_server_.Start()); - InProcessBrowserTest::SetUp(); - } - - void TestMSEPlayback(const std::string& media_file, - const std::string& segment_duration, - const std::string& segment_fetch_delay_before_end, - bool has_subframe_video) { - base::StringPairs query_params; - std::string media_files = media_file; - // Add few media segments, separated by ';' - media_files += ";" + media_file + "?id=1"; - media_files += ";" + media_file + "?id=2"; - media_files += ";" + media_file + "?id=3"; - media_files += ";" + media_file + "?id=4"; - query_params.emplace_back("mediaFile", media_files); - query_params.emplace_back("mediaType", - media::GetMimeTypeForFile(media_file)); - query_params.emplace_back("MSESegmentDurationMS", segment_duration); - query_params.emplace_back("MSESegmentFetchDelayBeforeEndMS", - segment_fetch_delay_before_end); - RunMediaTestPage( - has_subframe_video ? "multi_frame_mse_player.html" : "mse_player.html", - query_params, base::ASCIIToUTF16(media::kEndedTitle)); - } - - // Runs a html page with a list of URL query parameters. - // The test starts a local http test server to load the test page - void RunMediaTestPage(const std::string& html_page, - const base::StringPairs& query_params, - const std::u16string& expected_title) { - std::string query = media::GetURLQueryString(query_params); - content::TitleWatcher title_watcher( - browser()->tab_strip_model()->GetActiveWebContents(), expected_title); - media_url_ = http_server_.GetURL("/" + html_page + "?" + query); - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), media_url_)); - EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); - } - - const base::HistogramTester& histogram_tester() { return histogram_tester_; } - - GURL media_url() { return media_url_; } - - std::string http_server_host() const { - return http_server_.base_url().HostNoBrackets(); - } - - protected: - net::EmbeddedTestServer http_server_; - - private: - bool enable_lite_mode_; // Whether LiteMode is enabled. - GURL media_url_; - base::test::ScopedFeatureList scoped_feature_list_; - base::HistogramTester histogram_tester_; -}; -// Fails occasionally on ChromeOS, MacOS, Win, Linux. http://crbug.com/1111570 -// Need to make tests more reliable but feature only targeted -// for Android. Currently there are potential race conditions -// on throttle timing and counts -#if defined(OS_WIN) || defined(OS_MAC) || defined(OS_CHROMEOS) -#define DISABLE_ON_WIN_MAC_CHROMEOS(x) DISABLED_##x -#else -#define DISABLE_ON_WIN_MAC_CHROMEOS(x) x -#endif - -IN_PROC_BROWSER_TEST_F(LiteVideoBrowserTest, - DISABLE_ON_WIN_MAC_CHROMEOS(SimplePlayback)) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2000", "2000", false); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Verify that at least 1 request was throttled. There will be 5 requests - // made and the hint is available. - RetryForHistogramUntilCountReached(histogram_tester(), - "LiteVideo.URLLoader.ThrottleLatency", 1); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - // Blocklist reason is unknown due to force overriding the decision logic - // for testing. - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); - auto* result_entry = ukm_recorder.GetEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName); - EXPECT_TRUE( - *result_entry == - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop) || - *result_entry == - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottleStoppedOnRebuffer)); -} - -class LiteVideoWithLiteModeDisabledBrowserTest : public LiteVideoBrowserTest { - public: - LiteVideoWithLiteModeDisabledBrowserTest() - : LiteVideoBrowserTest(false /*enable_lite_mode*/, - true /*enable_lite_video_feature*/) {} -}; - -IN_PROC_BROWSER_TEST_F(LiteVideoWithLiteModeDisabledBrowserTest, - VideoThrottleDisabled) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2000", "2000", false); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(0u, entries.size()); -} - -IN_PROC_BROWSER_TEST_F(LiteVideoBrowserTest, - MSEPlaybackStalledDueToBufferUnderflow) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2700", "500", false); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - // Verify some responses were throttled and some video stalls were - // encountered. - EXPECT_GE(1U, histogram_tester() - .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency") - .size()); - EXPECT_GE(1U, histogram_tester() - .GetAllSamples("LiteVideo.HintsAgent.StopThrottling") - .size()); - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - // Blocklist reason is unknown due to force overriding the decision logic - // for testing. - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottleStoppedOnRebuffer)); -} - -IN_PROC_BROWSER_TEST_F(LiteVideoBrowserTest, - MSEPlaybackStalledDueToBufferUnderflow_WithSubframe) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2700", "500", true); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - RetryForHistogramUntilCountReached(histogram_tester(), - "LiteVideo.HintAgent.HasHint", 2); - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 2); - // Verify some responses were throttled and some video stalls were - // encountered. - EXPECT_GE(2U, histogram_tester() - .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency") - .size()); - EXPECT_GE(2U, histogram_tester() - .GetAllSamples("LiteVideo.HintsAgent.StopThrottling") - .size()); - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - // Only 1 UKM entry logged, tied to the mainframe navigation. - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - // Blocklist reason is unknown due to force overriding the decision logic - // for testing. - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottleStoppedOnRebuffer)); -} - -class LiteVideoStopThrottlingOnPlaybackSeekBrowserTest - : public ::testing::WithParamInterface<bool>, - public LiteVideoBrowserTest { - public: - LiteVideoStopThrottlingOnPlaybackSeekBrowserTest() - : LiteVideoBrowserTest(true /*enable_lite_mode*/, - true /*enable_lite_video_feature*/, - 1 /* max_rebuffers_before_stop */, - should_disable_lite_videos_on_seek()) {} - - bool should_disable_lite_videos_on_seek() const { return GetParam(); } -}; - -INSTANTIATE_TEST_SUITE_P(, - LiteVideoStopThrottlingOnPlaybackSeekBrowserTest, - ::testing::Bool()); - -// When video is seeked throttling is stopped. -// crbug.com/1248927: flaky on win -#if defined(OS_WIN) -#define MAYBE_StopsThrottlingOnPlaybackSeek \ - DISABLED_StopsThrottlingOnPlaybackSeek -#else -#define MAYBE_StopsThrottlingOnPlaybackSeek StopsThrottlingOnPlaybackSeek -#endif -IN_PROC_BROWSER_TEST_P(LiteVideoStopThrottlingOnPlaybackSeekBrowserTest, - MAYBE_StopsThrottlingOnPlaybackSeek) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2000", "2000", false); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Trigger a media playback seek. - ASSERT_TRUE( - content::ExecJs(browser()->tab_strip_model()->GetActiveWebContents(), - "document.querySelector('video').currentTime = 1")); - - // Verify some responses were throttled and then throttling is stopped. - if (should_disable_lite_videos_on_seek()) { - RetryForHistogramUntilCountReached( - histogram_tester(), "LiteVideo.MediaPlayerSeek.StopThrottling", 1); - } - - EXPECT_GE(1U, histogram_tester() - .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency") - .size()); - EXPECT_EQ(should_disable_lite_videos_on_seek() ? 1U : 0U, - histogram_tester() - .GetAllSamples("LiteVideo.MediaPlayerSeek.StopThrottling") - .size()); - EXPECT_GE( - 1U, histogram_tester() - .GetAllSamples("LiteVideo.NavigationMetrics.FrameRebufferMapSize") - .size()); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); -} - -class LiteVideoAndLiteModeDisabledBrowserTest : public LiteVideoBrowserTest { - public: - LiteVideoAndLiteModeDisabledBrowserTest() - : LiteVideoBrowserTest(false /*enable_lite_mode*/, - false /*enable_lite_video_feature*/) {} -}; - -IN_PROC_BROWSER_TEST_F(LiteVideoAndLiteModeDisabledBrowserTest, - VideoThrottleDisabled) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2000", "2000", false); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(0u, entries.size()); -} - -class LiteVideoRebuffersAllowedBrowserTest : public LiteVideoBrowserTest { - public: - LiteVideoRebuffersAllowedBrowserTest() - : LiteVideoBrowserTest(true /*enable_lite_mode*/, - true /*enable_lite_video_feature*/, - 10 /*max_rebuffers_before_stop*/) {} -}; - -IN_PROC_BROWSER_TEST_F(LiteVideoRebuffersAllowedBrowserTest, - LiteVideoContinuesAfterBufferUnderflow) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2700", "500", false); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - // Verify some responses were throttled and some video stalls were - // encountered. - EXPECT_GE(1U, histogram_tester() - .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency") - .size()); - EXPECT_EQ(0U, histogram_tester() - .GetAllSamples("LiteVideo.HintsAgent.StopThrottling") - .size()); - EXPECT_GE( - 1U, histogram_tester() - .GetAllSamples("LiteVideo.NavigationMetrics.FrameRebufferMapSize") - .size()); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - // Blocklist reason is unknown due to force overriding the decision logic - // for testing. - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); -} - -IN_PROC_BROWSER_TEST_F(LiteVideoRebuffersAllowedBrowserTest, - LiteVideoContinuesAfterBufferUnderflow_WithSubframe) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2700", "500", true); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - RetryForHistogramUntilCountReached(histogram_tester(), - "LiteVideo.HintAgent.HasHint", 2); - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 2); - // Verify some responses were throttled and some video stalls were - // encountered. - EXPECT_GE(2U, histogram_tester() - .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency") - .size()); - EXPECT_EQ(0U, histogram_tester() - .GetAllSamples("LiteVideo.HintsAgent.StopThrottling") - .size()); - EXPECT_GE( - 1U, histogram_tester() - .GetAllSamples("LiteVideo.NavigationMetrics.FrameRebufferMapSize") - .size()); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - // Only 1 UKM entry logged, tied to the mainframe navigation. - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - // Blocklist reason is unknown due to force overriding the decision logic - // for testing. - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); -} - -class LiteVideoDataSavingsBrowserTest : public LiteVideoBrowserTest { - protected: - void SetUpOnMainThread() override { - PrefService* prefs = browser()->profile()->GetPrefs(); - prefs->SetBoolean(data_reduction_proxy::prefs::kDataUsageReportingEnabled, - true); - } - - // Gets the data usage recorded against the host the embedded server runs on. - uint64_t GetDataUsage(const std::string& host) { - const auto& data_usage_map = - DataReductionProxyChromeSettingsFactory::GetForBrowserContext( - browser()->profile()) - ->data_reduction_proxy_service() - ->compression_stats() - ->DataUsageMapForTesting(); - const auto& it = data_usage_map.find(host); - if (it != data_usage_map.end()) - return it->second->data_used(); - return 0; - } - - // Gets the data savings recorded against the host the embedded server runs - // on. - int64_t GetDataSavings(const std::string& host) { - const auto& data_usage_map = - DataReductionProxyChromeSettingsFactory::GetForBrowserContext( - browser()->profile()) - ->data_reduction_proxy_service() - ->compression_stats() - ->DataUsageMapForTesting(); - const auto& it = data_usage_map.find(host); - if (it != data_usage_map.end()) - return it->second->original_size() - it->second->data_used(); - return 0; - } - - void WaitForDBToInitialize() { - base::RunLoop run_loop; - DataReductionProxyChromeSettingsFactory::GetForBrowserContext( - browser()->profile()) - ->data_reduction_proxy_service() - ->GetDBTaskRunnerForTesting() - ->PostTask(FROM_HERE, run_loop.QuitClosure()); - run_loop.Run(); - } -}; - -IN_PROC_BROWSER_TEST_F(LiteVideoDataSavingsBrowserTest, - DISABLE_ON_WIN_MAC_CHROMEOS(SimplePlayback)) { - WaitForDBToInitialize(); - uint64_t data_savings_before_navigation = GetDataSavings(http_server_host()); - - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2000", "2000", false); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Verify that at least 1 request was throttled. There will be 5 requests - // made and the hint is available. - RetryForHistogramUntilCountReached(histogram_tester(), - "LiteVideo.URLLoader.ThrottleLatency", 1); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - // Blocklist reason is unknown due to force overriding the decision logic - // for testing. - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); - auto* result_entry = ukm_recorder.GetEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName); - EXPECT_TRUE( - *result_entry == - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop) || - *result_entry == - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottleStoppedOnRebuffer)); - - // Expect at least 30KB data savings. The video is ~400KB, and based on the - // default parameters from GetThrottledVideoBytesDeflatedRatio(), it could be - // up to 116KB of savings when the full video is throttled, and up to 40KB - // when only part of the video is throtted and LiteVideo gets paused due to - // rebuffers. - EXPECT_LE(30000u, GetDataSavings(http_server_host()) - - data_savings_before_navigation); -} - -class LiteVideoPrerenderBrowserTest : public LiteVideoBrowserTest { - public: - LiteVideoPrerenderBrowserTest() - : LiteVideoBrowserTest(true /*enable_lite_mode*/, - true /*enable_lite_video_feature*/), - prerender_helper_( - base::BindRepeating(&LiteVideoPrerenderBrowserTest::GetWebContents, - base::Unretained(this))) {} - ~LiteVideoPrerenderBrowserTest() override = default; - LiteVideoPrerenderBrowserTest(const LiteVideoPrerenderBrowserTest&) = delete; - - LiteVideoPrerenderBrowserTest& operator=( - const LiteVideoPrerenderBrowserTest&) = delete; - - void SetUp() override { - prerender_helper_.SetUp(&http_server_); - LiteVideoBrowserTest::SetUp(); - } - - void SetUpOnMainThread() override { - host_resolver()->AddRule("*", "127.0.0.1"); - LiteVideoBrowserTest::SetUpOnMainThread(); - } - - content::test::PrerenderTestHelper& prerender_test_helper() { - return prerender_helper_; - } - - content::WebContents* GetWebContents() { - return browser()->tab_strip_model()->GetActiveWebContents(); - } - - private: - content::test::PrerenderTestHelper prerender_helper_; -}; - -IN_PROC_BROWSER_TEST_F(LiteVideoPrerenderBrowserTest, - PrerenderingShouldNotAffectMediaBufferUnderflowTest) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2700", "500", false); - - // Loads the media page in the prerender and the prerendering shouldn't - // affect the existing media buffer underflow test. - prerender_test_helper().AddPrerender(media_url()); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - // Verify some responses were throttled and some video stalls were - // encountered. - EXPECT_GE(1U, histogram_tester() - .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency") - .size()); - EXPECT_GE(1U, histogram_tester() - .GetAllSamples("LiteVideo.HintsAgent.StopThrottling") - .size()); - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - // Blocklist reason is unknown due to force overriding the decision logic - // for testing. - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottleStoppedOnRebuffer)); -} - -class LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest - : public LiteVideoStopThrottlingOnPlaybackSeekBrowserTest { - public: - LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest() - : prerender_helper_(base::BindRepeating( - &LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest:: - GetWebContents, - base::Unretained(this))) {} - ~LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest() override = - default; - LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest( - const LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest&) = - delete; - - LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest& operator=( - const LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest&) = - delete; - - void SetUp() override { - prerender_helper_.SetUp(&http_server_); - LiteVideoBrowserTest::SetUp(); - } - - void SetUpOnMainThread() override { - host_resolver()->AddRule("*", "127.0.0.1"); - LiteVideoStopThrottlingOnPlaybackSeekBrowserTest::SetUpOnMainThread(); - } - - content::test::PrerenderTestHelper& prerender_test_helper() { - return prerender_helper_; - } - - content::WebContents* GetWebContents() { - return browser()->tab_strip_model()->GetActiveWebContents(); - } - - private: - content::test::PrerenderTestHelper prerender_helper_; -}; - -INSTANTIATE_TEST_SUITE_P( - , - LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest, - ::testing::Bool()); - -// TODO(crbug.com/1268716): Revive this test. -IN_PROC_BROWSER_TEST_P( - LiteVideoStopThrottlingOnPlaybackSeekPrerenderBrowserTest, - DISABLED_PrerenderingShouldNotAffectPlaybackSeekTest) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2000", "2000", false); - - // Load the media page in the prerender and the prerendering shouldn't - // affect the existing media playback seek test. - prerender_test_helper().AddPrerender(media_url()); - - RetryForHistogramUntilCountReached(histogram_tester(), - "Media.VideoHeight.Initial.MSE", 1); - - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Trigger a media playback seek. - ASSERT_TRUE( - content::ExecJs(browser()->tab_strip_model()->GetActiveWebContents(), - "document.querySelector('video').currentTime = 1")); - - // Verify some responses were throttled and then throttling is stopped. - if (should_disable_lite_videos_on_seek()) { - RetryForHistogramUntilCountReached( - histogram_tester(), "LiteVideo.MediaPlayerSeek.StopThrottling", 1); - } - - EXPECT_GE(1U, histogram_tester() - .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency") - .size()); - EXPECT_EQ(should_disable_lite_videos_on_seek() ? 1U : 0U, - histogram_tester() - .GetAllSamples("LiteVideo.MediaPlayerSeek.StopThrottling") - .size()); - EXPECT_GE( - 1U, histogram_tester() - .GetAllSamples("LiteVideo.NavigationMetrics.FrameRebufferMapSize") - .size()); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); -} - -class LiteVideoDeciderPrerenderBrowserTest : public LiteVideoBrowserTest { - public: - LiteVideoDeciderPrerenderBrowserTest() - : LiteVideoBrowserTest(true /*enable_lite_mode*/, - true /*enable_lite_video_feature*/), - prerender_helper_(base::BindRepeating( - &LiteVideoDeciderPrerenderBrowserTest::GetWebContents, - base::Unretained(this))) {} - ~LiteVideoDeciderPrerenderBrowserTest() override = default; - LiteVideoDeciderPrerenderBrowserTest( - const LiteVideoDeciderPrerenderBrowserTest&) = delete; - - LiteVideoDeciderPrerenderBrowserTest& operator=( - const LiteVideoDeciderPrerenderBrowserTest&) = delete; - - void SetUp() override { - prerender_helper_.SetUp(&http_server_); - LiteVideoBrowserTest::SetUp(); - } - - void SetUpOnMainThread() override { - host_resolver()->AddRule("*", "127.0.0.1"); - LiteVideoBrowserTest::SetUpOnMainThread(); - } - - void SetUpCommandLine(base::CommandLine* command_line) override { - LiteVideoBrowserTest::SetUpCommandLine(command_line); - command_line->RemoveSwitch( - lite_video::switches::kLiteVideoForceOverrideDecision); - command_line->RemoveSwitch( - lite_video::switches::kLiteVideoIgnoreNetworkConditions); - } - - content::test::PrerenderTestHelper& prerender_test_helper() { - return prerender_helper_; - } - - content::WebContents* GetWebContents() { - return browser()->tab_strip_model()->GetActiveWebContents(); - } - - net::EmbeddedTestServer* http_server() { return &http_server_; } - - private: - content::test::PrerenderTestHelper prerender_helper_; -}; - -// This test is based on MAYBE_StopsThrottlingOnPlaybackSeek test. -// MAYBE_StopsThrottlingOnPlaybackSeek is flaky on win. So, this test is also -// disabled on win. See also crbug.com/1248927. -#if defined(OS_WIN) -#define MAYBE_PrerenderingShouldNotRecordLiteVideoDecisionMetrics \ - DISABLED_PrerenderingShouldNotRecordLiteVideoDecisionMetrics -#else -#define MAYBE_PrerenderingShouldNotRecordLiteVideoDecisionMetrics \ - PrerenderingShouldNotRecordLiteVideoDecisionMetrics -#endif -IN_PROC_BROWSER_TEST_F( - LiteVideoDeciderPrerenderBrowserTest, - MAYBE_PrerenderingShouldNotRecordLiteVideoDecisionMetrics) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - TestMSEPlayback("bear-vp9.webm", "2700", "500", false); - - // Set the network type to 4G network to test |is_in_primary_main_frame| - // behavior in LiteVideoDecider::CanApplyLiteVideo method. - Profile* profile = - Profile::FromBrowserContext(GetWebContents()->GetBrowserContext()); - ASSERT_TRUE(profile); - lite_video::LiteVideoDecider* lite_video_decider = - LiteVideoKeyedServiceFactory::GetForProfile(profile) - ->lite_video_decider(); - lite_video_decider->OnConnectionChanged( - network::mojom::ConnectionType::CONNECTION_4G); - - // Load a test page in the prerender. - const int host_id = prerender_test_helper().AddPrerender(media_url()); - content::RenderFrameHost* render_frame_host = - prerender_test_helper().GetPrerenderedMainFrameHost(host_id); - ASSERT_TRUE(render_frame_host); - histogram_tester().ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 0); - - // Activate the prerendered page. - prerender_test_helper().NavigatePrimaryPage(media_url()); - histogram_tester().ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); -} - -} // namespace
diff --git a/chrome/browser/download/android/download_manager_service.cc b/chrome/browser/download/android/download_manager_service.cc index 29e816b7..129f4dd 100644 --- a/chrome/browser/download/android/download_manager_service.cc +++ b/chrome/browser/download/android/download_manager_service.cc
@@ -840,7 +840,8 @@ base::Time(), false, std::vector<download::DownloadItem::ReceivedSlice>(), download::DownloadItemRerouteInfo(), - absl::nullopt /*download_schedule*/, nullptr)); + absl::nullopt /*download_schedule*/, download::kInvalidRange, + download::kInvalidRange, nullptr)); } void DownloadManagerService::InitializeForProfile(ProfileKey* profile_key) {
diff --git a/chrome/browser/download/android/java/res/layout/download_location_spinner_dropdown_item.xml b/chrome/browser/download/android/java/res/layout/download_location_spinner_dropdown_item.xml index 839b3d2d..0082073 100644 --- a/chrome/browser/download/android/java/res/layout/download_location_spinner_dropdown_item.xml +++ b/chrome/browser/download/android/java/res/layout/download_location_spinner_dropdown_item.xml
@@ -6,7 +6,7 @@ <!-- Note: Nested layouts are used because the styling was being overwritten, likely because of the behavior of the Android Spinner class. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:layout_width="match_parent" android:layout_height="wrap_content" >
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc index ea75cf9..49c62e72 100644 --- a/chrome/browser/download/download_browsertest.cc +++ b/chrome/browser/download/download_browsertest.cc
@@ -4978,7 +4978,8 @@ false /* transient */, std::vector<download::DownloadItem::ReceivedSlice>(), download::DownloadItemRerouteInfo(), - absl::nullopt /*download_schedule*/, nullptr /* download_entry */)); + absl::nullopt /*download_schedule*/, download::kInvalidRange, + download::kInvalidRange, nullptr /* download_entry */)); download::DownloadItem* download = coordinator->GetDownloadByGuid(guid); content::DownloadManager* manager = DownloadManagerForBrowser(browser());
diff --git a/chrome/browser/download/internal/android/BUILD.gn b/chrome/browser/download/internal/android/BUILD.gn index 68c3bce..a2ea625 100644 --- a/chrome/browser/download/internal/android/BUILD.gn +++ b/chrome/browser/download/internal/android/BUILD.gn
@@ -108,6 +108,7 @@ "//chrome/browser/ui/messages/android:java", "//chrome/browser/util:java", "//components/browser_ui/share/android:java", + "//components/browser_ui/styles/android:java", "//components/browser_ui/util/android:java", "//components/browser_ui/widget/android:java", "//components/embedder_support/android:util_java",
diff --git a/chrome/browser/download/internal/android/java/res/drawable/group_card_footer_curved_border.xml b/chrome/browser/download/internal/android/java/res/drawable/group_card_footer_curved_border.xml index b00c2fb..c47c13e0 100644 --- a/chrome/browser/download/internal/android/java/res/drawable/group_card_footer_curved_border.xml +++ b/chrome/browser/download/internal/android/java/res/drawable/group_card_footer_curved_border.xml
@@ -7,7 +7,7 @@ <item android:top="-2dp"> <shape android:shape="rectangle" > - <solid android:color="@color/default_bg_color" /> + <solid android:color="@macro/default_bg_color" /> <stroke android:width="1dp" android:color="@macro/hairline_stroke_color"/> <corners android:bottomLeftRadius="@dimen/default_rounded_corner_radius" android:bottomRightRadius="@dimen/default_rounded_corner_radius" /> </shape>
diff --git a/chrome/browser/download/internal/android/java/res/drawable/group_card_header_curved_border.xml b/chrome/browser/download/internal/android/java/res/drawable/group_card_header_curved_border.xml index c5cd341..98afa38 100644 --- a/chrome/browser/download/internal/android/java/res/drawable/group_card_header_curved_border.xml +++ b/chrome/browser/download/internal/android/java/res/drawable/group_card_header_curved_border.xml
@@ -7,7 +7,7 @@ <item android:bottom="-2dp"> <shape android:shape="rectangle" > - <solid android:color="@color/default_bg_color" /> + <solid android:color="@macro/default_bg_color" /> <stroke android:width="1dp" android:color="@macro/hairline_stroke_color"/> <corners android:topLeftRadius="@dimen/default_rounded_corner_radius" android:topRightRadius="@dimen/default_rounded_corner_radius" /> </shape>
diff --git a/chrome/browser/download/internal/android/java/res/drawable/group_card_item_border.xml b/chrome/browser/download/internal/android/java/res/drawable/group_card_item_border.xml index 5a41407..88a35f1c 100644 --- a/chrome/browser/download/internal/android/java/res/drawable/group_card_item_border.xml +++ b/chrome/browser/download/internal/android/java/res/drawable/group_card_item_border.xml
@@ -7,7 +7,7 @@ <item android:top="-2dp" android:bottom="-2dp"> <shape android:shape="rectangle" > - <solid android:color="@color/default_bg_color" /> + <solid android:color="@macro/default_bg_color" /> <stroke android:width="1dp" android:color="@macro/hairline_stroke_color"/> </shape> </item>
diff --git a/chrome/browser/download/internal/android/java/res/layout/download_manager_generic_item.xml b/chrome/browser/download/internal/android/java/res/layout/download_manager_generic_item.xml index 7283854..a4499c3d 100644 --- a/chrome/browser/download/internal/android/java/res/layout/download_manager_generic_item.xml +++ b/chrome/browser/download/internal/android/java/res/layout/download_manager_generic_item.xml
@@ -13,7 +13,7 @@ android:minHeight="64dp" android:clickable="true" android:focusable="true" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" app:columnCount="3" app:rowCount="2">
diff --git a/chrome/browser/download/internal/android/java/res/layout/download_manager_in_progress_item.xml b/chrome/browser/download/internal/android/java/res/layout/download_manager_in_progress_item.xml index 6a91051f..c0ea6f8 100644 --- a/chrome/browser/download/internal/android/java/res/layout/download_manager_in_progress_item.xml +++ b/chrome/browser/download/internal/android/java/res/layout/download_manager_in_progress_item.xml
@@ -12,7 +12,7 @@ android:minHeight="64dp" android:clickable="true" android:focusable="true" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" app:columnCount="3" app:rowCount="2">
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java index 931a247..c203a27a 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
@@ -11,7 +11,6 @@ import android.view.ViewGroup; import android.widget.FrameLayout; -import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; import org.chromium.base.DiscardableReferencePool; import org.chromium.base.ObserverList; @@ -27,6 +26,7 @@ import org.chromium.chrome.browser.download.home.toolbar.ToolbarCoordinator; import org.chromium.chrome.browser.download.internal.R; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.offline_items_collection.OfflineContentProvider; @@ -87,8 +87,7 @@ */ private void initializeView() { mMainView = new FrameLayout(mActivity); - mMainView.setBackgroundColor( - ApiCompatibilityUtils.getColor(mActivity.getResources(), R.color.default_bg_color)); + mMainView.setBackgroundColor(SemanticColorUtils.getDefaultBgColor(mActivity)); FrameLayout.LayoutParams listParams = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
diff --git a/chrome/browser/enterprise/reporting/extension_request/extension_request_report_generator.cc b/chrome/browser/enterprise/reporting/extension_request/extension_request_report_generator.cc index 8c22f06f..6d3abaa 100644 --- a/chrome/browser/enterprise/reporting/extension_request/extension_request_report_generator.cc +++ b/chrome/browser/enterprise/reporting/extension_request/extension_request_report_generator.cc
@@ -20,6 +20,7 @@ #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/pref_names.h" #include "components/enterprise/common/proto/extensions_workflow_events.pb.h" +#include "components/policy/core/common/cloud/cloud_policy_util.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" #include "extensions/common/extension_urls.h" @@ -62,6 +63,7 @@ report->set_client_type(ExtensionsWorkflowEvent::CHROME_OS_USER); #else report->set_client_type(ExtensionsWorkflowEvent::BROWSER_DEVICE); + report->set_device_name(policy::GetMachineName()); #endif // BUILDFLAG(IS_CHROMEOS_ASH) return report; }
diff --git a/chrome/browser/enterprise/reporting/extension_request/extension_request_report_generator_unittest.cc b/chrome/browser/enterprise/reporting/extension_request/extension_request_report_generator_unittest.cc index d314598..6818dde9 100644 --- a/chrome/browser/enterprise/reporting/extension_request/extension_request_report_generator_unittest.cc +++ b/chrome/browser/enterprise/reporting/extension_request/extension_request_report_generator_unittest.cc
@@ -16,6 +16,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile_manager.h" #include "components/enterprise/common/proto/extensions_workflow_events.pb.h" +#include "components/policy/core/common/cloud/cloud_policy_util.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/test/browser_task_environment.h" #include "extensions/browser/pref_names.h" @@ -105,6 +106,7 @@ #else EXPECT_EQ(ExtensionsWorkflowEvent::BROWSER_DEVICE, actual_report->client_type()); + EXPECT_EQ(policy::GetMachineName(), actual_report->device_name()); #endif // BUILDFLAG(IS_CHROMEOS_ASH) }
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc index 41d4f783..8947ebe4 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc
@@ -271,13 +271,7 @@ EXPECT_FALSE(error().empty()); } -// Flaky on Win. http://crbug.com/927218 -#if defined(OS_WIN) -#define MAYBE_Write DISABLED_Write -#else -#define MAYBE_Write Write -#endif -IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, MAYBE_Write) { +IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, Write) { FillImageFileWithPattern('i'); FillDeviceFileWithPattern(0); @@ -287,13 +281,7 @@ EXPECT_TRUE(error().empty()); } -// Flaky on Win. http://crbug.com/927218 -#if defined(OS_WIN) -#define MAYBE_WriteVerify DISABLED_WriteVerify -#else -#define MAYBE_WriteVerify WriteVerify -#endif -IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, MAYBE_WriteVerify) { +IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, WriteVerify) { FillImageFileWithPattern('m'); FillDeviceFileWithPattern(0); @@ -303,13 +291,7 @@ EXPECT_TRUE(error().empty()); } -// Flaky on Win. http://crbug.com/927218 -#if defined(OS_WIN) -#define MAYBE_WriteCancel DISABLED_WriteCancel -#else -#define MAYBE_WriteCancel WriteCancel -#endif -IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, MAYBE_WriteCancel) { +IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, WriteCancel) { FillImageFileWithPattern('a'); FillDeviceFileWithPattern(0); @@ -345,13 +327,7 @@ EXPECT_FALSE(error().empty()); } -// Flaky on Win. http://crbug.com/927218 -#if defined(OS_WIN) -#define MAYBE_Verify DISABLED_Verify -#else -#define MAYBE_Verify Verify -#endif -IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, MAYBE_Verify) { +IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, Verify) { FillImageFileWithPattern('e'); FillDeviceFileWithPattern('e'); @@ -361,13 +337,7 @@ EXPECT_TRUE(error().empty()); } -// Flaky on Win. http://crbug.com/927218 -#if defined(OS_WIN) -#define MAYBE_VerifyCancel DISABLED_VerifyCancel -#else -#define MAYBE_VerifyCancel VerifyCancel -#endif -IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, MAYBE_VerifyCancel) { +IN_PROC_BROWSER_TEST_F(ImageWriterUtilityClientTest, VerifyCancel) { FillImageFileWithPattern('s'); FillDeviceFileWithPattern('s');
diff --git a/chrome/browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc b/chrome/browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc index 68632f8d..b1ff991 100644 --- a/chrome/browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc +++ b/chrome/browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc
@@ -416,8 +416,9 @@ // Tests that corruption of a requested extension resource always disables the // extension. +// Flaky test. See crbug.com/1276043. IN_PROC_BROWSER_TEST_P(ContentVerifierHashTest, - TamperRequestedResourceKeepComputedHashes) { + DISABLED_TamperRequestedResourceKeepComputedHashes) { ASSERT_TRUE(InstallDefaultResourceExtension()); DisableExtension();
diff --git a/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotMonitor.java b/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotMonitor.java index 74286a61..7b02cd6 100644 --- a/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotMonitor.java +++ b/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotMonitor.java
@@ -12,6 +12,7 @@ import android.os.Handler; import android.provider.MediaStore; import android.provider.MediaStore.Images.Media; +import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import androidx.core.content.ContextCompat; @@ -138,6 +139,10 @@ cursor.close(); } + if (TextUtils.isEmpty(imageHeightString) || TextUtils.isEmpty(imageWidthString)) { + return false; + } + // Verify that it is in a screenshot directory. We don't check the file extension because // we already know that we have an image from the image database. This directory name does // not get localized.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 298608a..667e8e7d 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -1661,11 +1661,6 @@ "expiry_milestone": 100 }, { - "name": "enable-cros-ime-emoji-suggest-addition", - "owners": [ "myy", "essential-inputs-team@google.com" ], - "expiry_milestone": 100 - }, - { "name": "enable-cros-ime-mozc-proto", "owners": [ "essential-inputs-team@google.com" ], "expiry_milestone": 95 @@ -2718,6 +2713,11 @@ "expiry_milestone": 98 }, { + "name": "enable-tab-groups-for-tablets", + "owners": [ "skavuluru", "clank-app-team@google.com" ], + "expiry_milestone": 104 + }, + { "name": "enable-tab-groups-ui-improvements", "owners": [ "memex-team@google.com" ], "expiry_milestone": 90 @@ -4019,6 +4019,11 @@ "expiry_milestone": 100 }, { + "name": "ntp-realbox-tail-suggest", + "owners": [ "mahmadi", "mfacey" ], + "expiry_milestone": 100 + }, + { "name": "ntp-recipe-tasks-module", "owners": [ "mahmadi", "tiborg" ], "expiry_milestone": 100 @@ -4459,6 +4464,11 @@ "expiry_milestone": 105 }, { + "name": "pervasive-system-accent-color", + "owners": ["pkasting"], + "expiry_milestone": 110 + }, + { "name": "photo-picker-video-support", "owners": [ "finnur" ], "expiry_milestone": 105 @@ -4958,11 +4968,6 @@ "expiry_milestone": 101 }, { - "name": "shared-highlighting-use-blocklist", - "owners": ["tmartino"], - "expiry_milestone": 97 - }, - { "name": "shared-highlighting-v2", "owners": ["kmilka", "cheickcisse@google.com"], "expiry_milestone": 99
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 1914aa0a..0a06b7da 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1582,20 +1582,6 @@ "Enable an entry point to Google Lens to allow users to search what they " "see using their mobile camera."; -const char kLiteVideoName[] = "Enable LiteVideos"; -const char kLiteVideoDescription[] = - "Enable the LiteVideo optimization to throttle media requests to " - "reduce data usage"; - -const char kLiteVideoDownlinkBandwidthKbpsName[] = - "Lite Video: Adjust throttling downlink (in Kbps)."; -const char kLiteVideoDownlinkBandwidthKbpsDescription[] = - "Specify the throttling bandwidth to be used"; - -const char kLiteVideoForceOverrideDecisionName[] = "Force LiteVideos decision"; -const char kLiteVideoForceOverrideDecisionDescription[] = - "Force the LiteVideo decision to be allowed on every navigation."; - const char kLogJsConsoleMessagesName[] = "Log JS console messages in system logs"; const char kLogJsConsoleMessagesDescription[] = @@ -1852,18 +1838,6 @@ "Configures the maximum number of autocomplete matches displayed in the " "Omnibox UI dynamically based on the number of URL matches."; -const char kOmniboxOnDeviceHeadSuggestionsIncognitoName[] = - "Omnibox on device head suggestions (incognito only)"; -const char kOmniboxOnDeviceHeadSuggestionsIncognitoDescription[] = - "Google head non personalized search suggestions provided by a compact on " - "device model for incognito"; - -const char kOmniboxOnDeviceHeadSuggestionsNonIncognitoName[] = - "Omnibox on device head suggestions (non-incognito only)"; -const char kOmniboxOnDeviceHeadSuggestionsNonIncognitoDescription[] = - "Google head non personalized search suggestions provided by a compact on " - "device model for non-incognito"; - const char kOmniboxWebUIOmniboxPopupName[] = "WebUI Omnibox Popup"; const char kOmniboxWebUIOmniboxPopupDescription[] = "If enabled, uses WebUI to render the omnibox suggestions popup, similar " @@ -2799,14 +2773,6 @@ const char kEnableVulkanName[] = "Vulkan"; const char kEnableVulkanDescription[] = "Use vulkan as the graphics backend."; -const char kSharedHighlightingUseBlocklistName[] = - "Shared Highlighting blocklist"; -const char kSharedHighlightingUseBlocklistDescription[] = - "Uses a blocklist to disable Shared Highlighting link generation on " - "certain sites where personalized or dynamic content or other technical " - "restrictions make it unlikely that a URL can be generated and actually " - "work when shared."; - const char kSharedHighlightingV2Name[] = "Shared Highlighting 2.0"; const char kSharedHighlightingV2Description[] = "Improvements to Shared Highlighting. Including ability to reshare or " @@ -3543,6 +3509,9 @@ "#site-isolation-trial-opt-out for how to disable site isolation for " "testing."; +const char kTabGroupsForTabletsName[] = "Tab groups on tablets"; +const char kTabGroupsForTabletsDescription[] = "Enable tab groups on tablets."; + const char kThemeRefactorAndroidName[] = "Theme refactor on Android"; const char kThemeRefactorAndroidDescription[] = "Enables the theme refactoring on Android."; @@ -3748,6 +3717,10 @@ const char kNtpRealboxSuggestionAnswersDescription[] = "Shows suggestion answers in the NTP Realbox when enabled."; +const char kNtpRealboxTailSuggestName[] = "NTP Realbox Tail Suggest"; +const char kNtpRealboxTailSuggestDescription[] = + "Properly formats the tail suggestions to match the Omnibox"; + const char kEnableReaderModeName[] = "Enable Reader Mode"; const char kEnableReaderModeDescription[] = "Allows viewing of simplified web pages by selecting 'Customize and " @@ -3864,6 +3837,12 @@ "Enable/Disable the use of MediaFoundation for non-protected content " "playback on supported systems."; +const char kPervasiveSystemAccentColorName[] = "Pervasive system accent color"; +const char kPervasiveSystemAccentColorDescription[] = + "Use the Windows system accent color as the Chrome accent color, if \"Show " + "accent color on title bars and windows borders\" is toggled on in the " + "Windows system settings."; + const char kPwaUninstallInWindowsOsName[] = "Enable PWAs to register as an uninstallable app in Windows on " "installation."; @@ -4830,11 +4809,6 @@ "Enable dark mode colors for the virtual keyboard when dark mode is " "active."; -const char kImeEmojiSuggestAdditionName[] = - "Enable emoji suggestion (addition)"; -const char kImeEmojiSuggestAdditionDescription[] = - "Enable emoji suggestion as addition to the text written for native IME."; - const char kImeMozcProtoName[] = "Enable protobuf on Japanese IME"; const char kImeMozcProtoDescription[] = "Enable Japanese IME to use protobuf as interactive message format to "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 04068df..226f840 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -916,15 +916,6 @@ extern const char kLensCameraAssistedSearchName[]; extern const char kLensCameraAssistedSearchDescription[]; -extern const char kLiteVideoName[]; -extern const char kLiteVideoDescription[]; - -extern const char kLiteVideoDownlinkBandwidthKbpsName[]; -extern const char kLiteVideoDownlinkBandwidthKbpsDescription[]; - -extern const char kLiteVideoForceOverrideDecisionName[]; -extern const char kLiteVideoForceOverrideDecisionDescription[]; - extern const char kLogJsConsoleMessagesName[]; extern const char kLogJsConsoleMessagesDescription[]; @@ -1062,12 +1053,6 @@ extern const char kOmniboxDynamicMaxAutocompleteName[]; extern const char kOmniboxDynamicMaxAutocompleteDescription[]; -extern const char kOmniboxOnDeviceHeadSuggestionsIncognitoName[]; -extern const char kOmniboxOnDeviceHeadSuggestionsIncognitoDescription[]; - -extern const char kOmniboxOnDeviceHeadSuggestionsNonIncognitoName[]; -extern const char kOmniboxOnDeviceHeadSuggestionsNonIncognitoDescription[]; - extern const char kOmniboxWebUIOmniboxPopupName[]; extern const char kOmniboxWebUIOmniboxPopupDescription[]; @@ -1613,9 +1598,6 @@ extern const char kEnableVulkanName[]; extern const char kEnableVulkanDescription[]; -extern const char kSharedHighlightingUseBlocklistName[]; -extern const char kSharedHighlightingUseBlocklistDescription[]; - extern const char kSharedHighlightingV2Name[]; extern const char kSharedHighlightingV2Description[]; @@ -2036,6 +2018,9 @@ extern const char kStrictSiteIsolationName[]; extern const char kStrictSiteIsolationDescription[]; +extern const char kTabGroupsForTabletsName[]; +extern const char kTabGroupsForTabletsDescription[]; + extern const char kThemeRefactorAndroidName[]; extern const char kThemeRefactorAndroidDescription[]; @@ -2165,6 +2150,9 @@ extern const char kNtpRealboxSuggestionAnswersName[]; extern const char kNtpRealboxSuggestionAnswersDescription[]; +extern const char kNtpRealboxTailSuggestName[]; +extern const char kNtpRealboxTailSuggestDescription[]; + extern const char kEnableReaderModeName[]; extern const char kEnableReaderModeDescription[]; @@ -2222,6 +2210,9 @@ extern const char kMediaFoundationClearName[]; extern const char kMediaFoundationClearDescription[]; +extern const char kPervasiveSystemAccentColorName[]; +extern const char kPervasiveSystemAccentColorDescription[]; + extern const char kPwaUninstallInWindowsOsName[]; extern const char kPwaUninstallInWindowsOsDescription[]; @@ -2788,9 +2779,6 @@ extern const char kVirtualKeyboardDarkModeName[]; extern const char kVirtualKeyboardDarkModeDescription[]; -extern const char kImeEmojiSuggestAdditionName[]; -extern const char kImeEmojiSuggestAdditionDescription[]; - extern const char kImeMozcProtoName[]; extern const char kImeMozcProtoDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 72b2304..cf6b27d8 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -271,6 +271,7 @@ &kTabGroupsAndroid, &kTabGroupsContinuationAndroid, &kTabGroupsUiImprovementsAndroid, + &kTabGroupsForTablets, &kTabGridLayoutAndroid, &kTabReparenting, &kTabSwitcherOnReturn, @@ -746,6 +747,9 @@ const base::Feature kTabGroupsUiImprovementsAndroid{ "TabGroupsUiImprovementsAndroid", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kTabGroupsForTablets{"TabGroupsForTablets", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kTabGridLayoutAndroid{"TabGridLayoutAndroid", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 9a0283c..895d26b 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -140,6 +140,7 @@ extern const base::Feature kTabGroupsAndroid; extern const base::Feature kTabGroupsContinuationAndroid; extern const base::Feature kTabGroupsUiImprovementsAndroid; +extern const base::Feature kTabGroupsForTablets; extern const base::Feature kTabGridLayoutAndroid; extern const base::Feature kTabReparenting; extern const base::Feature kTabSwitcherOnReturn;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java index e339058..a9a25cc 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -102,6 +102,7 @@ .put(ChromeFeatureList.WEB_APK_TRAMPOLINE_ON_INITIAL_INTENT, true) .put(ChromeFeatureList.FEED_LOADING_PLACEHOLDER, false) .put(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS, false) + .put(ChromeFeatureList.TAB_GROUPS_FOR_TABLETS, false) .build(); /**
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 46960e1d..417bb18 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -505,6 +505,7 @@ public static final String TAB_GROUPS_UI_IMPROVEMENTS_ANDROID = "TabGroupsUiImprovementsAndroid"; public static final String TAB_GROUPS_CONTINUATION_ANDROID = "TabGroupsContinuationAndroid"; + public static final String TAB_GROUPS_FOR_TABLETS = "TabGroupsForTablets"; public static final String TAB_GRID_LAYOUT_ANDROID = "TabGridLayoutAndroid"; public static final String TAB_REPARENTING = "TabReparenting"; public static final String TAB_SWITCHER_ON_RETURN = "TabSwitcherOnReturn";
diff --git a/chrome/browser/lite_video/DIR_METADATA b/chrome/browser/lite_video/DIR_METADATA deleted file mode 100644 index 3c8435d..0000000 --- a/chrome/browser/lite_video/DIR_METADATA +++ /dev/null
@@ -1,3 +0,0 @@ -monorail: { - component: "Internals>Network>DataUse" -}
diff --git a/chrome/browser/lite_video/OWNERS b/chrome/browser/lite_video/OWNERS deleted file mode 100644 index 2783dea..0000000 --- a/chrome/browser/lite_video/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://components/data_reduction_proxy/OWNERS
diff --git a/chrome/browser/lite_video/lite_video_decider.cc b/chrome/browser/lite_video/lite_video_decider.cc deleted file mode 100644 index 022bed41..0000000 --- a/chrome/browser/lite_video/lite_video_decider.cc +++ /dev/null
@@ -1,391 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_decider.h" - -#include "base/callback_helpers.h" -#include "base/metrics/histogram_macros.h" -#include "base/metrics/histogram_macros_local.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_hint.h" -#include "chrome/browser/lite_video/lite_video_hint_cache.h" -#include "chrome/browser/lite_video/lite_video_switches.h" -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" -#include "chrome/browser/lite_video/lite_video_util.h" -#include "chrome/browser/profiles/profile.h" -#include "components/blocklist/opt_out_blocklist/opt_out_store.h" -#include "components/optimization_guide/content/browser/optimization_guide_decider.h" -#include "components/optimization_guide/proto/lite_video_metadata.pb.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/network_service_instance.h" -#include "content/public/browser/web_contents.h" -#include "net/nqe/effective_connection_type.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/base/page_transition_types.h" - -namespace { - -// Utility class for recording the decision of whether LiteVideos should be -// applied to a navigation and if a LiteVideoHint is available for the -// navigation. The result is recorded when it goes out of scope and its -// destructor is called. -class ScopedLiteVideoDecisionRecorder { - public: - explicit ScopedLiteVideoDecisionRecorder( - lite_video::LiteVideoBlocklistReason blocklist_reason, - bool is_mainframe) - : blocklist_reason_(blocklist_reason), - is_mainframe_(is_mainframe), - has_hint_for_host_(false) {} - ~ScopedLiteVideoDecisionRecorder() { - if (is_mainframe_) { - UMA_HISTOGRAM_ENUMERATION( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - blocklist_reason_); - } else { - UMA_HISTOGRAM_ENUMERATION( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", - blocklist_reason_); - } - UMA_HISTOGRAM_BOOLEAN("LiteVideo.CanApplyLiteVideo.HintCache.HasHint", - has_hint_for_host_); - } - void set_has_hint_for_host(bool has_hint_for_host) { - has_hint_for_host_ = has_hint_for_host; - } - - private: - lite_video::LiteVideoBlocklistReason blocklist_reason_; - bool is_mainframe_; - bool has_hint_for_host_; -}; - -bool CanApplyOnCurrentNetworkConditions( - bool is_cellular_network, - net::EffectiveConnectionType effective_connection_type) { - if (lite_video::switches::ShouldIgnoreLiteVideoNetworkConditions()) - return true; - - if (!is_cellular_network) - return false; - - return effective_connection_type >= lite_video::features::MinLiteVideoECT(); -} - -} // namespace - -namespace lite_video { - -LiteVideoDecider::LiteVideoDecider( - std::unique_ptr<blocklist::OptOutStore> opt_out_store, - base::Clock* clock, - optimization_guide::OptimizationGuideDecider* opt_guide_decider) - : hint_cache_(std::make_unique<LiteVideoHintCache>()), - opt_guide_decider_(opt_guide_decider), - cached_opt_guide_hints_(features::MaxOptimizationGuideHintCacheSize()), - permanent_host_blocklist_(features::GetLiteVideoPermanentBlocklist()) { - user_blocklist_ = std::make_unique<LiteVideoUserBlocklist>( - std::move(opt_out_store), clock, this); - - if (opt_guide_decider_) { - opt_guide_decider_->RegisterOptimizationTypes( - {optimization_guide::proto::LITE_VIDEO}); - } - - network::NetworkQualityTracker* nqe_tracker = - g_browser_process->network_quality_tracker(); - if (nqe_tracker) { - nqe_tracker->AddEffectiveConnectionTypeObserver(this); - current_effective_connection_type_ = - nqe_tracker->GetEffectiveConnectionType(); - } - - network::NetworkConnectionTracker* network_connection_tracker = - content::GetNetworkConnectionTracker(); - if (network_connection_tracker) { - network_connection_tracker->AddNetworkConnectionObserver(this); - network::mojom::ConnectionType connection_type = - network::mojom::ConnectionType::CONNECTION_UNKNOWN; - network_connection_tracker->GetConnectionType(&connection_type, - base::DoNothing()); - is_cellular_network_ = - network_connection_tracker->IsConnectionCellular(connection_type); - } -} - -LiteVideoDecider::~LiteVideoDecider() { - g_browser_process->network_quality_tracker() - ->RemoveEffectiveConnectionTypeObserver(this); - content::GetNetworkConnectionTracker()->RemoveNetworkConnectionObserver(this); -} - -void LiteVideoDecider::CanApplyLiteVideo( - content::NavigationHandle* navigation_handle, - LiteVideoHintCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - LiteVideoBlocklistReason blocklist_reason = - LiteVideoBlocklistReason::kUnknown; - if (!IsLiteVideoAllowedForUser(Profile::FromBrowserContext( - navigation_handle->GetWebContents()->GetBrowserContext()))) { - std::move(callback).Run( - absl::nullopt, blocklist_reason, - optimization_guide::OptimizationGuideDecision::kFalse); - return; - } - - if (switches::ShouldOverrideLiteVideoDecision()) { - // Return a default configured hint. - std::move(callback).Run( - LiteVideoHint(switches::GetDefaultDownlinkBandwidthKbps(), - features::LiteVideoTargetDownlinkRTTLatency(), - features::LiteVideoKilobytesToBufferBeforeThrottle(), - features::LiteVideoMaxThrottlingDelay()), - blocklist_reason, optimization_guide::OptimizationGuideDecision::kTrue); - return; - } - - if (!CanApplyOnCurrentNetworkConditions(is_cellular_network_, - current_effective_connection_type_)) { - std::move(callback).Run( - absl::nullopt, blocklist_reason, - optimization_guide::OptimizationGuideDecision::kFalse); - return; - } - - GURL url = navigation_handle->GetURL(); - - if (!url.SchemeIsHTTPOrHTTPS()) { - std::move(callback).Run( - absl::nullopt, blocklist_reason, - optimization_guide::OptimizationGuideDecision::kFalse); - return; - } - - if (navigation_handle->IsInPrerenderedMainFrame()) { - std::move(callback).Run( - absl::nullopt, blocklist_reason, - optimization_guide::OptimizationGuideDecision::kFalse); - return; - } - - const bool is_in_main_frame = navigation_handle->IsInMainFrame(); - - if (url.has_host() && IsHostPermanentlyBlockedlisted(url.host())) { - blocklist_reason = LiteVideoBlocklistReason::kHostPermanentlyBlocklisted; - ScopedLiteVideoDecisionRecorder scoped_decision_recorder(blocklist_reason, - is_in_main_frame); - std::move(callback).Run( - absl::nullopt, blocklist_reason, - optimization_guide::OptimizationGuideDecision::kFalse); - return; - } - - // Reloads and Forward-Back navigations are considered opt-outs and are added - // to the blocklist so that a host that is frequently reloaded on does not get - // LiteVideos. - bool is_reload = PageTransitionCoreTypeIs( - navigation_handle->GetPageTransition(), ui::PAGE_TRANSITION_RELOAD); - if (is_reload || features::IsLiteVideoNotAllowedForPageTransition( - navigation_handle->GetPageTransition())) { - user_blocklist_->AddNavigationToBlocklist(navigation_handle, true); - blocklist_reason = is_reload - ? LiteVideoBlocklistReason::kNavigationReload - : LiteVideoBlocklistReason::kNavigationForwardBack; - ScopedLiteVideoDecisionRecorder scoped_decision_recorder(blocklist_reason, - is_in_main_frame); - std::move(callback).Run( - absl::nullopt, blocklist_reason, - optimization_guide::OptimizationGuideDecision::kFalse); - return; - } - - blocklist_reason = - user_blocklist_->IsLiteVideoAllowedOnNavigation(navigation_handle); - - if (opt_guide_decider_) { - // This relies on the optimization guide for hints. - if (is_in_main_frame) { - opt_guide_decider_->CanApplyOptimizationAsync( - navigation_handle, optimization_guide::proto::LITE_VIDEO, - base::BindOnce(&LiteVideoDecider::OnOptimizationGuideHintAvailable, - weak_ptr_factory_.GetWeakPtr(), - navigation_handle->GetURL(), blocklist_reason, - std::move(callback))); - - UpdateBlocklists(navigation_handle, blocklist_reason); - return; - } - - // For subframes, check if a hint is cached that can be used - // immediately. Otherwise, the callback from the optimization guide - // will trigger subframes to get the supplied hint. - absl::optional<LiteVideoHint> hint; - optimization_guide::OptimizationGuideDecision opt_guide_decision = - optimization_guide::OptimizationGuideDecision::kUnknown; - GURL mainframe_url = - navigation_handle->GetWebContents()->GetLastCommittedURL(); - auto it = cached_opt_guide_hints_.Get(mainframe_url.host()); - if (it != cached_opt_guide_hints_.end()) { - hint = it->second; - // An entry with an empty hint means that the optimization guide - // decision was kFalse. - opt_guide_decision = - hint ? optimization_guide::OptimizationGuideDecision::kTrue - : optimization_guide::OptimizationGuideDecision::kFalse; - } - - UpdateBlocklists(navigation_handle, blocklist_reason); - - ScopedLiteVideoDecisionRecorder scoped_decision_recorder(blocklist_reason, - is_in_main_frame); - if (hint) - scoped_decision_recorder.set_has_hint_for_host(true); - - std::move(callback).Run(hint, blocklist_reason, opt_guide_decision); - return; - } - - absl::optional<LiteVideoHint> hint = - hint_cache_->GetHintForNavigationURL(url); - ScopedLiteVideoDecisionRecorder scoped_decision_recorder(blocklist_reason, - is_in_main_frame); - - if (hint) - scoped_decision_recorder.set_has_hint_for_host(true); - - if (blocklist_reason != LiteVideoBlocklistReason::kAllowed || !hint) { - std::move(callback).Run( - absl::nullopt, blocklist_reason, - optimization_guide::OptimizationGuideDecision::kFalse); - return; - } - - UpdateBlocklists(navigation_handle, blocklist_reason); - std::move(callback).Run(hint, blocklist_reason, - optimization_guide::OptimizationGuideDecision::kTrue); -} - -void LiteVideoDecider::UpdateBlocklists( - content::NavigationHandle* navigation_handle, - LiteVideoBlocklistReason blocklist_reason) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(navigation_handle); - if (blocklist_reason != LiteVideoBlocklistReason::kAllowed) - return; - - DCHECK(!navigation_handle->IsInPrerenderedMainFrame()); - - // The navigation was not blocklisted and may - // have the LiteVideo optimization triggered so update the blocklist. - user_blocklist_->AddNavigationToBlocklist(navigation_handle, false); - - navigation_handle->IsInMainFrame() - ? DidMediaRebuffer(navigation_handle->GetURL(), absl::nullopt, false) - : DidMediaRebuffer( - navigation_handle->GetWebContents()->GetLastCommittedURL(), - navigation_handle->GetURL(), false); -} - -void LiteVideoDecider::OnOptimizationGuideHintAvailable( - const GURL& mainframe_url, - LiteVideoBlocklistReason blocklist_reason, - LiteVideoHintCallback callback, - optimization_guide::OptimizationGuideDecision decision, - const optimization_guide::OptimizationMetadata& metadata) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(opt_guide_decider_); - - // This is only called on a mainframe navigation. - ScopedLiteVideoDecisionRecorder scoped_decision_recorder( - blocklist_reason, /*is_mainframe=*/true); - - if (decision == optimization_guide::OptimizationGuideDecision::kTrue) - scoped_decision_recorder.set_has_hint_for_host(true); - - // If the decision is false, then add an empty entry into the hint cache - // so that subframes with this mainframe host will return false. - if (decision == optimization_guide::OptimizationGuideDecision::kFalse) { - cached_opt_guide_hints_.Put(mainframe_url.host(), absl::nullopt); - UMA_HISTOGRAM_COUNTS_100("LiteVideo.LiteVideoDecider.OptGuideHintCacheSize", - cached_opt_guide_hints_.size()); - } - - if (blocklist_reason != LiteVideoBlocklistReason::kAllowed || - decision != optimization_guide::OptimizationGuideDecision::kTrue) { - std::move(callback).Run(absl::nullopt, blocklist_reason, decision); - return; - } - - LiteVideoHint hint = - LiteVideoHint(switches::GetDefaultDownlinkBandwidthKbps(), - features::LiteVideoTargetDownlinkRTTLatency(), - features::LiteVideoKilobytesToBufferBeforeThrottle(), - features::LiteVideoMaxThrottlingDelay()); - - absl::optional<optimization_guide::proto::LiteVideoMetadata> - lite_video_metadata = - metadata - .ParsedMetadata<optimization_guide::proto::LiteVideoMetadata>(); - if (lite_video_metadata && lite_video_metadata->has_lite_video_hint()) - hint = LiteVideoHint(lite_video_metadata->lite_video_hint()); - - cached_opt_guide_hints_.Put(mainframe_url.host(), hint); - UMA_HISTOGRAM_COUNTS_100("LiteVideo.LiteVideoDecider.OptGuideHintCacheSize", - cached_opt_guide_hints_.size()); - std::move(callback).Run(hint, blocklist_reason, decision); -} - -void LiteVideoDecider::OnLoadingStateChanged(bool is_loaded) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - blocklist_loaded_ = is_loaded; - if (blocklist_loaded_) - LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.UserBlocklist.BlocklistLoaded", true); -} - -void LiteVideoDecider::OnEffectiveConnectionTypeChanged( - net::EffectiveConnectionType effective_connection_type) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - current_effective_connection_type_ = effective_connection_type; -} - -void LiteVideoDecider::OnConnectionChanged( - network::mojom::ConnectionType type) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - is_cellular_network_ = - network::NetworkConnectionTracker::IsConnectionCellular(type); -} - -void LiteVideoDecider::ClearData(const base::Time& delete_begin, - const base::Time& delete_end) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (user_blocklist_) - user_blocklist_->ClearBlockList(delete_begin, delete_end); - cached_opt_guide_hints_.Clear(); -} - -void LiteVideoDecider::OnBlocklistCleared(base::Time time) { - LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.UserBlocklist.ClearBlocklist", true); -} - -bool LiteVideoDecider::IsHostPermanentlyBlockedlisted( - const std::string& host) const { - if (permanent_host_blocklist_.size() == 0) - return false; - return permanent_host_blocklist_.find(host) != - permanent_host_blocklist_.end(); -} - -void LiteVideoDecider::DidMediaRebuffer(const GURL& mainframe_url, - absl::optional<GURL> subframe_url, - bool opt_out) { - if (user_blocklist_) { - user_blocklist_->AddRebufferToBlocklist(mainframe_url, subframe_url, - opt_out); - } -} - -} // namespace lite_video
diff --git a/chrome/browser/lite_video/lite_video_decider.h b/chrome/browser/lite_video/lite_video_decider.h deleted file mode 100644 index b8aac2c..0000000 --- a/chrome/browser/lite_video/lite_video_decider.h +++ /dev/null
@@ -1,164 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_DECIDER_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_DECIDER_H_ - -#include <stdint.h> - -#include "base/containers/flat_set.h" -#include "base/containers/lru_cache.h" -#include "base/memory/raw_ptr.h" -#include "base/time/clock.h" -#include "chrome/browser/lite_video/lite_video_hint_cache.h" -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" -#include "components/blocklist/opt_out_blocklist/opt_out_blocklist_delegate.h" -#include "services/network/public/cpp/network_connection_tracker.h" -#include "services/network/public/cpp/network_quality_tracker.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "url/gurl.h" - -namespace blocklist { -class OptOutStore; -} // namespace blocklist - -namespace optimization_guide { -class OptimizationGuideDecider; -enum class OptimizationGuideDecision; -class OptimizationMetadata; -} // namespace optimization_guide - -namespace lite_video { - -using LiteVideoHintCallback = base::OnceCallback<void( - absl::optional<LiteVideoHint> hint, - LiteVideoBlocklistReason blocklist_reason, - optimization_guide::OptimizationGuideDecision opt_guide_decision)>; - -// The LiteVideoDecider makes the decision on whether LiteVideos should be -// applied to a navigation and provides the parameters to use when -// throttling media requests. -class LiteVideoDecider - : public blocklist::OptOutBlocklistDelegate, - public network::NetworkConnectionTracker::NetworkConnectionObserver, - public network::NetworkQualityTracker::EffectiveConnectionTypeObserver { - public: - LiteVideoDecider( - std::unique_ptr<blocklist::OptOutStore> opt_out_store, - base::Clock* clock, - optimization_guide::OptimizationGuideDecider* opt_guide_decider); - ~LiteVideoDecider() override; - - // Determine if the navigation can have the LiteVideo optimization applied. It - // invokes |callback| with the blocklist result and a LiteVideoHint if - // available for the |navigation_handle|. This also updates the blocklist - // based on the navigation provided and should be limited to one call per - // navigation. - void CanApplyLiteVideo(content::NavigationHandle* navigation_handle, - LiteVideoHintCallback callback); - - // Override the blocklist used by |this| for testing. - void SetUserBlocklistForTesting( - std::unique_ptr<LiteVideoUserBlocklist> user_blocklist) { - user_blocklist_ = std::move(user_blocklist); - } - - // Override the hint cache used by |this| for testing. - void SetHintCacheForTesting(std::unique_ptr<LiteVideoHintCache> hint_cache) { - hint_cache_ = std::move(hint_cache); - } - - // blocklist::OptOutBlocklistDelegate - void OnLoadingStateChanged(bool is_loaded) override; - void OnBlocklistCleared(base::Time time) override; - - // network::NetworkConnectionTracker::NetworkConnectionObserver: - void OnConnectionChanged(network::mojom::ConnectionType type) override; - - // network::NetworkQualityTracker::EffectiveConnectionTypeObserver: - void OnEffectiveConnectionTypeChanged( - net::EffectiveConnectionType type) override; - - // Purge all the user browsing data within |user_blocklist_| between - // the provided time ranges and all data within |cached_opt_guide_hints_|. - void ClearData(const base::Time& delete_begin, const base::Time& delete_end); - - // Update |user_blocklist_| that a rebuffer event consided an opt-out on the - // mainframe and subframe URLs occurred. - void DidMediaRebuffer(const GURL& mainframe_url, - absl::optional<GURL> subframe_url, - bool opt_out); - - // Set the optimization guide decider used by |this| for testing only. - void SetOptimizationGuideDeciderForTesting( - optimization_guide::OptimizationGuideDecider* opt_guide_decider) { - opt_guide_decider_ = opt_guide_decider; - } - - // Set the permanently blocked hosts used by |this| for testing only. - void SetPermanentHostBlocklistForTesting( - const base::flat_set<std::string>& permanent_host_blocklist) { - permanent_host_blocklist_ = permanent_host_blocklist; - } - - private: - // The result of the query to the optimization guide based on the - // |mainframe_url|. - void OnOptimizationGuideHintAvailable( - const GURL& mainframe_url, - LiteVideoBlocklistReason blocklist_reason, - LiteVideoHintCallback callback, - optimization_guide::OptimizationGuideDecision decision, - const optimization_guide::OptimizationMetadata& metadata); - - // Update the blocklists based on the navigation and the provided blocklist - // reason. - void UpdateBlocklists(content::NavigationHandle* navigation_handle, - LiteVideoBlocklistReason blocklist_reason); - - // Checks the owned permanent blocklist to determine if |host| - // has been blocked from having LiteVideos shown indefinitely. - bool IsHostPermanentlyBlockedlisted(const std::string& host) const; - - // The hint cache that holds LiteVideoHints that specify the parameters - // for throttling media requests for that navigation. - std::unique_ptr<LiteVideoHintCache> hint_cache_; - - // The blocklist that maintains the hosts that should not have media requests - // throttled on them due to too many opt-outs. - std::unique_ptr<LiteVideoUserBlocklist> user_blocklist_; - - // Whether the backing store used by the owned |user_blocklist_| is loaded - // and available. - bool blocklist_loaded_ = false; - - // Whether the current network connection is cellular or not. - bool is_cellular_network_ = false; - - // The current estimate of the EffectiveConnectionType. - net::EffectiveConnectionType current_effective_connection_type_ = - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; - - // The optimization guide decider to consult for remote predictions. - raw_ptr<optimization_guide::OptimizationGuideDecider> opt_guide_decider_ = - nullptr; - - // The store of hints provided by the optimization guide keyed by mainframe - // host. If the hint is empty, then the optimization guide returned kFalse. - base::HashingLRUCache<std::string, absl::optional<LiteVideoHint>> - cached_opt_guide_hints_; - - // The set of hosts that are permanently blocked from having LiteVideos - // applied on them. - base::flat_set<std::string> permanent_host_blocklist_; - - SEQUENCE_CHECKER(sequence_checker_); - - // Used to get a weak pointer to |this|. - base::WeakPtrFactory<LiteVideoDecider> weak_ptr_factory_{this}; -}; - -} // namespace lite_video - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_DECIDER_H_
diff --git a/chrome/browser/lite_video/lite_video_decider_unittest.cc b/chrome/browser/lite_video/lite_video_decider_unittest.cc deleted file mode 100644 index 950ff87..0000000 --- a/chrome/browser/lite_video/lite_video_decider_unittest.cc +++ /dev/null
@@ -1,884 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_decider.h" - -#include <map> -#include <utility> - -#include "base/bind.h" -#include "base/run_loop.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/simple_test_clock.h" -#include "base/time/clock.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_hint.h" -#include "chrome/browser/lite_video/lite_video_switches.h" -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" -#include "chrome/common/chrome_features.h" -#include "chrome/test/base/chrome_render_view_host_test_harness.h" -#include "components/blocklist/opt_out_blocklist/opt_out_blocklist.h" -#include "components/blocklist/opt_out_blocklist/opt_out_blocklist_delegate.h" -#include "components/blocklist/opt_out_blocklist/opt_out_store.h" -#include "components/optimization_guide/content/browser/optimization_guide_decider.h" -#include "components/optimization_guide/content/browser/test_optimization_guide_decider.h" -#include "components/optimization_guide/proto/lite_video_metadata.pb.h" -#include "content/public/browser/web_contents.h" -#include "content/public/test/mock_navigation_handle.h" -#include "content/public/test/test_renderer_host.h" -#include "content/public/test/web_contents_tester.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/base/page_transition_types.h" -#include "url/gurl.h" - -class TestLiteVideoUserBlocklist : public lite_video::LiteVideoUserBlocklist { - public: - TestLiteVideoUserBlocklist( - std::unique_ptr<blocklist::OptOutStore> opt_out_store, - base::Clock* clock, - blocklist::OptOutBlocklistDelegate* blocklist_delegate) - : lite_video::LiteVideoUserBlocklist(std::move(opt_out_store), - clock, - blocklist_delegate) {} - - ~TestLiteVideoUserBlocklist() override = default; - - lite_video::LiteVideoBlocklistReason IsLiteVideoAllowedOnNavigation( - content::NavigationHandle* navigation_handle) const override { - return blocklist_reason_; - } - - void set_blocklist_reason( - lite_video::LiteVideoBlocklistReason blocklist_reason) { - blocklist_reason_ = blocklist_reason; - } - - private: - lite_video::LiteVideoBlocklistReason blocklist_reason_ = - lite_video::LiteVideoBlocklistReason::kAllowed; -}; - -class TestLiteVideoHintCache : public lite_video::LiteVideoHintCache { - public: - TestLiteVideoHintCache() = default; - ~TestLiteVideoHintCache() override = default; - absl::optional<lite_video::LiteVideoHint> GetHintForNavigationURL( - const GURL& url) const override { - auto it = hint_cache_.find(url); - if (it != hint_cache_.end()) - return it->second; - return absl::nullopt; - } - - void AddHintForTesting(const GURL& url, - const lite_video::LiteVideoHint& hint) { - hint_cache_.insert(std::make_pair(url, hint)); - } - - private: - std::map<GURL, lite_video::LiteVideoHint> hint_cache_; -}; - -class TestOptimizationGuideDecider - : public optimization_guide::TestOptimizationGuideDecider { - public: - TestOptimizationGuideDecider() = default; - - TestOptimizationGuideDecider(const TestOptimizationGuideDecider&) = delete; - TestOptimizationGuideDecider& operator=(const TestOptimizationGuideDecider&) = - delete; - - ~TestOptimizationGuideDecider() override = default; - - void RegisterOptimizationTypes( - const std::vector<optimization_guide::proto::OptimizationType>& - optimization_types) override { - registered_optimization_types_ = - base::flat_set<optimization_guide::proto::OptimizationType>( - optimization_types.begin(), optimization_types.end()); - } - - // Returns the optimization types registered with the Optimization Guide - // Decider. - base::flat_set<optimization_guide::proto::OptimizationType> - registered_optimization_types() { - return registered_optimization_types_; - } - - void CanApplyOptimizationAsync( - content::NavigationHandle* navigation_handle, - optimization_guide::proto::OptimizationType optimization_type, - optimization_guide::OptimizationGuideDecisionCallback callback) override { - GURL url = navigation_handle->GetURL(); - - auto response_iter = - responses_.find(std::make_tuple(url, optimization_type)); - if (response_iter == responses_.end()) { - std::move(callback).Run( - optimization_guide::OptimizationGuideDecision::kFalse, - optimization_guide::OptimizationMetadata()); - return; - } - - auto response = response_iter->second; - std::move(callback).Run(std::get<0>(response), std::get<1>(response)); - } - - void SetResponses( - std::map<std::tuple<GURL, optimization_guide::proto::OptimizationType>, - std::tuple<optimization_guide::OptimizationGuideDecision, - optimization_guide::OptimizationMetadata>> - responses) { - responses_ = responses; - } - - private: - // The optimization types that were registered with the Optimization Guide - // Decider. - base::flat_set<optimization_guide::proto::OptimizationType> - registered_optimization_types_; - - std::map<std::tuple<GURL, optimization_guide::proto::OptimizationType>, - std::tuple<optimization_guide::OptimizationGuideDecision, - optimization_guide::OptimizationMetadata>> - responses_; -}; - -class LiteVideoDeciderTest : public ChromeRenderViewHostTestHarness { - public: - explicit LiteVideoDeciderTest(bool allow_on_forward_back = false) - : allow_on_forward_back_(allow_on_forward_back) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - ::features::kLiteVideo, - {{"allow_on_forward_back", allow_on_forward_back_ ? "true" : "false"}}); - } - - void SetUp() override { - content::RenderViewHostTestHarness::SetUp(); - optimization_guide_decider_ = - std::make_unique<TestOptimizationGuideDecider>(); - - lite_video_decider_ = std::make_unique<lite_video::LiteVideoDecider>( - nullptr, &test_clock_, nullptr); - - lite_video_decider_->OnEffectiveConnectionTypeChanged( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G); - lite_video_decider_->OnConnectionChanged( - network::mojom::ConnectionType::CONNECTION_4G); - - base::CommandLine::ForCurrentProcess()->AppendSwitch( - "enable-spdy-proxy-auth"); - } - - void UseOptimizationGuideDecider() { - optimization_guide_decider_->RegisterOptimizationTypes( - {optimization_guide::proto::LITE_VIDEO}); - lite_video_decider_->SetOptimizationGuideDeciderForTesting( - optimization_guide_decider_.get()); - } - - void DisableLiteVideo() { - scoped_feature_list_.Reset(); - scoped_feature_list_.InitAndDisableFeature({::features::kLiteVideo}); - } - - void CanApplyOnSubframeNavigation(const GURL& mainframe_url, - const GURL& subframe_url) { - // Needed so that a mainframe navigation exists. - NavigateAndCommit(mainframe_url); - content::RenderFrameHostTester* rfh_tester = - content::RenderFrameHostTester::For(main_rfh()); - content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe"); - content::MockNavigationHandle navigation_handle(subframe_url, subframe); - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, - base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - } - - void SetDurationFromTimeDelta(optimization_guide::proto::Duration* duration, - const base::TimeDelta& delta) { - if (!duration) - return; - duration->set_seconds(delta.InSeconds()); - duration->set_nanos(delta.InNanoseconds() % - base::Seconds(1).InNanoseconds()); - } - - void SeedLiteVideoHintCache(const GURL& gurl, - absl::optional<lite_video::LiteVideoHint> hint, - bool use_opt_guide) { - if (use_opt_guide) { - optimization_guide::OptimizationMetadata default_metadata; - optimization_guide::proto::LiteVideoMetadata lite_video_metadata; - if (hint) { - optimization_guide::proto::LiteVideoHint* hint_proto = - lite_video_metadata.mutable_lite_video_hint(); - hint_proto->set_target_downlink_bandwidth_kbps( - hint->target_downlink_bandwidth_kbps()); - hint_proto->set_kilobytes_to_buffer_before_throttle( - hint->kilobytes_to_buffer_before_throttle()); - SetDurationFromTimeDelta( - hint_proto->mutable_target_downlink_rtt_latency(), - hint->target_downlink_rtt_latency()); - SetDurationFromTimeDelta(hint_proto->mutable_max_throttling_delay(), - hint->max_throttling_delay()); - default_metadata.SetAnyMetadataForTesting(lite_video_metadata); - } - - std::map<std::tuple<GURL, optimization_guide::proto::OptimizationType>, - std::tuple<optimization_guide::OptimizationGuideDecision, - optimization_guide::OptimizationMetadata>> - responses = { - {std::make_tuple(gurl, optimization_guide::proto::LITE_VIDEO), - std::make_tuple( - optimization_guide::OptimizationGuideDecision::kTrue, - default_metadata)}, - }; - - optimization_guide_decider_->SetResponses(responses); - return; - } - std::unique_ptr<TestLiteVideoHintCache> hint_cache = - std::make_unique<TestLiteVideoHintCache>(); - hint_cache->AddHintForTesting(gurl, *hint); - lite_video_decider_->SetHintCacheForTesting(std::move(hint_cache)); - } - - void SetBlocklistReason(lite_video::LiteVideoBlocklistReason reason) { - std::unique_ptr<TestLiteVideoUserBlocklist> user_blocklist_ = - std::make_unique<TestLiteVideoUserBlocklist>(nullptr, &test_clock_, - lite_video_decider_.get()); - user_blocklist_->set_blocklist_reason(reason); - lite_video_decider_->SetUserBlocklistForTesting(std::move(user_blocklist_)); - } - - void SeedPermanentHostBlocklist( - const base::flat_set<std::string>& permanent_host_blocklist) { - lite_video_decider_->SetPermanentHostBlocklistForTesting( - permanent_host_blocklist); - } - - lite_video::LiteVideoDecider* lite_video_decider() { - return lite_video_decider_.get(); - } - - void OnHintAvailable( - absl::optional<lite_video::LiteVideoHint> hint, - lite_video::LiteVideoBlocklistReason blocklist_reason, - optimization_guide::OptimizationGuideDecision opt_guide_decision) { - opt_guide_decision_ = opt_guide_decision; - hint_ = hint; - blocklist_reason_ = blocklist_reason; - } - - absl::optional<lite_video::LiteVideoHint> hint() { return hint_; } - - optimization_guide::OptimizationGuideDecision opt_guide_decision() { - return opt_guide_decision_; - } - - lite_video::LiteVideoBlocklistReason blocklist_reason() { - return blocklist_reason_; - } - - void TearDown() override { content::RenderViewHostTestHarness::TearDown(); } - - void RunUntilIdle() { - task_environment()->RunUntilIdle(); - base::RunLoop().RunUntilIdle(); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - base::SimpleTestClock test_clock_; - std::unique_ptr<lite_video::LiteVideoDecider> lite_video_decider_; - lite_video::LiteVideoBlocklistReason blocklist_reason_; - absl::optional<lite_video::LiteVideoHint> hint_; - std::unique_ptr<TestOptimizationGuideDecider> optimization_guide_decider_; - optimization_guide::OptimizationGuideDecision opt_guide_decision_; - bool allow_on_forward_back_; -}; - -TEST_F(LiteVideoDeciderTest, CanApplyOnNonHTTPOrHTTPSURL) { - base::HistogramTester histogram_tester; - - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(GURL("chrome:://about")); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - - RunUntilIdle(); - EXPECT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kUnknown); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 0); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", 0); -} - -TEST_F(LiteVideoDeciderTest, CanApplyNoHintAndHostBlocklisted) { - base::HistogramTester histogram_tester; - SetBlocklistReason( - lite_video::LiteVideoBlocklistReason::kNavigationBlocklisted); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(GURL("https://NoVideo.com")); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - - RunUntilIdle(); - EXPECT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), - lite_video::LiteVideoBlocklistReason::kNavigationBlocklisted); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationBlocklisted, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", false, 1); -} - -TEST_F(LiteVideoDeciderTest, CanApplyAllowedButNoHint) { - base::HistogramTester histogram_tester; - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(GURL("https://NoVideo.com")); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - - EXPECT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", false, 1); -} - -TEST_F(LiteVideoDeciderTest, CanApplyLiteVideo) { - base::HistogramTester histogram_tester; - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - lite_video::LiteVideoHint seeded_hint( - /*target_downlink_bandwidth_kbps=*/123, - /*target_downlink_rtt_latency=*/base::Milliseconds(2500), - /*kilobytes_to_buffer_before_throttle=*/500, - /*max_throttling_delay=*/base::Milliseconds(5000)); - SeedLiteVideoHintCache(url, seeded_hint, /*use_opt_guide=*/false); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - - ASSERT_TRUE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - EXPECT_EQ(seeded_hint.target_downlink_bandwidth_kbps(), - hint()->target_downlink_bandwidth_kbps()); - EXPECT_EQ(seeded_hint.target_downlink_rtt_latency(), - hint()->target_downlink_rtt_latency()); - EXPECT_EQ(seeded_hint.kilobytes_to_buffer_before_throttle(), - hint()->kilobytes_to_buffer_before_throttle()); - EXPECT_EQ(seeded_hint.max_throttling_delay(), hint()->max_throttling_delay()); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", true, 1); -} - -class LiteVideoDeciderDisabledTest : public LiteVideoDeciderTest { - public: - LiteVideoDeciderDisabledTest() { DisableLiteVideo(); } -}; - -TEST_F(LiteVideoDeciderDisabledTest, LiteVideoDisabled) { - base::HistogramTester histogram_tester; - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - lite_video::LiteVideoHint seeded_hint( - /*target_downlink_bandwidth_kbps=*/123, - /*target_downlink_rtt_latency=*/base::Milliseconds(2500), - /*kilobytes_to_buffer_before_throttle=*/500, - /*max_throttling_delay=*/base::Milliseconds(5000)); - SeedLiteVideoHintCache(url, seeded_hint, /*use_opt_guide=*/false); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - EXPECT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kUnknown); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 0); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", 0); -} - -TEST_F(LiteVideoDeciderTest, LiteVideoCanApplyOnSubframeNavigation) { - base::HistogramTester histogram_tester; - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - lite_video::LiteVideoHint seeded_hint( - /*target_downlink_bandwidth_kbps=*/123, - /*target_downlink_rtt_latency=*/base::Milliseconds(2500), - /*kilobytes_to_buffer_before_throttle=*/500, - /*max_throttling_delay=*/base::Milliseconds(5000)); - SeedLiteVideoHintCache(url, seeded_hint, /*use_opt_guide=*/false); - - CanApplyOnSubframeNavigation(GURL("https://mainframe.com"), url); - ASSERT_TRUE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - EXPECT_EQ(seeded_hint.target_downlink_bandwidth_kbps(), - hint()->target_downlink_bandwidth_kbps()); - EXPECT_EQ(seeded_hint.target_downlink_rtt_latency(), - hint()->target_downlink_rtt_latency()); - EXPECT_EQ(seeded_hint.kilobytes_to_buffer_before_throttle(), - hint()->kilobytes_to_buffer_before_throttle()); - EXPECT_EQ(seeded_hint.max_throttling_delay(), hint()->max_throttling_delay()); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", true, 1); -} - -TEST_F(LiteVideoDeciderTest, CanApplyOnReload) { - base::HistogramTester histogram_tester; - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_RELOAD); - - lite_video::LiteVideoHint seeded_hint( - /*target_downlink_bandwidth_kbps=*/123, - /*target_downlink_rtt_latency=*/base::Milliseconds(2500), - /*kilobytes_to_buffer_before_throttle=*/500, - /*max_throttling_delay=*/base::Milliseconds(5000)); - SeedLiteVideoHintCache(url, seeded_hint, /*use_opt_guide=*/false); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - EXPECT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), - lite_video::LiteVideoBlocklistReason::kNavigationReload); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationReload, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", false, 1); -} - -TEST_F(LiteVideoDeciderTest, CanApplyOnForwardBackNavigation) { - base::HistogramTester histogram_tester; - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_FORWARD_BACK); - - lite_video::LiteVideoHint seeded_hint( - /*target_downlink_bandwidth_kbps=*/123, - /*target_downlink_rtt_latency=*/base::Milliseconds(2500), - /*kilobytes_to_buffer_before_throttle=*/500, - /*max_throttling_delay=*/base::Milliseconds(5000)); - SeedLiteVideoHintCache(url, seeded_hint, /*use_opt_guide=*/false); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - EXPECT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), - lite_video::LiteVideoBlocklistReason::kNavigationForwardBack); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationForwardBack, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", false, 1); -} - -TEST_F(LiteVideoDeciderTest, SetDefaultDownlinkBandwidthOverride) { - base::HistogramTester histogram_tester; - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - lite_video::switches::kLiteVideoDefaultDownlinkBandwidthKbps, "200"); - base::CommandLine::ForCurrentProcess()->AppendSwitch( - lite_video::switches::kLiteVideoForceOverrideDecision); - - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - - ASSERT_TRUE(hint()); - EXPECT_EQ(200, hint()->target_downlink_bandwidth_kbps()); -} - -TEST_F(LiteVideoDeciderTest, OptimizationGuide_CanApplyLiteVideo) { - base::HistogramTester histogram_tester; - UseOptimizationGuideDecider(); - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - lite_video::LiteVideoHint seeded_hint( - /*target_downlink_bandwidth_kbps=*/123, - /*target_downlink_rtt_latency=*/base::Milliseconds(2500), - /*kilobytes_to_buffer_before_throttle=*/500, - /*max_throttling_delay=*/base::Milliseconds(5000)); - SeedLiteVideoHintCache(url, seeded_hint, /*use_opt_guide=*/true); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - RunUntilIdle(); - - ASSERT_TRUE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - EXPECT_EQ(seeded_hint.target_downlink_bandwidth_kbps(), - hint()->target_downlink_bandwidth_kbps()); - EXPECT_EQ(seeded_hint.target_downlink_rtt_latency(), - hint()->target_downlink_rtt_latency()); - EXPECT_EQ(seeded_hint.kilobytes_to_buffer_before_throttle(), - hint()->kilobytes_to_buffer_before_throttle()); - EXPECT_EQ(seeded_hint.max_throttling_delay(), hint()->max_throttling_delay()); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", true, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.LiteVideoDecider.OptGuideHintCacheSize", 1, 1); -} - -TEST_F(LiteVideoDeciderTest, OptimizationGuide_NoMetadata_CanApplyLiteVideo) { - base::HistogramTester histogram_tester; - UseOptimizationGuideDecider(); - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - SeedLiteVideoHintCache(url, /*hint=*/absl::nullopt, /*use_opt_guide=*/true); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - RunUntilIdle(); - - ASSERT_TRUE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - EXPECT_EQ(lite_video::switches::GetDefaultDownlinkBandwidthKbps(), - hint()->target_downlink_bandwidth_kbps()); - EXPECT_EQ(lite_video::features::LiteVideoTargetDownlinkRTTLatency(), - hint()->target_downlink_rtt_latency()); - EXPECT_EQ(lite_video::features::LiteVideoKilobytesToBufferBeforeThrottle(), - hint()->kilobytes_to_buffer_before_throttle()); - EXPECT_EQ(lite_video::features::LiteVideoMaxThrottlingDelay(), - hint()->max_throttling_delay()); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", true, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.LiteVideoDecider.OptGuideHintCacheSize", 1, 1); -} - -TEST_F(LiteVideoDeciderTest, OptimizationGuide_CanApplyOnSubframeNavigation) { - base::HistogramTester histogram_tester; - UseOptimizationGuideDecider(); - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - GURL mainframe_url("https://mainframe.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(mainframe_url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - lite_video::LiteVideoHint seeded_hint( - /*target_downlink_bandwidth_kbps=*/123, - /*target_downlink_rtt_latency=*/base::Milliseconds(2500), - /*kilobytes_to_buffer_before_throttle=*/500, - /*max_throttling_delay=*/base::Milliseconds(5000)); - SeedLiteVideoHintCache(mainframe_url, seeded_hint, /*use_opt_guide=*/true); - - // Force a check on the mainframe, otherwise no hint will be set for the - // subframe. - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - RunUntilIdle(); - - CanApplyOnSubframeNavigation(mainframe_url, url); - RunUntilIdle(); - - ASSERT_TRUE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - EXPECT_EQ(opt_guide_decision(), - optimization_guide::OptimizationGuideDecision::kTrue); - EXPECT_EQ(seeded_hint.target_downlink_bandwidth_kbps(), - hint()->target_downlink_bandwidth_kbps()); - EXPECT_EQ(seeded_hint.target_downlink_rtt_latency(), - hint()->target_downlink_rtt_latency()); - EXPECT_EQ(seeded_hint.kilobytes_to_buffer_before_throttle(), - hint()->kilobytes_to_buffer_before_throttle()); - EXPECT_EQ(seeded_hint.max_throttling_delay(), hint()->max_throttling_delay()); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", true, 2); - histogram_tester.ExpectUniqueSample( - "LiteVideo.LiteVideoDecider.OptGuideHintCacheSize", 1, 1); -} - -TEST_F(LiteVideoDeciderTest, - OptimizationGuide_CanApplyOnSubframeNavigation_Unknown) { - base::HistogramTester histogram_tester; - UseOptimizationGuideDecider(); - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - GURL mainframe_url("https://mainframe.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(mainframe_url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - - SeedLiteVideoHintCache(mainframe_url, absl::nullopt, /*use_opt_guide=*/true); - - CanApplyOnSubframeNavigation(mainframe_url, url); - RunUntilIdle(); - - EXPECT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - EXPECT_EQ(opt_guide_decision(), - optimization_guide::OptimizationGuideDecision::kUnknown); - - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", false, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.LiteVideoDecider.OptGuideHintCacheSize", 0); -} - -TEST_F(LiteVideoDeciderTest, - OptimizationGuide_CanApplyOnSubframeNavigation_MainframeFalse) { - base::HistogramTester histogram_tester; - UseOptimizationGuideDecider(); - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL subframe_url("https://LiteVideo.com"); - GURL mainframe_url("https://mainframe.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(mainframe_url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - - SeedLiteVideoHintCache(subframe_url, absl::nullopt, /*use_opt_guide=*/true); - - // Force a check on the mainframe, otherwise no hint will be set for the - // subframe. - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - RunUntilIdle(); - ASSERT_FALSE(hint()); - EXPECT_EQ(opt_guide_decision(), - optimization_guide::OptimizationGuideDecision::kFalse); - - CanApplyOnSubframeNavigation(mainframe_url, subframe_url); - RunUntilIdle(); - - ASSERT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - EXPECT_EQ(opt_guide_decision(), - optimization_guide::OptimizationGuideDecision::kFalse); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", false, 2); - histogram_tester.ExpectUniqueSample( - "LiteVideo.LiteVideoDecider.OptGuideHintCacheSize", 1, 1); -} - -TEST_F(LiteVideoDeciderTest, OptimizationGuide_HostOnPermanentBlocklist) { - base::HistogramTester histogram_tester; - UseOptimizationGuideDecider(); - SeedPermanentHostBlocklist({"mainframe.com"}); - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL mainframe_url("https://mainframe.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(mainframe_url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - - SeedLiteVideoHintCache(mainframe_url, absl::nullopt, /*use_opt_guide=*/true); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - RunUntilIdle(); - ASSERT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), - lite_video::LiteVideoBlocklistReason::kHostPermanentlyBlocklisted); - EXPECT_EQ(opt_guide_decision(), - optimization_guide::OptimizationGuideDecision::kFalse); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kHostPermanentlyBlocklisted, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", false, 1); -} - -TEST_F(LiteVideoDeciderTest, OptimizationGuide_PermanentBlocklist_HostAllowed) { - base::HistogramTester histogram_tester; - UseOptimizationGuideDecider(); - SeedPermanentHostBlocklist({"otherhost.com"}); - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL mainframe_url("https://mainframe.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(mainframe_url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - - SeedLiteVideoHintCache(mainframe_url, absl::nullopt, /*use_opt_guide=*/true); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - RunUntilIdle(); - ASSERT_TRUE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - EXPECT_EQ(opt_guide_decision(), - optimization_guide::OptimizationGuideDecision::kTrue); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", true, 1); -} - -TEST_F(LiteVideoDeciderTest, HostOnPermanentBlocklist) { - base::HistogramTester histogram_tester; - SeedPermanentHostBlocklist({"mainframe.com"}); - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL mainframe_url("https://mainframe.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(mainframe_url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_TYPED); - - SeedLiteVideoHintCache(mainframe_url, absl::nullopt, /*use_opt_guide=*/true); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - RunUntilIdle(); - ASSERT_FALSE(hint()); - EXPECT_EQ(blocklist_reason(), - lite_video::LiteVideoBlocklistReason::kHostPermanentlyBlocklisted); - EXPECT_EQ(opt_guide_decision(), - optimization_guide::OptimizationGuideDecision::kFalse); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kHostPermanentlyBlocklisted, 1); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", false, 1); -} - -class LiteVideoDeciderAllowOnForwardBackTest : public LiteVideoDeciderTest { - public: - LiteVideoDeciderAllowOnForwardBackTest() - : LiteVideoDeciderTest(/*allow_on_forward_back=*/true) {} -}; - -TEST_F(LiteVideoDeciderAllowOnForwardBackTest, - CanApplyOnForwardBackNavigation) { - base::HistogramTester histogram_tester; - - SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); - GURL url("https://LiteVideo.com"); - content::MockNavigationHandle navigation_handle(web_contents()); - navigation_handle.set_url(url); - navigation_handle.set_page_transition(ui::PAGE_TRANSITION_FORWARD_BACK); - - lite_video::LiteVideoHint seeded_hint( - /*target_downlink_bandwidth_kbps=*/123, - /*target_downlink_rtt_latency=*/base::Milliseconds(2500), - /*kilobytes_to_buffer_before_throttle=*/500, - /*max_throttling_delay=*/base::Milliseconds(5000)); - SeedLiteVideoHintCache(url, seeded_hint, /*use_opt_guide=*/false); - - lite_video_decider()->CanApplyLiteVideo( - &navigation_handle, base::BindOnce(&LiteVideoDeciderTest::OnHintAvailable, - base::Unretained(this))); - EXPECT_TRUE(hint()); - EXPECT_EQ(blocklist_reason(), lite_video::LiteVideoBlocklistReason::kAllowed); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester.ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - histogram_tester.ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", true, 1); -}
diff --git a/chrome/browser/lite_video/lite_video_features.cc b/chrome/browser/lite_video/lite_video_features.cc deleted file mode 100644 index 5ffd131..0000000 --- a/chrome/browser/lite_video/lite_video_features.cc +++ /dev/null
@@ -1,161 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_features.h" - -#include "base/feature_list.h" -#include "base/json/json_reader.h" -#include "base/metrics/field_trial.h" -#include "base/metrics/field_trial_params.h" -#include "base/metrics/histogram_macros.h" -#include "base/values.h" -#include "chrome/common/chrome_features.h" -#include "net/nqe/effective_connection_type.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace lite_video { -namespace features { - -bool IsLiteVideoEnabled() { - return base::FeatureList::IsEnabled(::features::kLiteVideo); -} - -bool IsCoinflipExperimentEnabled() { - return base::GetFieldTrialParamByFeatureAsBool(::features::kLiteVideo, - "is_coinflip_exp", false); -} - -bool LiteVideoUseOptimizationGuide() { - return base::GetFieldTrialParamByFeatureAsBool( - ::features::kLiteVideo, "use_optimization_guide", false); -} - -absl::optional<base::Value> GetLiteVideoOriginHintsFromFieldTrial() { - if (!IsLiteVideoEnabled()) - return absl::nullopt; - - const std::string lite_video_origin_hints_json = - base::GetFieldTrialParamValueByFeature(::features::kLiteVideo, - "lite_video_origin_hints"); - if (lite_video_origin_hints_json.empty()) - return absl::nullopt; - - absl::optional<base::Value> lite_video_origin_hints = - base::JSONReader::Read(lite_video_origin_hints_json); - - UMA_HISTOGRAM_BOOLEAN( - "LiteVideo.OriginHints.ParseResult", - lite_video_origin_hints && lite_video_origin_hints->is_dict()); - - return lite_video_origin_hints; -} - -base::TimeDelta LiteVideoTargetDownlinkRTTLatency() { - return base::Milliseconds(GetFieldTrialParamByFeatureAsInt( - ::features::kLiteVideo, "target_downlink_rtt_latency_ms", 500)); -} - -int LiteVideoKilobytesToBufferBeforeThrottle() { - return GetFieldTrialParamByFeatureAsInt( - ::features::kLiteVideo, "kilobyte_to_buffer_before_throttle", 10); -} - -base::TimeDelta LiteVideoMaxThrottlingDelay() { - return base::Milliseconds(GetFieldTrialParamByFeatureAsInt( - ::features::kLiteVideo, "max_throttling_delay_ms", 5000)); -} - -size_t MaxUserBlocklistHosts() { - return GetFieldTrialParamByFeatureAsInt(::features::kLiteVideo, - "max_user_blocklist_hosts", 50); -} - -base::TimeDelta UserBlocklistHostDuration() { - return base::Days(GetFieldTrialParamByFeatureAsInt( - ::features::kLiteVideo, "user_blocklist_host_duration_in_days", 1)); -} - -int UserBlocklistOptOutHistoryThreshold() { - return GetFieldTrialParamByFeatureAsInt( - ::features::kLiteVideo, "user_blocklist_opt_out_history_threshold", 5); -} - -int LiteVideoBlocklistVersion() { - return GetFieldTrialParamByFeatureAsInt(::features::kLiteVideo, "version", 0); -} - -net::EffectiveConnectionType MinLiteVideoECT() { - return net::GetEffectiveConnectionTypeForName( - base::GetFieldTrialParamValueByFeature(::features::kLiteVideo, - "min_lite_video_ect")) - .value_or(net::EFFECTIVE_CONNECTION_TYPE_4G); -} - -int MaxOptimizationGuideHintCacheSize() { - return LiteVideoUseOptimizationGuide() - ? GetFieldTrialParamByFeatureAsInt( - ::features::kLiteVideo, "max_opt_guide_hint_cache_size", 10) - : 1; -} - -base::flat_set<std::string> GetLiteVideoPermanentBlocklist() { - if (!IsLiteVideoEnabled()) - return {}; - - const std::string permanent_host_blocklist_json = - base::GetFieldTrialParamValueByFeature(::features::kLiteVideo, - "permanent_host_blocklist"); - if (permanent_host_blocklist_json.empty()) - return {}; - - absl::optional<base::Value> permanent_host_blocklist_parsed = - base::JSONReader::Read(permanent_host_blocklist_json); - - if (!permanent_host_blocklist_parsed || - !permanent_host_blocklist_parsed->is_list()) - return {}; - - base::flat_set<std::string> permanent_host_blocklist; - permanent_host_blocklist.reserve( - permanent_host_blocklist_parsed->GetList().size()); - for (const auto& host : permanent_host_blocklist_parsed->GetList()) { - if (!host.is_string()) - continue; - permanent_host_blocklist.insert(host.GetString()); - } - return permanent_host_blocklist; -} - -bool IsLiteVideoNotAllowedForPageTransition( - ui::PageTransition page_transition) { - if (!(page_transition & ui::PAGE_TRANSITION_FORWARD_BACK)) - return false; - return !base::GetFieldTrialParamByFeatureAsBool( - ::features::kLiteVideo, "allow_on_forward_back", false); -} - -int GetMaxRebuffersPerFrame() { - return GetFieldTrialParamByFeatureAsInt(::features::kLiteVideo, - "max_rebuffers_per_frame", 1); -} - -bool DisableLiteVideoOnMediaPlayerSeek() { - return GetFieldTrialParamByFeatureAsBool( - ::features::kLiteVideo, "disable_on_media_player_seek", false); -} - -double GetThrottledVideoBytesDeflatedRatio() { - // The default throttled video bytes deflated ratio is calculated from total - // video bytes observed in Control vs Enabled field trial as: - // (Control_video_bytes - Enabled_video_bytes) / Enabled_video_bytes - // Enabled_video_bytes is the total throttled video bytes seen for the - // pageload. Note that this is slightly different from the notion of data - // savings in general which is calculated as: - // (Control_bytes - Enabled_bytes) / Control_bytes - return GetFieldTrialParamByFeatureAsDouble( - ::features::kLiteVideo, "throttled_video_bytes_deflated_ratio", 0.53); -} - -} // namespace features -} // namespace lite_video
diff --git a/chrome/browser/lite_video/lite_video_features.h b/chrome/browser/lite_video/lite_video_features.h deleted file mode 100644 index 0470aac..0000000 --- a/chrome/browser/lite_video/lite_video_features.h +++ /dev/null
@@ -1,92 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_FEATURES_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_FEATURES_H_ - -#include "base/containers/flat_set.h" -#include "base/feature_list.h" -#include "net/nqe/effective_connection_type.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/base/page_transition_types.h" - -namespace base { -class Value; -} // namespace base - -namespace lite_video { -namespace features { - -// Whether the LiteVideo feature that throttles media requests to reduce -// adaptive bitrates of media streams is enabled. Currently disabled by default. -bool IsLiteVideoEnabled(); - -// Whether the LiteVideo coinflip experiment is enabled. The coinflip -// experiment is a counterfactual experiment that decides whether LiteVideos -// should be heldback on a per navigation basis. -bool IsCoinflipExperimentEnabled(); - -// Whether LiteVideo should rely on the optimization guide for hints. -bool LiteVideoUseOptimizationGuide(); - -// Return the origins that are whitelisted for using the LiteVideo optimization -// and the parameters needed to throttle media requests for that origin. -absl::optional<base::Value> GetLiteVideoOriginHintsFromFieldTrial(); - -// The target for of the round-trip time for media requests used when -// throttling media requests. -base::TimeDelta LiteVideoTargetDownlinkRTTLatency(); - -// The number of kilobytes to be buffered before starting to throttle media -// requests. -int LiteVideoKilobytesToBufferBeforeThrottle(); - -// The maximum delay a throttle can introduce for a media request. -base::TimeDelta LiteVideoMaxThrottlingDelay(); - -// The maximum number of hosts maintained for each blocklist for the LiteVideo -// optimization. -size_t MaxUserBlocklistHosts(); - -// The duration which a host will remain blocklisted from having media requests -// throttled based on user opt-outs. -base::TimeDelta UserBlocklistHostDuration(); - -// The number of opt-out events for a host to be considered to be blocklisted. -int UserBlocklistOptOutHistoryThreshold(); - -// The current version of the LiteVideo user blocklist. -int LiteVideoBlocklistVersion(); - -// The minimum effective connection type that LiteVideos should be attempted -// on. -net::EffectiveConnectionType MinLiteVideoECT(); - -// The maximum number of hints the LiteVideoDecider should cache locally -// for reuse by subframes. -int MaxOptimizationGuideHintCacheSize(); - -// Return the set of hosts that LiteVideos are permanently blocked from -// being applied on. -base::flat_set<std::string> GetLiteVideoPermanentBlocklist(); - -// Return if the page transition is forward-back and LiteVideos -// are not allowed on those navigations. -bool IsLiteVideoNotAllowedForPageTransition(ui::PageTransition page_transition); - -// The number of media rebuffers before all throttling within the frame -// should be stopped. -int GetMaxRebuffersPerFrame(); - -bool DisableLiteVideoOnMediaPlayerSeek(); - -// Returns the ratio by how much throttled video bytes were observed to be -// deflated due to LiteVideo. This is the ratio of expected bytes saved to the -// total throttled network video bytes. -double GetThrottledVideoBytesDeflatedRatio(); - -} // namespace features -} // namespace lite_video - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_FEATURES_H_
diff --git a/chrome/browser/lite_video/lite_video_features_unittest.cc b/chrome/browser/lite_video/lite_video_features_unittest.cc deleted file mode 100644 index 087eb47..0000000 --- a/chrome/browser/lite_video/lite_video_features_unittest.cc +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_features.h" - -#include "base/test/scoped_feature_list.h" -#include "chrome/common/chrome_features.h" -#include "testing/gtest/include/gtest/gtest.h" - -TEST(LiteVideoFeaturesTest, LiteVideoDisabled) { - EXPECT_EQ(0u, lite_video::features::GetLiteVideoPermanentBlocklist().size()); -} - -TEST(LiteVideoFeaturesTest, PermanentHostBlocklistEmpty) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature({::features::kLiteVideo}); - EXPECT_EQ(0u, lite_video::features::GetLiteVideoPermanentBlocklist().size()); -} - -TEST(LiteVideoFeaturesTest, PermanentHostBlocklist_WrongType) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( - ::features::kLiteVideo, - {{"permanent_host_blocklist", "{\"litevideo.com\": 123}"}}); - EXPECT_EQ(0u, lite_video::features::GetLiteVideoPermanentBlocklist().size()); -} - -TEST(LiteVideoFeaturesTest, PermanentHostBlocklistFilled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( - ::features::kLiteVideo, {{"permanent_host_blocklist", - "[\"litevideo.com\", \"video2.com\", 12]"}}); - auto permanent_host_blocklist = - lite_video::features::GetLiteVideoPermanentBlocklist(); - EXPECT_TRUE(permanent_host_blocklist.contains("litevideo.com")); - EXPECT_TRUE(permanent_host_blocklist.contains("video2.com")); - EXPECT_FALSE(permanent_host_blocklist.contains("allowed_host.com")); - EXPECT_FALSE(permanent_host_blocklist.contains("12")); -}
diff --git a/chrome/browser/lite_video/lite_video_hint.cc b/chrome/browser/lite_video/lite_video_hint.cc deleted file mode 100644 index 65eec226..0000000 --- a/chrome/browser/lite_video/lite_video_hint.cc +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_hint.h" - -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_switches.h" - -namespace { - -base::TimeDelta GetTimeDeltaFromDuration( - const optimization_guide::proto::Duration& duration) { - base::TimeDelta delta; - if (duration.has_seconds()) - delta += base::Seconds(duration.seconds()); - if (duration.has_nanos()) - delta += base::Nanoseconds(duration.nanos()); - return delta; -} - -} // namespace - -namespace lite_video { - -LiteVideoHint::LiteVideoHint(int target_downlink_bandwidth_kbps, - base::TimeDelta target_downlink_rtt_latency, - int kilobytes_to_buffer_before_throttle, - base::TimeDelta max_throttling_delay) - : target_downlink_bandwidth_kbps_(target_downlink_bandwidth_kbps), - target_downlink_rtt_latency_(target_downlink_rtt_latency), - kilobytes_to_buffer_before_throttle_(kilobytes_to_buffer_before_throttle), - max_throttling_delay_(max_throttling_delay) {} - -LiteVideoHint::LiteVideoHint( - const optimization_guide::proto::LiteVideoHint& hint_proto) { - target_downlink_bandwidth_kbps_ = - hint_proto.has_target_downlink_bandwidth_kbps() - ? hint_proto.target_downlink_bandwidth_kbps() - : switches::GetDefaultDownlinkBandwidthKbps(); - target_downlink_rtt_latency_ = - hint_proto.has_target_downlink_rtt_latency() - ? GetTimeDeltaFromDuration(hint_proto.target_downlink_rtt_latency()) - : features::LiteVideoTargetDownlinkRTTLatency(); - kilobytes_to_buffer_before_throttle_ = - hint_proto.has_kilobytes_to_buffer_before_throttle() - ? hint_proto.kilobytes_to_buffer_before_throttle() - : features::LiteVideoKilobytesToBufferBeforeThrottle(); - max_throttling_delay_ = - hint_proto.has_max_throttling_delay() - ? GetTimeDeltaFromDuration(hint_proto.max_throttling_delay()) - : features::LiteVideoMaxThrottlingDelay(); -} -} // namespace lite_video
diff --git a/chrome/browser/lite_video/lite_video_hint.h b/chrome/browser/lite_video/lite_video_hint.h deleted file mode 100644 index c7e6afb4..0000000 --- a/chrome/browser/lite_video/lite_video_hint.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_HINT_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_HINT_H_ - -#include <stdint.h> - -#include "base/time/time.h" -#include "components/optimization_guide/proto/lite_video_metadata.pb.h" - -namespace lite_video { - -class LiteVideoHint { - public: - LiteVideoHint(int target_downlink_bandwidth_kbps, - base::TimeDelta target_downlink_rtt_latency, - int kilobytes_to_buffer_before_throttle, - base::TimeDelta max_throttling_delay); - // This uses default values for any empty fields in |lite_video_hint|. - explicit LiteVideoHint( - const optimization_guide::proto::LiteVideoHint& lite_video_hint); - ~LiteVideoHint() = default; - - int target_downlink_bandwidth_kbps() const { - return target_downlink_bandwidth_kbps_; - } - - base::TimeDelta target_downlink_rtt_latency() const { - return target_downlink_rtt_latency_; - } - - int kilobytes_to_buffer_before_throttle() const { - return kilobytes_to_buffer_before_throttle_; - } - - base::TimeDelta max_throttling_delay() const { return max_throttling_delay_; } - - private: - int target_downlink_bandwidth_kbps_; - base::TimeDelta target_downlink_rtt_latency_; - int kilobytes_to_buffer_before_throttle_; - base::TimeDelta max_throttling_delay_; -}; - -} // namespace lite_video - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_HINT_H_
diff --git a/chrome/browser/lite_video/lite_video_hint_cache.cc b/chrome/browser/lite_video/lite_video_hint_cache.cc deleted file mode 100644 index 9b3531d..0000000 --- a/chrome/browser/lite_video/lite_video_hint_cache.cc +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_hint_cache.h" - -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_hint.h" - -namespace lite_video { - -LiteVideoHintCache::LiteVideoHintCache() - : origin_hints_(features::GetLiteVideoOriginHintsFromFieldTrial()) {} - -LiteVideoHintCache::~LiteVideoHintCache() = default; - -absl::optional<LiteVideoHint> LiteVideoHintCache::GetHintForNavigationURL( - const GURL& url) const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!origin_hints_ || !origin_hints_->is_dict()) - return absl::nullopt; - - absl::optional<int> target_downlink_bandwidth_kbps = - origin_hints_->FindIntKey(url.host()); - - if (!target_downlink_bandwidth_kbps) - return absl::nullopt; - - return LiteVideoHint(*target_downlink_bandwidth_kbps, - features::LiteVideoTargetDownlinkRTTLatency(), - features::LiteVideoKilobytesToBufferBeforeThrottle(), - features::LiteVideoMaxThrottlingDelay()); -} - -} // namespace lite_video
diff --git a/chrome/browser/lite_video/lite_video_hint_cache.h b/chrome/browser/lite_video/lite_video_hint_cache.h deleted file mode 100644 index 2386e69..0000000 --- a/chrome/browser/lite_video/lite_video_hint_cache.h +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_HINT_CACHE_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_HINT_CACHE_H_ - -#include <stdint.h> - -#include "base/sequence_checker.h" -#include "base/values.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "url/gurl.h" - -namespace lite_video { - -class LiteVideoHint; - -// The LiteVideoHintCache holds the necessary information, keyed by origin, -// needed to configure throttling performed by the LiteVideo optimization. -class LiteVideoHintCache { - public: - LiteVideoHintCache(); - virtual ~LiteVideoHintCache(); - - // Returns a LiteVideoHint if one exists for the navigation URL. - // Virtual for testing. - virtual absl::optional<LiteVideoHint> GetHintForNavigationURL( - const GURL& url) const; - - private: - // The set of hints, keyed by origin, available to the hint cache. - const absl::optional<base::Value> origin_hints_; - - SEQUENCE_CHECKER(sequence_checker_); -}; - -} // namespace lite_video - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_HINT_CACHE_H_
diff --git a/chrome/browser/lite_video/lite_video_hint_cache_unittest.cc b/chrome/browser/lite_video/lite_video_hint_cache_unittest.cc deleted file mode 100644 index 325a492..0000000 --- a/chrome/browser/lite_video/lite_video_hint_cache_unittest.cc +++ /dev/null
@@ -1,95 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_hint_cache.h" - -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_hint.h" -#include "chrome/common/chrome_features.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" - -class LiteVideoHintCacheTest : public testing::Test { - public: - LiteVideoHintCacheTest() = default; - ~LiteVideoHintCacheTest() override = default; - - void SetUp() override { ConfigHintCacheWithParams({}); } - - void ConfigHintCacheWithParams( - const std::map<std::string, std::string>& params) { - scoped_feature_list_.Reset(); - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kLiteVideo, params); - hint_cache_ = std::make_unique<lite_video::LiteVideoHintCache>(); - } - - void DisableLiteVideo() { - scoped_feature_list_.Reset(); - scoped_feature_list_.InitWithFeatures({}, {features::kLiteVideo}); - } - - lite_video::LiteVideoHintCache* hint_cache() { return hint_cache_.get(); } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - std::unique_ptr<lite_video::LiteVideoHintCache> hint_cache_; -}; - -TEST_F(LiteVideoHintCacheTest, ValidHintAvailable) { - base::HistogramTester histogram_tester; - GURL url("https://LiteVideo.com"); - ConfigHintCacheWithParams( - {{"lite_video_origin_hints", "{\"litevideo.com\": 123}"}}); - absl::optional<lite_video::LiteVideoHint> hint = - hint_cache()->GetHintForNavigationURL(url); - ASSERT_TRUE(hint); - EXPECT_EQ(123, hint->target_downlink_bandwidth_kbps()); - EXPECT_EQ(lite_video::features::LiteVideoKilobytesToBufferBeforeThrottle(), - hint->kilobytes_to_buffer_before_throttle()); - EXPECT_EQ(lite_video::features::LiteVideoTargetDownlinkRTTLatency(), - hint->target_downlink_rtt_latency()); - histogram_tester.ExpectUniqueSample("LiteVideo.OriginHints.ParseResult", true, - 1); -} - -TEST_F(LiteVideoHintCacheTest, NoHintAvailableForURL) { - base::HistogramTester histogram_tester; - GURL url("https://NoVideo.com"); - ConfigHintCacheWithParams( - {{"lite_video_origin_hints", "{\"litevideo.com\": 123}"}}); - EXPECT_FALSE(hint_cache()->GetHintForNavigationURL(url)); - histogram_tester.ExpectUniqueSample("LiteVideo.OriginHints.ParseResult", true, - 1); -} - -TEST_F(LiteVideoHintCacheTest, NoHintInvalidJSON_InvalidTargetBandwidth) { - base::HistogramTester histogram_tester; - GURL url("https://LiteVideo.com"); - ConfigHintCacheWithParams( - {{"lite_video_origin_hints", "{\"litevideo.com\": 123f}"}}); - EXPECT_FALSE(hint_cache()->GetHintForNavigationURL(url)); - histogram_tester.ExpectUniqueSample("LiteVideo.OriginHints.ParseResult", - false, 1); -} - -TEST_F(LiteVideoHintCacheTest, NoHintInvalidJSON_ParseError) { - base::HistogramTester histogram_tester; - GURL url("https://LiteVideo.com"); - ConfigHintCacheWithParams( - {{"lite_video_origin_hints", "{\"litevideo.com\" 123f}"}}); - EXPECT_FALSE(hint_cache()->GetHintForNavigationURL(url)); - histogram_tester.ExpectUniqueSample("LiteVideo.OriginHints.ParseResult", - false, 1); -} - -TEST_F(LiteVideoHintCacheTest, LiteVideoDisabled) { - base::HistogramTester histogram_tester; - DisableLiteVideo(); - GURL url("https://LiteVideo.com"); - EXPECT_FALSE(hint_cache()->GetHintForNavigationURL(url)); - histogram_tester.ExpectTotalCount("LiteVideo.OriginHints.ParseResult", 0); -}
diff --git a/chrome/browser/lite_video/lite_video_hint_unittest.cc b/chrome/browser/lite_video/lite_video_hint_unittest.cc deleted file mode 100644 index 8613a09..0000000 --- a/chrome/browser/lite_video/lite_video_hint_unittest.cc +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_hint.h" - -#include "base/time/time.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_switches.h" -#include "components/optimization_guide/proto/lite_video_metadata.pb.h" -#include "testing/gtest/include/gtest/gtest.h" - -void SetDurationFromTimeDelta(optimization_guide::proto::Duration* duration, - const base::TimeDelta& delta) { - if (!duration) - return; - duration->set_seconds(delta.InSeconds()); - duration->set_nanos(delta.InNanoseconds() % base::Seconds(1).InNanoseconds()); -} - -TEST(LiteVideoHintTest, OptGuideMetadataHint) { - optimization_guide::proto::LiteVideoHint hint_proto; - base::TimeDelta throttle_delay = base::Seconds(5) + base::Nanoseconds(5); - hint_proto.set_target_downlink_bandwidth_kbps(100); - hint_proto.set_kilobytes_to_buffer_before_throttle(10); - SetDurationFromTimeDelta(hint_proto.mutable_target_downlink_rtt_latency(), - base::Seconds(5)); - SetDurationFromTimeDelta(hint_proto.mutable_max_throttling_delay(), - throttle_delay); - lite_video::LiteVideoHint hint(hint_proto); - EXPECT_EQ(hint.target_downlink_bandwidth_kbps(), 100); - EXPECT_EQ(hint.kilobytes_to_buffer_before_throttle(), 10); - EXPECT_EQ(hint.target_downlink_rtt_latency(), base::Seconds(5)); - EXPECT_EQ(hint.max_throttling_delay(), throttle_delay); -} - -TEST(LiteVideoHintTest, OptGuideMetadataHint_MissingFields) { - optimization_guide::proto::LiteVideoHint hint_proto; - - lite_video::LiteVideoHint hint(hint_proto); - EXPECT_EQ(hint.target_downlink_bandwidth_kbps(), - lite_video::switches::GetDefaultDownlinkBandwidthKbps()); - EXPECT_EQ(hint.kilobytes_to_buffer_before_throttle(), - lite_video::features::LiteVideoKilobytesToBufferBeforeThrottle()); - EXPECT_EQ(hint.target_downlink_rtt_latency(), - lite_video::features::LiteVideoTargetDownlinkRTTLatency()); - EXPECT_EQ(hint.max_throttling_delay(), - lite_video::features::LiteVideoMaxThrottlingDelay()); -}
diff --git a/chrome/browser/lite_video/lite_video_keyed_service.cc b/chrome/browser/lite_video/lite_video_keyed_service.cc deleted file mode 100644 index 4145f9ea..0000000 --- a/chrome/browser/lite_video/lite_video_keyed_service.cc +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_keyed_service.h" - -#include "base/files/file_path.h" -#include "base/metrics/histogram_macros.h" -#include "base/task/sequenced_task_runner.h" -#include "base/task/thread_pool.h" -#include "base/time/default_clock.h" -#include "chrome/browser/lite_video/lite_video_decider.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" -#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "components/blocklist/opt_out_blocklist/sql/opt_out_store_sql.h" -#include "components/optimization_guide/content/browser/optimization_guide_decider.h" -#include "content/public/browser/browser_context.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" - -constexpr base::FilePath::CharType kLiteVideoOptOutDBFilename[] = - FILE_PATH_LITERAL("lite_video_opt_out.db"); - -LiteVideoKeyedService::LiteVideoKeyedService( - content::BrowserContext* browser_context) - : browser_context_(browser_context) {} - -LiteVideoKeyedService::~LiteVideoKeyedService() = default; - -void LiteVideoKeyedService::Initialize(const base::FilePath& profile_path) { - if (!lite_video::features::IsLiteVideoEnabled()) - return; - - std::unique_ptr<blocklist::OptOutStoreSQL> opt_out_store; - // Get the background thread to run SQLite on. - scoped_refptr<base::SequencedTaskRunner> background_task_runner = - base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT}); - - opt_out_store = std::make_unique<blocklist::OptOutStoreSQL>( - content::GetUIThreadTaskRunner({}), background_task_runner, - profile_path.Append(kLiteVideoOptOutDBFilename)); - - optimization_guide::OptimizationGuideDecider* opt_guide_decider = nullptr; - if (lite_video::features::LiteVideoUseOptimizationGuide()) { - opt_guide_decider = OptimizationGuideKeyedServiceFactory::GetForProfile( - Profile::FromBrowserContext(browser_context_)); - } - - decider_ = std::make_unique<lite_video::LiteVideoDecider>( - std::move(opt_out_store), base::DefaultClock::GetInstance(), - opt_guide_decider); -} - -void LiteVideoKeyedService::ClearData(const base::Time& delete_begin, - const base::Time& delete_end) { - if (decider_) - decider_->ClearData(delete_begin, delete_end); -}
diff --git a/chrome/browser/lite_video/lite_video_keyed_service.h b/chrome/browser/lite_video/lite_video_keyed_service.h deleted file mode 100644 index 01687cf..0000000 --- a/chrome/browser/lite_video/lite_video_keyed_service.h +++ /dev/null
@@ -1,52 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_KEYED_SERVICE_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_KEYED_SERVICE_H_ - -#include "base/memory/raw_ptr.h" -#include "base/time/time.h" -#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" -#include "chrome/browser/lite_video/lite_video_decider.h" -#include "components/keyed_service/core/keyed_service.h" - -namespace base { -class FilePath; -} // namespace base - -namespace content { -class BrowserContext; -} // namespace content - -namespace lite_video { -class LiteVideoDecider; -} // namespace lite_video - -// Keyed service than can be used to receive requests for enabling LiteVideos on -// current navigations. -class LiteVideoKeyedService : public KeyedService { - public: - explicit LiteVideoKeyedService(content::BrowserContext* browser_context); - ~LiteVideoKeyedService() override; - - // Initializes the service. |profile_path| is the path to user data on disk. - void Initialize(const base::FilePath& profile_path); - - lite_video::LiteVideoDecider* lite_video_decider() { return decider_.get(); } - - private: - friend class ChromeBrowsingDataRemoverDelegate; - - // Clears data specific to the user between the provided times. - void ClearData(const base::Time& delete_begin, const base::Time& delete_end); - - // The decider owned by this keyed service capable of determining whether - // to apply the LiteVideo optimization to a navigation. - std::unique_ptr<lite_video::LiteVideoDecider> decider_; - - // Guaranteed to outlive |this|. - raw_ptr<content::BrowserContext> browser_context_; -}; - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_KEYED_SERVICE_H_
diff --git a/chrome/browser/lite_video/lite_video_keyed_service_browsertest.cc b/chrome/browser/lite_video/lite_video_keyed_service_browsertest.cc deleted file mode 100644 index f78b858..0000000 --- a/chrome/browser/lite_video/lite_video_keyed_service_browsertest.cc +++ /dev/null
@@ -1,965 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_keyed_service.h" - -#include "base/command_line.h" -#include "base/run_loop.h" -#include "base/task/thread_pool/thread_pool_instance.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "build/build_config.h" -#include "build/chromeos_buildflags.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_hint.h" -#include "chrome/browser/lite_video/lite_video_keyed_service_factory.h" -#include "chrome/browser/lite_video/lite_video_observer.h" -#include "chrome/browser/lite_video/lite_video_switches.h" -#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" -#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/common/chrome_features.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "chrome/test/base/ui_test_utils.h" -#include "components/metrics/content/subprocess_metrics_provider.h" -#include "components/optimization_guide/content/browser/optimization_guide_decider.h" -#include "components/optimization_guide/core/optimization_guide_features.h" -#include "components/optimization_guide/proto/hints.pb.h" -#include "components/optimization_guide/proto/lite_video_metadata.pb.h" -#include "components/ukm/test_ukm_recorder.h" -#include "content/public/browser/web_contents.h" -#include "content/public/test/browser_test.h" -#include "content/public/test/browser_test_utils.h" -#include "content/public/test/network_connection_change_simulator.h" -#include "content/public/test/prerender_test_util.h" -#include "net/dns/mock_host_resolver.h" -#include "net/nqe/effective_connection_type.h" -#include "services/metrics/public/cpp/ukm_builders.h" -#include "services/metrics/public/cpp/ukm_source.h" -#include "services/network/public/mojom/network_change_manager.mojom-shared.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/page_transition_types.h" -#include "url/gurl.h" - -namespace { - -// Fetch and calculate the total number of samples from all the bins for -// |histogram_name|. Note: from some browertests run, there might be two -// profiles created, and this will return the total sample count across -// profiles. -int GetTotalHistogramSamples(const base::HistogramTester& histogram_tester, - const std::string& histogram_name) { - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples(histogram_name); - int total = 0; - for (const auto& bucket : buckets) - total += bucket.count; - - return total; -} - -// Retries fetching |histogram_name| until it contains at least |count| samples. -int RetryForHistogramUntilCountReached( - const base::HistogramTester& histogram_tester, - const std::string& histogram_name, - int count) { - int total = 0; - while (true) { - base::ThreadPoolInstance::Get()->FlushForTesting(); - total = GetTotalHistogramSamples(histogram_tester, histogram_name); - if (total >= count) - return total; - content::FetchHistogramsFromChildProcesses(); - metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); - base::RunLoop().RunUntilIdle(); - } -} - -} // namespace - -class LiteVideoKeyedServiceDisabledBrowserTest : public InProcessBrowserTest { - public: - LiteVideoKeyedServiceDisabledBrowserTest() { - scoped_feature_list_.InitAndDisableFeature({::features::kLiteVideo}); - } - ~LiteVideoKeyedServiceDisabledBrowserTest() override = default; - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(LiteVideoKeyedServiceDisabledBrowserTest, - KeyedServiceEnabledButLiteVideoDisabled) { - EXPECT_EQ(nullptr, - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); -} - -class LiteVideoDataSaverDisabledBrowserTest : public InProcessBrowserTest { - public: - LiteVideoDataSaverDisabledBrowserTest() { - scoped_feature_list_.InitAndEnableFeature(::features::kLiteVideo); - } - ~LiteVideoDataSaverDisabledBrowserTest() override = default; - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(LiteVideoDataSaverDisabledBrowserTest, - LiteVideoEnabled_DataSaverOff) { - EXPECT_EQ(nullptr, - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); -} - -class LiteVideoKeyedServiceBrowserTest - : public LiteVideoKeyedServiceDisabledBrowserTest, - public ::testing::WithParamInterface<bool> { - public: - LiteVideoKeyedServiceBrowserTest() : use_opt_guide_(GetParam()) {} - ~LiteVideoKeyedServiceBrowserTest() override = default; - - void SetUp() override { - if (use_opt_guide_) { - scoped_feature_list_.InitWithFeaturesAndParameters( - {{::features::kLiteVideo, - {{"use_optimization_guide", "true"}, - {"permanent_host_blocklist", "[\"blockedhost.com\"]"}, - {"user_blocklist_opt_out_history_threshold", "1"}}}, - {optimization_guide::features::kOptimizationHints, {}}}, - /*disabled_features=*/{}); - } else { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - {::features::kLiteVideo}, - {{"lite_video_origin_hints", "{\"litevideo.com\": 123}"}, - {"permanent_host_blocklist", "[\"blockedhost.com\"]"}, - {"user_blocklist_opt_out_history_threshold", "1"}}); - } - SetUpHTTPSServer(); - InProcessBrowserTest::SetUp(); - } - - void SetUpOnMainThread() override { - content::NetworkConnectionChangeSimulator().SetConnectionType( - network::mojom::ConnectionType::CONNECTION_4G); - SetEffectiveConnectionType( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G); - if (use_opt_guide_) - SeedOptGuideLiteVideoHints(GURL("https://litevideo.com")); - InProcessBrowserTest::SetUpOnMainThread(); - } - - void SetUpCommandLine(base::CommandLine* cmd) override { - cmd->AppendSwitch("enable-spdy-proxy-auth"); - cmd->AppendSwitch(lite_video::switches::kLiteVideoIgnoreNetworkConditions); - } - - void SetUpHTTPSServer() { - https_server_ = std::make_unique<net::EmbeddedTestServer>( - net::EmbeddedTestServer::TYPE_HTTPS); - https_server_->ServeFilesFromSourceDirectory("chrome/test/data/previews"); - ASSERT_TRUE(https_server_->Start()); - - https_url_ = https_server_->GetURL("/iframe_blank.html"); - ASSERT_TRUE(https_url().SchemeIs(url::kHttpsScheme)); - } - - // Sets up public image URL hint data. - void SeedOptGuideLiteVideoHints(const GURL& url) { - ASSERT_TRUE(use_opt_guide_); - auto* optimization_guide_decider = - OptimizationGuideKeyedServiceFactory::GetForProfile( - browser()->profile()); - optimization_guide::OptimizationMetadata optimization_metadata; - optimization_guide::proto::LiteVideoMetadata metadata; - optimization_metadata.SetAnyMetadataForTesting(metadata); - optimization_guide_decider->AddHintForTesting( - url, optimization_guide::proto::LITE_VIDEO, optimization_metadata); - } - - // Sets the effective connection type that the Network Quality Tracker will - // report. - void SetEffectiveConnectionType( - net::EffectiveConnectionType effective_connection_type) { - g_browser_process->network_quality_tracker() - ->ReportEffectiveConnectionTypeForTesting(effective_connection_type); - } - - lite_video::LiteVideoDecider* lite_video_decider() { - return LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile()) - ->lite_video_decider(); - } - - void WaitForBlocklistToBeLoaded() { - EXPECT_GT( - RetryForHistogramUntilCountReached( - histogram_tester_, "LiteVideo.UserBlocklist.BlocklistLoaded", 1), - 0); - } - - const base::HistogramTester* histogram_tester() { return &histogram_tester_; } - - GURL https_url() { return https_url_; } - - bool IsUsingOptGuide() { return use_opt_guide_; } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - std::unique_ptr<net::EmbeddedTestServer> https_server_; - GURL https_url_; - base::HistogramTester histogram_tester_; - const bool use_opt_guide_ = false; -}; - -INSTANTIATE_TEST_SUITE_P(UsingOptGuide, - LiteVideoKeyedServiceBrowserTest, - ::testing::Bool(), - ::testing::PrintToStringParamName()); - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - LiteVideoEnabledWithKeyedService) { - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); -} - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - LiteVideoCanApplyLiteVideo_UnsupportedScheme) { - WaitForBlocklistToBeLoaded(); - ukm::TestAutoSetUkmRecorder ukm_recorder; - - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - // Navigate metrics get recorded. - ASSERT_TRUE( - ui_test_utils::NavigateToURL(browser(), GURL("chrome://testserver.com"))); - - // Close the tab to flush any UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - histogram_tester()->ExpectTotalCount("LiteVideo.Navigation.HasHint", 0); - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - EXPECT_EQ(0u, entries.size()); -} - -// Fails occasionally on ChromeOS. http://crbug.com/1102563 -#if BUILDFLAG(IS_CHROMEOS_ASH) -#define MAYBE_LiteVideoCanApplyLiteVideo_NoHintForHost \ - DISABLED_LiteVideoCanApplyLiteVideo_NoHintForHost -#else -#define MAYBE_LiteVideoCanApplyLiteVideo_NoHintForHost \ - LiteVideoCanApplyLiteVideo_NoHintForHost -#endif -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - MAYBE_LiteVideoCanApplyLiteVideo_NoHintForHost) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - SetEffectiveConnectionType( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G); - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - GURL navigation_url("https://testserver.com"); - // Navigate metrics get recorded. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), navigation_url)); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 1), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 1); - histogram_tester()->ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester()->ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, navigation_url); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kNotAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); -} - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - LiteVideoCanApplyLiteVideo_HasHint) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - SetEffectiveConnectionType( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G); - - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - GURL navigation_url("https://litevideo.com"); - - // Navigate metrics get recorded. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), navigation_url)); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.HintAgent.HasHint", 1), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", true, - 1); - histogram_tester()->ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, - 1); - histogram_tester()->ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, navigation_url); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); -} - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - LiteVideoCanApplyLiteVideo_Reload) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - // Navigate metrics get recorded. - GURL url("https://testserver.com"); - NavigateParams params(browser(), url, ui::PAGE_TRANSITION_RELOAD); - ui_test_utils::NavigateToURL(¶ms); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 1), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 1); - histogram_tester()->ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester()->ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationReload, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - // Navigate to confirm that the host is blocklisted due to a reload. This - // happens after one such navigation due to overriding the blocklist - // parameters for testing. - NavigateParams params_blocklisted(browser(), url, ui::PAGE_TRANSITION_TYPED); - ui_test_utils::NavigateToURL(¶ms_blocklisted); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 2), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 2); - histogram_tester()->ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester()->ExpectBucketCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationBlocklisted, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(2u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, url); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kNotAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>( - lite_video::LiteVideoBlocklistReason::kNavigationReload)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); - - entry = entries[1]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, url); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kNotAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>( - lite_video::LiteVideoBlocklistReason::kNavigationBlocklisted)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); -} - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - LiteVideoCanApplyLiteVideo_ForwardBack) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - // Navigate metrics get recorded. - GURL url("https://testserver.com"); - NavigateParams params(browser(), url, ui::PAGE_TRANSITION_FORWARD_BACK); - ui_test_utils::NavigateToURL(¶ms); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 1), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 1); - histogram_tester()->ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester()->ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationForwardBack, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - // Navigate to confirm that the host is blocklisted due to the Forward-Back - // navigation. This happens after one such navigation due to overriding the - // blocklist parameters for testing. - NavigateParams params_blocklisted(browser(), url, ui::PAGE_TRANSITION_TYPED); - ui_test_utils::NavigateToURL(¶ms_blocklisted); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 2), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 2); - histogram_tester()->ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester()->ExpectBucketCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationBlocklisted, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(2u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, url); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kNotAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>( - lite_video::LiteVideoBlocklistReason::kNavigationForwardBack)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); - - entry = entries[1]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, url); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kNotAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>( - lite_video::LiteVideoBlocklistReason::kNavigationBlocklisted)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); -} - -#if defined(OS_MAC) -// Flaky on Mac, and in any case the feature under test is not used on Mac: -// https://crbug.com/1172472 -#define MAYBE_MultipleNavigationsNotBlocklisted \ - DISABLED_MultipleNavigationsNotBlocklisted -#else -#define MAYBE_MultipleNavigationsNotBlocklisted \ - MultipleNavigationsNotBlocklisted -#endif - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - MAYBE_MultipleNavigationsNotBlocklisted) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - GURL url("https://litevideo.com"); - - // Navigate metrics get recorded. - NavigateParams params(browser(), url, ui::PAGE_TRANSITION_TYPED); - ui_test_utils::NavigateToURL(¶ms); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.HintAgent.HasHint", 1), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", true, - 1); - histogram_tester()->ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, - 1); - histogram_tester()->ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - // Navigate again to ensure that it was not blocklisted. - ui_test_utils::NavigateToURL(¶ms); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.HintAgent.HasHint", 2), - 0); - histogram_tester()->ExpectBucketCount("LiteVideo.Navigation.HasHint", true, - 2); - histogram_tester()->ExpectBucketCount("LiteVideo.HintAgent.HasHint", true, 2); - histogram_tester()->ExpectBucketCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 2); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(2u, entries.size()); - for (auto* entry : entries) { - ukm_recorder.ExpectEntrySourceHasUrl(entry, url); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); - } -} - -// This test fails on Windows because of the backing store for the blocklist. -// LiteVideos is an Android only feature so disabling the test permananently -// for Windows. -#if defined(OS_WIN) -#define DISABLE_ON_WIN(x) DISABLED_##x -#else -#define DISABLE_ON_WIN(x) x -#endif - -IN_PROC_BROWSER_TEST_P( - LiteVideoKeyedServiceBrowserTest, - DISABLE_ON_WIN(UserBlocklistClearedOnBrowserHistoryClear)) { - WaitForBlocklistToBeLoaded(); - content::NetworkConnectionChangeSimulator().SetConnectionType( - network::mojom::ConnectionType::CONNECTION_4G); - g_browser_process->network_quality_tracker() - ->ReportEffectiveConnectionTypeForTesting( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - // Navigate metrics get recorded. - GURL url("https://litevideo.com"); - NavigateParams params(browser(), url, ui::PAGE_TRANSITION_FORWARD_BACK); - ui_test_utils::NavigateToURL(¶ms); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 1), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 1); - histogram_tester()->ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationForwardBack, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - // Navigate to confirm that the host is blocklisted. - NavigateParams params_blocklisted(browser(), url, ui::PAGE_TRANSITION_TYPED); - ui_test_utils::NavigateToURL(¶ms_blocklisted); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 2), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 2); - histogram_tester()->ExpectBucketCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kNavigationBlocklisted, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); - - // Wipe the browser history, clearing the user blocklist. - // This should allow LiteVideos on the next navigation. - browser()->profile()->Wipe(); - if (IsUsingOptGuide()) { - // Browser clear wipes the Optimization Guide hint store so - // we need to re-seed the hints. - SeedOptGuideLiteVideoHints(url); - } - - EXPECT_GT( - RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.UserBlocklist.ClearBlocklist", 1), - 0); - histogram_tester()->ExpectUniqueSample( - "LiteVideo.UserBlocklist.ClearBlocklist", true, 1); - - ui_test_utils::NavigateToURL(¶ms_blocklisted); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 3), - 0); - histogram_tester()->ExpectBucketCount("LiteVideo.Navigation.HasHint", true, - 1); - histogram_tester()->ExpectBucketCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); -} - -class LiteVideoNetworkConnectionBrowserTest - : public LiteVideoKeyedServiceBrowserTest { - public: - LiteVideoNetworkConnectionBrowserTest() : use_opt_guide_(GetParam()) {} - ~LiteVideoNetworkConnectionBrowserTest() override = default; - - void SetUpCommandLine(base::CommandLine* cmd) override { - // This removes the network override switch. - cmd->AppendSwitch("enable-spdy-proxy-auth"); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - const bool use_opt_guide_ = false; -}; - -INSTANTIATE_TEST_SUITE_P(UsingOptGuide, - LiteVideoNetworkConnectionBrowserTest, - ::testing::Bool(), - ::testing::PrintToStringParamName()); - -IN_PROC_BROWSER_TEST_P(LiteVideoNetworkConnectionBrowserTest, - LiteVideoCanApplyLiteVideo_NetworkNotCellular) { - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - content::NetworkConnectionChangeSimulator().SetConnectionType( - network::mojom::ConnectionType::CONNECTION_WIFI); - - GURL navigation_url("https://litevideo.com"); - - // Navigate metrics get recorded. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), navigation_url)); - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 1), - 0); - - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 1); - histogram_tester()->ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 0); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); -} - -IN_PROC_BROWSER_TEST_P( - LiteVideoNetworkConnectionBrowserTest, - LiteVideoCanApplyLiteVideo_NetworkConnectionBelowMinECT) { - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - g_browser_process->network_quality_tracker() - ->ReportEffectiveConnectionTypeForTesting( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G); - - GURL navigation_url("https://litevideo.com"); - - // Navigate metrics get recorded. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), navigation_url)); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 1), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 1); - histogram_tester()->ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 0); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); -} - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - LiteVideoCanApplyLiteVideo_NavigationWithSubframe) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - SetEffectiveConnectionType( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G); - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - // Navigate metrics get recorded. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), https_url())); - - EXPECT_EQ(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 2), - 2); - histogram_tester()->ExpectBucketCount("LiteVideo.Navigation.HasHint", false, - 2); - histogram_tester()->ExpectBucketCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - histogram_tester()->ExpectBucketCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", - lite_video::LiteVideoBlocklistReason::kAllowed, 1); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - ukm_recorder.ExpectEntrySourceHasUrl(entry, https_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kNotAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kBlocklistReasonName, - static_cast<int>(lite_video::LiteVideoBlocklistReason::kAllowed)); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingResultName, - static_cast<int>( - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); -} - -class LiteVideoKeyedServiceCoinflipBrowserTest - : public LiteVideoKeyedServiceBrowserTest { - public: - LiteVideoKeyedServiceCoinflipBrowserTest() : use_opt_guide_(GetParam()) {} - ~LiteVideoKeyedServiceCoinflipBrowserTest() override = default; - - void SetUp() override { - if (use_opt_guide_) { - scoped_feature_list_.InitWithFeaturesAndParameters( - {{::features::kLiteVideo, - {{"use_optimization_guide", "true"}, {"is_coinflip_exp", "true"}}}, - {optimization_guide::features::kOptimizationHints, {}}}, - /*disabled_features=*/{}); - } else { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - {::features::kLiteVideo}, {{"is_coinflip_exp", "true"}}); - } - SetUpHTTPSServer(); - InProcessBrowserTest::SetUp(); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - const bool use_opt_guide_ = false; -}; - -INSTANTIATE_TEST_SUITE_P(UsingOptGuide, - LiteVideoKeyedServiceCoinflipBrowserTest, - ::testing::Bool(), - ::testing::PrintToStringParamName()); - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceCoinflipBrowserTest, - LiteVideoCanApplyLiteVideo_CoinflipHoldback) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - lite_video::switches::kLiteVideoForceOverrideDecision); - base::CommandLine::ForCurrentProcess()->AppendSwitch( - lite_video::switches::kLiteVideoForceCoinflipHoldback); - ukm::TestAutoSetUkmRecorder ukm_recorder; - SetEffectiveConnectionType( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G); - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - // Navigate metrics get recorded. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), https_url())); - - EXPECT_EQ(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 2), - 2); - histogram_tester()->ExpectBucketCount("LiteVideo.Navigation.HasHint", true, - 2); - - // Close the tab to flush the UKM metrics. - browser()->tab_strip_model()->GetActiveWebContents()->Close(); - - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - // Only recording the mainframe event. - ASSERT_EQ(1u, entries.size()); - auto* entry = entries[0]; - // Both entries should be tied to the mainframe url. - ukm_recorder.ExpectEntrySourceHasUrl(entry, https_url()); - ukm_recorder.ExpectEntryMetric( - entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, - static_cast<int>(lite_video::LiteVideoDecision::kHoldback)); -} - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServiceBrowserTest, - HostPermanentlyBlocklisted) { - ukm::TestAutoSetUkmRecorder ukm_recorder; - SetEffectiveConnectionType( - net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G); - - WaitForBlocklistToBeLoaded(); - EXPECT_TRUE( - LiteVideoKeyedServiceFactory::GetForProfile(browser()->profile())); - - GURL navigation_url("https://blockedhost.com"); - - // Navigate metrics get recorded. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), navigation_url)); - - EXPECT_GT(RetryForHistogramUntilCountReached( - *histogram_tester(), "LiteVideo.Navigation.HasHint", 1), - 0); - histogram_tester()->ExpectUniqueSample("LiteVideo.Navigation.HasHint", false, - 1); - histogram_tester()->ExpectTotalCount("LiteVideo.HintAgent.HasHint", 0); - histogram_tester()->ExpectUniqueSample( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", - lite_video::LiteVideoBlocklistReason::kHostPermanentlyBlocklisted, 1); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0); -} - -class LiteVideoKeyedServicePrerenderBrowserTest - : public LiteVideoKeyedServiceBrowserTest { - public: - LiteVideoKeyedServicePrerenderBrowserTest() = default; - ~LiteVideoKeyedServicePrerenderBrowserTest() override = default; - LiteVideoKeyedServicePrerenderBrowserTest( - const LiteVideoKeyedServicePrerenderBrowserTest&) = delete; - - LiteVideoKeyedServicePrerenderBrowserTest& operator=( - const LiteVideoKeyedServicePrerenderBrowserTest&) = delete; - - void SetUpCommandLine(base::CommandLine* command_line) override { - // TODO(crbug.com/846380): move ScopedFeatureList init to the constructor. - // Due to LiteVideoKeyedServiceBrowserTest's use of ScopedFeatureList, we - // construct the prerender helper here to ensure the correct relative order - // of construction and destriction of the lists. - prerender_helper_ = std::make_unique<content::test::PrerenderTestHelper>( - base::BindRepeating( - &LiteVideoKeyedServicePrerenderBrowserTest::GetWebContents, - base::Unretained(this))); - LiteVideoKeyedServiceBrowserTest::SetUpCommandLine(command_line); - } - - void SetUpOnMainThread() override { - // We set up here rather than in the earlier SetUp due to the creation - // timing of prerender_helper_ (SetUp happens prior to SetUpCommandLine). - prerender_helper_->SetUp(embedded_test_server()); - host_resolver()->AddRule("*", "127.0.0.1"); - ASSERT_TRUE(embedded_test_server()->Start()); - } - - content::test::PrerenderTestHelper& prerender_test_helper() { - return *prerender_helper_; - } - - content::WebContents* GetWebContents() { - return browser()->tab_strip_model()->GetActiveWebContents(); - } - - private: - std::unique_ptr<content::test::PrerenderTestHelper> prerender_helper_; -}; - -INSTANTIATE_TEST_SUITE_P(UsingOptGuide, - LiteVideoKeyedServicePrerenderBrowserTest, - ::testing::Bool(), - ::testing::PrintToStringParamName()); - -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServicePrerenderBrowserTest, - PrerenderingDontFlushUKMMetrics) { - GURL initial_url = embedded_test_server()->GetURL("/empty.html"); - GURL prerender_url = embedded_test_server()->GetURL("/title1.html"); - ASSERT_NE(ui_test_utils::NavigateToURL(browser(), initial_url), nullptr); - - ukm::TestAutoSetUkmRecorder ukm_recorder; - // Load a test page in the prerender. - const int host_id = prerender_test_helper().AddPrerender(prerender_url); - content::RenderFrameHost* prerendered_render_frame_host = - prerender_test_helper().GetPrerenderedMainFrameHost(host_id); - ASSERT_TRUE(prerendered_render_frame_host); - auto entries = - ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - // The number of the entry should be 0 since FlushUKMMetrics is not called by - // the lite video observer in prerendering. - EXPECT_EQ(0u, entries.size()); - - // Activate the prerendered page. - prerender_test_helper().NavigatePrimaryPage(prerender_url); - entries = ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); - // The number of the entry should be 1 since FlushUKMMetrics is called by - // the lite video observer after activating. - EXPECT_EQ(1u, entries.size()); -} - -// TODO(crbug.com/1274972): Make this work with NavigationThreadingOptimizations -// enabled. -IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServicePrerenderBrowserTest, - DISABLED_PrerenderingShouldNotUpdateBlocklists) { - GURL initial_url = embedded_test_server()->GetURL("/empty.html"); - GURL prerender_url = embedded_test_server()->GetURL("/title1.html"); - ASSERT_NE(ui_test_utils::NavigateToURL(browser(), initial_url), nullptr); - - ukm::TestAutoSetUkmRecorder ukm_recorder; - // Load a test page in the prerender. - const int host_id = prerender_test_helper().AddPrerender(prerender_url); - content::RenderFrameHost* prerendered_render_frame_host = - prerender_test_helper().GetPrerenderedMainFrameHost(host_id); - ASSERT_TRUE(prerendered_render_frame_host); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 1); - - // Activate the prerendered page. - prerender_test_helper().NavigatePrimaryPage(prerender_url); - histogram_tester()->ExpectTotalCount( - "LiteVideo.CanApplyLiteVideo.UserBlocklist.MainFrame", 2); -}
diff --git a/chrome/browser/lite_video/lite_video_keyed_service_factory.cc b/chrome/browser/lite_video/lite_video_keyed_service_factory.cc deleted file mode 100644 index d8eb4b7d..0000000 --- a/chrome/browser/lite_video/lite_video_keyed_service_factory.cc +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_keyed_service_factory.h" - -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_keyed_service.h" -#include "chrome/browser/lite_video/lite_video_util.h" -#include "chrome/browser/profiles/profile.h" -#include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "content/public/browser/browser_context.h" - -// static -LiteVideoKeyedService* LiteVideoKeyedServiceFactory::GetForProfile( - Profile* profile) { - if (IsLiteVideoAllowedForUser(profile)) { - return static_cast<LiteVideoKeyedService*>( - GetInstance()->GetServiceForBrowserContext(profile, true)); - } - return nullptr; -} - -// static -LiteVideoKeyedServiceFactory* LiteVideoKeyedServiceFactory::GetInstance() { - static base::NoDestructor<LiteVideoKeyedServiceFactory> factory; - return factory.get(); -} - -LiteVideoKeyedServiceFactory::LiteVideoKeyedServiceFactory() - : BrowserContextKeyedServiceFactory( - "LiteVideoKeyedService", - BrowserContextDependencyManager::GetInstance()) {} - -LiteVideoKeyedServiceFactory::~LiteVideoKeyedServiceFactory() = default; - -KeyedService* LiteVideoKeyedServiceFactory::BuildServiceInstanceFor( - content::BrowserContext* context) const { - return new LiteVideoKeyedService(context); -}
diff --git a/chrome/browser/lite_video/lite_video_keyed_service_factory.h b/chrome/browser/lite_video/lite_video_keyed_service_factory.h deleted file mode 100644 index b940af6..0000000 --- a/chrome/browser/lite_video/lite_video_keyed_service_factory.h +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_KEYED_SERVICE_FACTORY_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_KEYED_SERVICE_FACTORY_H_ - -#include "base/no_destructor.h" -#include "components/keyed_service/content/browser_context_keyed_service_factory.h" - -namespace content { -class BrowserContext; -} // namespace content - -class LiteVideoKeyedService; -class Profile; - -// LazyInstance that owns all LiteVideoKeyedServices and associates them -// with Profiles. -class LiteVideoKeyedServiceFactory : public BrowserContextKeyedServiceFactory { - public: - // Gets the LiteVideoService for the profile. - // - // Returns null if the features that allow for this to provide useful - // information are disabled. - static LiteVideoKeyedService* GetForProfile(Profile* profile); - - // Gets the LazyInstance that owns all LiteVideoKeyedService(s). - static LiteVideoKeyedServiceFactory* GetInstance(); - - private: - friend base::NoDestructor<LiteVideoKeyedServiceFactory>; - - LiteVideoKeyedServiceFactory(); - ~LiteVideoKeyedServiceFactory() override; - - // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( - content::BrowserContext* context) const override; -}; - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_KEYED_SERVICE_FACTORY_H_
diff --git a/chrome/browser/lite_video/lite_video_navigation_metrics.cc b/chrome/browser/lite_video/lite_video_navigation_metrics.cc deleted file mode 100644 index 1d48544d..0000000 --- a/chrome/browser/lite_video/lite_video_navigation_metrics.cc +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_navigation_metrics.h" - -#include "base/metrics/histogram_macros.h" -#include "chrome/browser/lite_video/lite_video_features.h" - -namespace lite_video { - -LiteVideoNavigationMetrics::LiteVideoNavigationMetrics( - int64_t nav_id, - LiteVideoDecision decision, - LiteVideoBlocklistReason blocklist_reason, - LiteVideoThrottleResult throttle_result) - : nav_id_(nav_id), - decision_(decision), - blocklist_reason_(blocklist_reason), - throttle_result_(throttle_result) { - frame_rebuffer_count_map_ = {}; -} - -LiteVideoNavigationMetrics::LiteVideoNavigationMetrics( - const LiteVideoNavigationMetrics& other) = default; - -LiteVideoNavigationMetrics::~LiteVideoNavigationMetrics() { - if (frame_rebuffer_count_map_.size() > 0) { - UMA_HISTOGRAM_COUNTS_1000( - "LiteVideo.NavigationMetrics.FrameRebufferMapSize", - frame_rebuffer_count_map_.size()); - } -} - -bool LiteVideoNavigationMetrics::ShouldStopOnRebufferForFrame( - int64_t frame_id) { - auto it = frame_rebuffer_count_map_.find(frame_id); - if (it == frame_rebuffer_count_map_.end()) { - frame_rebuffer_count_map_[frame_id] = 1; - } else { - frame_rebuffer_count_map_[frame_id]++; - } - - if (frame_rebuffer_count_map_[frame_id] >= - features::GetMaxRebuffersPerFrame()) { - throttle_result_ = LiteVideoThrottleResult::kThrottleStoppedOnRebuffer; - return true; - } - return false; -} - -void LiteVideoNavigationMetrics::SetDecision(LiteVideoDecision decision) { - decision_ = decision; -} -void LiteVideoNavigationMetrics::SetBlocklistReason( - LiteVideoBlocklistReason blocklist_reason) { - blocklist_reason_ = blocklist_reason; -} - -} // namespace lite_video
diff --git a/chrome/browser/lite_video/lite_video_navigation_metrics.h b/chrome/browser/lite_video/lite_video_navigation_metrics.h deleted file mode 100644 index 913419d..0000000 --- a/chrome/browser/lite_video/lite_video_navigation_metrics.h +++ /dev/null
@@ -1,84 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_NAVIGATION_METRICS_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_NAVIGATION_METRICS_H_ - -#include "base/containers/flat_map.h" -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" - -namespace lite_video { - -// The decision if a navigation should attempt to throttle media requests. -// This should be kept in sync with LiteVideoDecision in enums.xml. -enum class LiteVideoDecision { - kUnknown, - // The navigation is allowed by all types of this LiteVideoUserBlocklist. - kAllowed, - // The navigation is not allowed by all types of this LiteVideoUserBlocklist. - kNotAllowed, - // The navigation is allowed by all types of this LiteVideoUserBlocklist but - // the optimization was heldback for counterfactual experiments. - kHoldback, - - // Insert new values before this line. - kMaxValue = kHoldback, -}; - -// The result of throttling on a navigation. -// This should be kept in sync with LiteVideoThrottleResult in enums.xml. -enum class LiteVideoThrottleResult { - kUnknown, - // LiteVideos were enabled to throttle media requests on the navigation - // and they were not stopped due to rebuffering events. - kThrottledWithoutStop, - // LiteVideos were enabled to throttle media requests on the navigation - // but they were stopped due to rebuffering events. - kThrottleStoppedOnRebuffer, - - // Insert new values before this line. - kMaxValue = kThrottleStoppedOnRebuffer, -}; - -class LiteVideoNavigationMetrics { - public: - LiteVideoNavigationMetrics(int64_t nav_id, - LiteVideoDecision decision, - LiteVideoBlocklistReason blocklist_reason, - LiteVideoThrottleResult throttle_result); - LiteVideoNavigationMetrics(const LiteVideoNavigationMetrics& other); - ~LiteVideoNavigationMetrics(); - - int64_t nav_id() const { return nav_id_; } - LiteVideoDecision decision() const { return decision_; } - LiteVideoBlocklistReason blocklist_reason() const { - return blocklist_reason_; - } - LiteVideoThrottleResult throttle_result() const { return throttle_result_; } - - // Returns true if the frame with |frame_id| has rebuffered too many times. - // Updates the map holding the count of rebuffers associated with the frame - // for the current navigation and the throttling result if the frame - // has rebuffered too often. - bool ShouldStopOnRebufferForFrame(int64_t frame_id); - - // Update the decision to made on applying LiteVideos to the current - // navigation. - void SetDecision(LiteVideoDecision decision); - - // Update the blocklist reason for the current navigation. - void SetBlocklistReason(LiteVideoBlocklistReason blocklist_reason); - - private: - int64_t nav_id_; - // Map of frame ids to the count of media rebuffers events observed. - base::flat_map<int64_t, int> frame_rebuffer_count_map_; - LiteVideoDecision decision_; - LiteVideoBlocklistReason blocklist_reason_; - LiteVideoThrottleResult throttle_result_; -}; - -} // namespace lite_video - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_NAVIGATION_METRICS_H_
diff --git a/chrome/browser/lite_video/lite_video_navigation_metrics_unittest.cc b/chrome/browser/lite_video/lite_video_navigation_metrics_unittest.cc deleted file mode 100644 index ae973f3..0000000 --- a/chrome/browser/lite_video/lite_video_navigation_metrics_unittest.cc +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_navigation_metrics.h" - -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" -#include "chrome/common/chrome_features.h" -#include "testing/gtest/include/gtest/gtest.h" - -TEST(LiteVideoNavigationMetrics, ShouldStopOnRebufferForFrame) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( - ::features::kLiteVideo, {{"max_rebuffers_per_frame", "2"}}); - - auto nav_metrics = lite_video::LiteVideoNavigationMetrics( - 1, lite_video::LiteVideoDecision::kUnknown, - lite_video::LiteVideoBlocklistReason::kUnknown, - lite_video::LiteVideoThrottleResult::kUnknown); - - EXPECT_FALSE(nav_metrics.ShouldStopOnRebufferForFrame(1)); - EXPECT_TRUE(nav_metrics.ShouldStopOnRebufferForFrame(1)); - EXPECT_TRUE(nav_metrics.ShouldStopOnRebufferForFrame(1)); - - EXPECT_FALSE(nav_metrics.ShouldStopOnRebufferForFrame(2)); - EXPECT_TRUE(nav_metrics.ShouldStopOnRebufferForFrame(2)); -}
diff --git a/chrome/browser/lite_video/lite_video_observer.cc b/chrome/browser/lite_video/lite_video_observer.cc deleted file mode 100644 index c8eeba2..0000000 --- a/chrome/browser/lite_video/lite_video_observer.cc +++ /dev/null
@@ -1,346 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_observer.h" - -#include "base/bind.h" -#include "base/metrics/histogram_macros_local.h" -#include "base/rand_util.h" -#include "chrome/browser/lite_video/lite_video_decider.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_hint.h" -#include "chrome/browser/lite_video/lite_video_keyed_service.h" -#include "chrome/browser/lite_video/lite_video_keyed_service_factory.h" -#include "chrome/browser/lite_video/lite_video_navigation_metrics.h" -#include "chrome/browser/lite_video/lite_video_switches.h" -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" -#include "chrome/browser/lite_video/lite_video_util.h" -#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" -#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/common/previews_resource_loading_hints.mojom.h" -#include "components/optimization_guide/content/browser/optimization_guide_decider.h" -#include "components/optimization_guide/proto/lite_video_metadata.pb.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/render_process_host.h" -#include "content/public/browser/web_contents.h" -#include "services/metrics/public/cpp/ukm_builders.h" -#include "services/metrics/public/cpp/ukm_recorder.h" -#include "services/metrics/public/cpp/ukm_source.h" -#include "services/metrics/public/cpp/ukm_source_id.h" -#include "services/service_manager/public/cpp/interface_provider.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" -#include "third_party/blink/public/common/features.h" - -namespace { - -// Returns the LiteVideoDecider when the LiteVideo features is enabled. -lite_video::LiteVideoDecider* GetLiteVideoDeciderFromWebContents( - content::WebContents* web_contents) { - DCHECK(lite_video::features::IsLiteVideoEnabled()); - if (!web_contents) - return nullptr; - - if (Profile* profile = - Profile::FromBrowserContext(web_contents->GetBrowserContext())) { - return LiteVideoKeyedServiceFactory::GetForProfile(profile) - ->lite_video_decider(); - } - return nullptr; -} - -} // namespace - -// static -void LiteVideoObserver::MaybeCreateForWebContents( - content::WebContents* web_contents) { - if (IsLiteVideoAllowedForUser( - Profile::FromBrowserContext(web_contents->GetBrowserContext()))) { - LiteVideoObserver::CreateForWebContents(web_contents); - } -} - -// static -void LiteVideoObserver::BindLiteVideoService( - mojo::PendingAssociatedReceiver<lite_video::mojom::LiteVideoService> - receiver, - content::RenderFrameHost* rfh) { - auto* web_contents = content::WebContents::FromRenderFrameHost(rfh); - if (!web_contents) - return; - auto* tab_helper = LiteVideoObserver::FromWebContents(web_contents); - if (!tab_helper) - return; - tab_helper->receivers_.Bind(rfh, std::move(receiver)); -} - -LiteVideoObserver::LiteVideoObserver(content::WebContents* web_contents) - : content::WebContentsObserver(web_contents), - content::WebContentsUserData<LiteVideoObserver>(*web_contents), - receivers_(web_contents, this) { - lite_video_decider_ = GetLiteVideoDeciderFromWebContents(web_contents); - routing_ids_to_notify_ = {}; -} - -LiteVideoObserver::~LiteVideoObserver() { - FlushUKMMetrics(); -} - -void LiteVideoObserver::DidFinishNavigation( - content::NavigationHandle* navigation_handle) { - DCHECK(navigation_handle); - - if (!navigation_handle->HasCommitted() || - navigation_handle->IsSameDocument() || - !navigation_handle->GetURL().SchemeIsHTTPOrHTTPS()) { - return; - } - - if (!lite_video_decider_) - return; - - lite_video::LiteVideoBlocklistReason blocklist_reason = - lite_video::LiteVideoBlocklistReason::kUnknown; - - if (navigation_handle->IsInPrimaryMainFrame()) { - FlushUKMMetrics(); - routing_ids_to_notify_.clear(); - nav_metrics_ = lite_video::LiteVideoNavigationMetrics( - navigation_handle->GetNavigationId(), - lite_video::LiteVideoDecision::kUnknown, blocklist_reason, - lite_video::LiteVideoThrottleResult::kThrottledWithoutStop); - } - - MaybeUpdateCoinflipExperimentState(navigation_handle); - auto* render_frame_host = navigation_handle->GetRenderFrameHost(); - if (!render_frame_host) - return; - - lite_video_decider_->CanApplyLiteVideo( - navigation_handle, - base::BindOnce(&LiteVideoObserver::OnHintAvailable, - weak_ptr_factory_.GetWeakPtr(), - content::GlobalRenderFrameHostId( - render_frame_host->GetProcess()->GetID(), - render_frame_host->GetRoutingID()))); -} - -void LiteVideoObserver::OnHintAvailable( - const content::GlobalRenderFrameHostId& render_frame_host_routing_id, - absl::optional<lite_video::LiteVideoHint> hint, - lite_video::LiteVideoBlocklistReason blocklist_reason, - optimization_guide::OptimizationGuideDecision opt_guide_decision) { - auto* render_frame_host = - content::RenderFrameHost::FromID(render_frame_host_routing_id); - if (!render_frame_host) - return; - - if (!render_frame_host->GetPage().IsPrimary()) - return; - - bool is_mainframe = render_frame_host->GetMainFrame() == render_frame_host; - if (!is_mainframe && - opt_guide_decision == - optimization_guide::OptimizationGuideDecision::kUnknown) { - // If this is a subframe and the decision was unknown, then the decision - // from the optimization guide (queried only for the mainframe) has not - // returned. - // - // TODO(crbug/1121833): Add histogram to capture the size of the set of - // routing ids. - routing_ids_to_notify_.insert(render_frame_host_routing_id); - return; - } - lite_video::LiteVideoDecision decision = MakeLiteVideoDecision(hint); - - LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.Navigation.HasHint", hint ? true : false); - // TODO(crbug/1117064): Add a global blocklist check to ensure that the host - // commited of the committed URL is allowed to have LiteVideos applied. - if (nav_metrics_ && is_mainframe) { - nav_metrics_->SetDecision(decision); - nav_metrics_->SetBlocklistReason(blocklist_reason); - } - - // Only proceed to passing hints if the decision is allowed. - if (decision != lite_video::LiteVideoDecision::kAllowed && - opt_guide_decision != - optimization_guide::OptimizationGuideDecision::kTrue) { - return; - } - - if (!hint) - return; - - if (!render_frame_host || !render_frame_host->GetProcess()) - return; - - // At this stage, the following criteria for the render frame should be true: - // 1. The render frame for the routing id is valid. - // 2. The current navigation within the frame is not blocked. - // 3. The decision to apply a LiteVideo is true. - // 4. A LiteVideo hint is available. - SendHintToRenderFrameAgentForID(render_frame_host_routing_id, *hint); - - if (is_mainframe) { - // Given that this is the mainframe, we need to notify all the subframes - // that have requested LiteVideo hints but the optimization guide had - // not returned a decision. - for (const auto& routing_id : routing_ids_to_notify_) - SendHintToRenderFrameAgentForID(routing_id, *hint); - routing_ids_to_notify_.clear(); - return; - } -} - -void LiteVideoObserver::SendHintToRenderFrameAgentForID( - const content::GlobalRenderFrameHostId& routing_id, - const lite_video::LiteVideoHint& hint) { - auto* render_frame_host = content::RenderFrameHost::FromID(routing_id); - if (!render_frame_host) - return; - - mojo::AssociatedRemote<previews::mojom::PreviewsResourceLoadingHintsReceiver> - loading_hints_agent; - - auto hint_ptr = previews::mojom::LiteVideoHint::New(); - hint_ptr->target_downlink_bandwidth_kbps = - hint.target_downlink_bandwidth_kbps(); - hint_ptr->kilobytes_to_buffer_before_throttle = - hint.kilobytes_to_buffer_before_throttle(); - hint_ptr->target_downlink_rtt_latency = hint.target_downlink_rtt_latency(); - hint_ptr->max_throttling_delay = hint.max_throttling_delay(); - - if (render_frame_host->GetRemoteAssociatedInterfaces()) { - render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface( - &loading_hints_agent); - loading_hints_agent->SetLiteVideoHint(std::move(hint_ptr)); - } -} - -lite_video::LiteVideoDecision LiteVideoObserver::MakeLiteVideoDecision( - absl::optional<lite_video::LiteVideoHint> hint) const { - if (hint) { - return is_coinflip_holdback_ ? lite_video::LiteVideoDecision::kHoldback - : lite_video::LiteVideoDecision::kAllowed; - } - return lite_video::LiteVideoDecision::kNotAllowed; -} - -void LiteVideoObserver::FlushUKMMetrics() { - if (!nav_metrics_) - return; - ukm::SourceId ukm_source_id = ukm::ConvertToSourceId( - nav_metrics_->nav_id(), ukm::SourceIdType::NAVIGATION_ID); - ukm::builders::LiteVideo builder(ukm_source_id); - builder.SetThrottlingStartDecision(static_cast<int>(nav_metrics_->decision())) - .SetBlocklistReason(static_cast<int>(nav_metrics_->blocklist_reason())) - .SetThrottlingResult(static_cast<int>(nav_metrics_->throttle_result())) - .Record(ukm::UkmRecorder::Get()); - nav_metrics_.reset(); -} - -// Returns the result of a coinflip. -void LiteVideoObserver::MaybeUpdateCoinflipExperimentState( - content::NavigationHandle* navigation_handle) { - if (!navigation_handle->IsInPrimaryMainFrame()) - return; - if (!lite_video::features::IsCoinflipExperimentEnabled()) - return; - - is_coinflip_holdback_ = lite_video::switches::ShouldForceCoinflipHoldback() - ? true - : base::RandInt(0, 1); -} - -void LiteVideoObserver::MediaBufferUnderflow(const content::MediaPlayerId& id) { - auto* render_frame_host = - content::RenderFrameHost::FromID(id.frame_routing_id); - - if (!render_frame_host || !render_frame_host->GetProcess()) - return; - - // Only consider a rebuffer event related to LiteVideos if they - // were allowed on current navigation. - if (!nav_metrics_ || - nav_metrics_->decision() != lite_video::LiteVideoDecision::kAllowed) { - return; - } - - mojo::AssociatedRemote<previews::mojom::PreviewsResourceLoadingHintsReceiver> - loading_hints_agent; - - if (!render_frame_host->GetRemoteAssociatedInterfaces()) - return; - - render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface( - &loading_hints_agent); - - if (nav_metrics_->ShouldStopOnRebufferForFrame( - render_frame_host->GetRoutingID())) { - loading_hints_agent->StopThrottlingMediaRequests(); - } - - if (!lite_video_decider_) - return; - - // Determine and log if the rebuffer happened in the mainframe. - render_frame_host->GetMainFrame() == render_frame_host - ? lite_video_decider_->DidMediaRebuffer( - render_frame_host->GetLastCommittedURL(), absl::nullopt, true) - : lite_video_decider_->DidMediaRebuffer( - render_frame_host->GetMainFrame()->GetLastCommittedURL(), - render_frame_host->GetLastCommittedURL(), true); -} - -void LiteVideoObserver::MediaPlayerSeek(const content::MediaPlayerId& id) { - - if (!lite_video::features::DisableLiteVideoOnMediaPlayerSeek()) - return; - - auto* render_frame_host = - content::RenderFrameHost::FromID(id.frame_routing_id); - if (!render_frame_host || !render_frame_host->GetProcess()) - return; - - // Only consider a seek event related to LiteVideos if they were allowed on - // current navigation. - if (!nav_metrics_ || - nav_metrics_->decision() != lite_video::LiteVideoDecision::kAllowed) { - return; - } - - mojo::AssociatedRemote<previews::mojom::PreviewsResourceLoadingHintsReceiver> - loading_hints_agent; - - if (!render_frame_host->GetRemoteAssociatedInterfaces()) - return; - - render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface( - &loading_hints_agent); - - LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.MediaPlayerSeek.StopThrottling", true); - - loading_hints_agent->StopThrottlingMediaRequests(); -} - -uint64_t LiteVideoObserver::GetAndClearEstimatedDataSavingBytes() { - if (current_throttled_video_bytes_ == 0) - return 0; - // ThrottledVideoBytesDeflatedRatio is essentially - // bytes_saved / throttled_video_bytes. So use that to compute estimated - // bytes saved. - uint64_t bytes_saved = static_cast<uint64_t>( - current_throttled_video_bytes_ * - lite_video::features::GetThrottledVideoBytesDeflatedRatio()); - current_throttled_video_bytes_ = 0; - return bytes_saved; -} - -void LiteVideoObserver::NotifyThrottledDataUse(uint64_t response_bytes) { - current_throttled_video_bytes_ += response_bytes; -} - -WEB_CONTENTS_USER_DATA_KEY_IMPL(LiteVideoObserver);
diff --git a/chrome/browser/lite_video/lite_video_observer.h b/chrome/browser/lite_video/lite_video_observer.h deleted file mode 100644 index 8a2a9f58..0000000 --- a/chrome/browser/lite_video/lite_video_observer.h +++ /dev/null
@@ -1,120 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_OBSERVER_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_OBSERVER_H_ - -#include "base/memory/raw_ptr.h" -#include "chrome/browser/lite_video/lite_video_navigation_metrics.h" -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" -#include "chrome/common/lite_video_service.mojom.h" -#include "content/public/browser/media_player_id.h" -#include "content/public/browser/render_frame_host_receiver_set.h" -#include "content/public/browser/web_contents_observer.h" -#include "content/public/browser/web_contents_user_data.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace content { -class NavigationHandle; -class WebContents; -} // namespace content - -namespace lite_video { -class LiteVideoDecider; -class LiteVideoHint; -} // namespace lite_video - -namespace optimization_guide { -enum class OptimizationGuideDecision; -} // namespace optimization_guide - -class LiteVideoObserver - : public content::WebContentsObserver, - public content::WebContentsUserData<LiteVideoObserver>, - public lite_video::mojom::LiteVideoService { - public: - static void MaybeCreateForWebContents(content::WebContents* web_contents); - static void BindLiteVideoService( - mojo::PendingAssociatedReceiver<lite_video::mojom::LiteVideoService> - receiver, - content::RenderFrameHost* rfh); - - ~LiteVideoObserver() override; - - // Returns the total bytes estimated to be saved by LiteVideo. - uint64_t GetAndClearEstimatedDataSavingBytes(); - - private: - friend class content::WebContentsUserData<LiteVideoObserver>; - explicit LiteVideoObserver(content::WebContents* web_contents); - - // content::WebContentsObserver. - void DidFinishNavigation( - content::NavigationHandle* navigation_handle) override; - void MediaBufferUnderflow(const content::MediaPlayerId& id) override; - void MediaPlayerSeek(const content::MediaPlayerId& id) override; - - // mojom::LiteVideoService. - void NotifyThrottledDataUse(uint64_t response_bytes) override; - - // Determines the LiteVideoDecision based on |hint| and the coinflip - // holdback state. - lite_video::LiteVideoDecision MakeLiteVideoDecision( - absl::optional<lite_video::LiteVideoHint> hint) const; - - // Records the metrics for LiteVideos applied to any frames associated with - // the current mainframe navigation id. Called once per mainframe. - void FlushUKMMetrics(); - - // Updates the coinflip state if the navigation handle is associated with - // the mainframe. Should only be called once per new mainframe navigation. - void MaybeUpdateCoinflipExperimentState( - content::NavigationHandle* navigation_handle); - - // Callback run after a hint and blocklist reason is available for use - // within the agent associated with |render_frame_host_routing_id|. - void OnHintAvailable( - const content::GlobalRenderFrameHostId& render_frame_host_routing_id, - absl::optional<lite_video::LiteVideoHint> hint, - lite_video::LiteVideoBlocklistReason blocklist_reason, - optimization_guide::OptimizationGuideDecision opt_guide_decision); - - // Sends the |hint| to the render frame agent corresponding to the - // provided global frame routing id. - void SendHintToRenderFrameAgentForID( - const content::GlobalRenderFrameHostId& routing_id, - const lite_video::LiteVideoHint& hint); - - // The decider capable of making decisions about whether LiteVideos should be - // applied and the params to use when throttling media requests. - raw_ptr<lite_video::LiteVideoDecider> lite_video_decider_ = nullptr; - - // The current metrics about the navigation |this| is observing. Reset - // after each time the metrics being held are recorded as a UKM event. - absl::optional<lite_video::LiteVideoNavigationMetrics> nav_metrics_; - - // Whether the navigations currently being observed should have the LiteVideo - // optimization heldback due to a coinflip, counterfactual experiment. - // |is_coinflip_holdback_| is updated each time a mainframe navigation - // commits. - bool is_coinflip_holdback_ = false; - - // The set of routing ids corresponding to render frames that are waiting - // for the decision of whether to throttle media requests that - // occur within that frame. - std::set<content::GlobalRenderFrameHostId> routing_ids_to_notify_; - - // Current response bytes that have been targeted for LiteVideo throttling. - uint64_t current_throttled_video_bytes_ = 0; - - content::RenderFrameHostReceiverSet<lite_video::mojom::LiteVideoService> - receivers_; - - // Used to get a weak pointer to |this|. - base::WeakPtrFactory<LiteVideoObserver> weak_ptr_factory_{this}; - - WEB_CONTENTS_USER_DATA_KEY_DECL(); -}; - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_OBSERVER_H_
diff --git a/chrome/browser/lite_video/lite_video_switches.cc b/chrome/browser/lite_video/lite_video_switches.cc deleted file mode 100644 index d779edb..0000000 --- a/chrome/browser/lite_video/lite_video_switches.cc +++ /dev/null
@@ -1,63 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_switches.h" - -#include "base/command_line.h" -#include "base/strings/string_number_conversions.h" - -namespace lite_video { -namespace switches { - -// Overrides the network conditions checks for LiteVideos. -const char kLiteVideoIgnoreNetworkConditions[] = - "lite-video-ignore-network-conditions"; - -// Overrides all the LiteVideo decision logic to allow it on every navigation. -// This causes LiteVideos to ignore the hints, user blocklist, and -// network condition. -const char kLiteVideoForceOverrideDecision[] = - "lite-video-force-override-decision"; - -// Forces the coinflip used for a counterfactual experiment to be true. -const char kLiteVideoForceCoinflipHoldback[] = - "lite-video-force-coinflip-holdback"; - -// The default downlink bandwidth estimate used for throttling media requests. -// Only used when forcing LiteVideos to be allowed. -const char kLiteVideoDefaultDownlinkBandwidthKbps[] = - "lite-video-default-downlink-bandwidth-kbps"; - -bool ShouldIgnoreLiteVideoNetworkConditions() { - return base::CommandLine::ForCurrentProcess()->HasSwitch( - kLiteVideoIgnoreNetworkConditions); -} - -bool ShouldOverrideLiteVideoDecision() { - return base::CommandLine::ForCurrentProcess()->HasSwitch( - kLiteVideoForceOverrideDecision); -} - -bool ShouldForceCoinflipHoldback() { - return base::CommandLine::ForCurrentProcess()->HasSwitch( - kLiteVideoForceCoinflipHoldback); -} - -int GetDefaultDownlinkBandwidthKbps() { - // Command line override takes priority. - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch( - switches::kLiteVideoDefaultDownlinkBandwidthKbps)) { - int downlink_bandwidth_kbps; - if (base::StringToInt(command_line->GetSwitchValueASCII( - switches::kLiteVideoDefaultDownlinkBandwidthKbps), - &downlink_bandwidth_kbps)) { - return downlink_bandwidth_kbps; - } - } - return 400; -} - -} // namespace switches -} // namespace lite_video
diff --git a/chrome/browser/lite_video/lite_video_switches.h b/chrome/browser/lite_video/lite_video_switches.h deleted file mode 100644 index f8c2fc6e..0000000 --- a/chrome/browser/lite_video/lite_video_switches.h +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_SWITCHES_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_SWITCHES_H_ - -namespace lite_video { -namespace switches { - -extern const char kLiteVideoIgnoreNetworkConditions[]; -extern const char kLiteVideoForceOverrideDecision[]; -extern const char kLiteVideoForceCoinflipHoldback[]; -extern const char kLiteVideoDefaultDownlinkBandwidthKbps[]; - -// Returns true if checking the network condition should be ignored. -bool ShouldIgnoreLiteVideoNetworkConditions(); - -// Returns true if the decision logic for whether to allow LiteVideos should be -// overridden and allow LiteVideos to be enabled for every navigation. -bool ShouldOverrideLiteVideoDecision(); - -// Returns true if the coinflip experiment should be set to true, resulting -// in LiteVideos being heldback. -bool ShouldForceCoinflipHoldback(); - -// Returns the default downlink bandwidth kbps to use when throttling media -// requests. Only used if the decision logic is skipped for testing and a -// default hint is used. -int GetDefaultDownlinkBandwidthKbps(); - -} // namespace switches -} // namespace lite_video - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_SWITCHES_H_
diff --git a/chrome/browser/lite_video/lite_video_user_blocklist.cc b/chrome/browser/lite_video/lite_video_user_blocklist.cc deleted file mode 100644 index ad868b5a..0000000 --- a/chrome/browser/lite_video/lite_video_user_blocklist.cc +++ /dev/null
@@ -1,155 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" - -#include "chrome/browser/lite_video/lite_video_features.h" -#include "components/blocklist/opt_out_blocklist/opt_out_store.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/web_contents.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace { - -// Determine whether the URL is valid and can be queried or -// added to the blocklist. -bool IsURLValidForBlocklist(const GURL& url) { - return url.SchemeIsHTTPOrHTTPS() && url.has_host(); -} - -// Separator between hosts for the rebuffer blocklist type. -constexpr char kLiteVideoBlocklistKeySeparator[] = "_"; - -// Returns the key for a navigation used for the rebuffer blocklist type. -// The key format is "mainframe.com_subframe.com", if the navigation is the -// mainframe navigation, the key omits subframe.com, e.g., "mainframe.com_" -absl::optional<std::string> GetRebufferBlocklistKey( - const GURL& mainframe_url, - absl::optional<GURL> subframe_url) { - if (!IsURLValidForBlocklist(mainframe_url)) - return absl::nullopt; - - if (!subframe_url) - return mainframe_url.host() + kLiteVideoBlocklistKeySeparator; - - if (!IsURLValidForBlocklist(*subframe_url)) - return absl::nullopt; - return mainframe_url.host() + kLiteVideoBlocklistKeySeparator + - subframe_url->host(); -} - -} // namespace - -namespace lite_video { - -LiteVideoUserBlocklist::LiteVideoUserBlocklist( - std::unique_ptr<blocklist::OptOutStore> opt_out_store, - base::Clock* clock, - blocklist::OptOutBlocklistDelegate* blocklist_delegate) - : OptOutBlocklist(std::move(opt_out_store), clock, blocklist_delegate) { - Init(); -} - -LiteVideoUserBlocklist::~LiteVideoUserBlocklist() = default; - -LiteVideoBlocklistReason LiteVideoUserBlocklist::IsLiteVideoAllowedOnNavigation( - content::NavigationHandle* navigation_handle) const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - GURL navigation_url = navigation_handle->GetURL(); - if (!IsURLValidForBlocklist(navigation_url)) - return LiteVideoBlocklistReason::kNavigationNotEligibile; - - std::vector<blocklist::BlocklistReason> passed_reasons; - auto blocklist_reason = blocklist::OptOutBlocklist::IsLoadedAndAllowed( - navigation_url.host(), - static_cast<int>(LiteVideoBlocklistType::kNavigationBlocklist), - /*opt_out=*/false, &passed_reasons); - if (blocklist_reason != blocklist::BlocklistReason::kAllowed) - return LiteVideoBlocklistReason::kNavigationBlocklisted; - - absl::optional<std::string> rebuffer_key = - navigation_handle->IsInMainFrame() - ? GetRebufferBlocklistKey(navigation_url, absl::nullopt) - : GetRebufferBlocklistKey( - navigation_handle->GetWebContents()->GetLastCommittedURL(), - navigation_url); - - if (!rebuffer_key) - return LiteVideoBlocklistReason::kNavigationNotEligibile; - - blocklist_reason = blocklist::OptOutBlocklist::IsLoadedAndAllowed( - *rebuffer_key, - static_cast<int>(LiteVideoBlocklistType::kRebufferBlocklist), - /*opt_out=*/false, &passed_reasons); - if (blocklist_reason != blocklist::BlocklistReason::kAllowed) - return LiteVideoBlocklistReason::kRebufferingBlocklisted; - return LiteVideoBlocklistReason::kAllowed; -} - -bool LiteVideoUserBlocklist::ShouldUseSessionPolicy(base::TimeDelta* duration, - size_t* history, - int* threshold) const { - return false; -} - -bool LiteVideoUserBlocklist::ShouldUsePersistentPolicy( - base::TimeDelta* duration, - size_t* history, - int* threshold) const { - return false; -} - -bool LiteVideoUserBlocklist::ShouldUseHostPolicy(base::TimeDelta* duration, - size_t* history, - int* threshold, - size_t* max_hosts) const { - DCHECK(duration); - DCHECK(history); - DCHECK(threshold); - DCHECK(max_hosts); - *max_hosts = features::MaxUserBlocklistHosts(); - *duration = features::UserBlocklistHostDuration(); - *threshold = features::UserBlocklistOptOutHistoryThreshold(); - *history = features::UserBlocklistOptOutHistoryThreshold(); - return true; -} - -bool LiteVideoUserBlocklist::ShouldUseTypePolicy(base::TimeDelta* duration, - size_t* history, - int* threshold) const { - return false; -} - -blocklist::BlocklistData::AllowedTypesAndVersions -LiteVideoUserBlocklist::GetAllowedTypes() const { - return {{static_cast<int>(LiteVideoBlocklistType::kNavigationBlocklist), - features::LiteVideoBlocklistVersion()}, - {static_cast<int>(LiteVideoBlocklistType::kRebufferBlocklist), - features::LiteVideoBlocklistVersion()}}; -} - -void LiteVideoUserBlocklist::AddNavigationToBlocklist( - content::NavigationHandle* navigation_handle, - bool opt_out) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!IsURLValidForBlocklist(navigation_handle->GetURL())) - return; - AddEntry(navigation_handle->GetURL().host(), opt_out, - static_cast<int>(LiteVideoBlocklistType::kNavigationBlocklist)); -} - -void LiteVideoUserBlocklist::AddRebufferToBlocklist( - const GURL& mainframe_url, - absl::optional<GURL> subframe_url, - bool opt_out) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - absl::optional<std::string> rebuffer_key = - GetRebufferBlocklistKey(mainframe_url, subframe_url); - if (rebuffer_key) { - AddEntry(*rebuffer_key, opt_out, - static_cast<int>(LiteVideoBlocklistType::kRebufferBlocklist)); - } -} - -} // namespace lite_video
diff --git a/chrome/browser/lite_video/lite_video_user_blocklist.h b/chrome/browser/lite_video/lite_video_user_blocklist.h deleted file mode 100644 index fd58133..0000000 --- a/chrome/browser/lite_video/lite_video_user_blocklist.h +++ /dev/null
@@ -1,121 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_USER_BLOCKLIST_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_USER_BLOCKLIST_H_ - -#include <stdint.h> - -#include "base/time/time.h" -#include "components/blocklist/opt_out_blocklist/opt_out_blocklist.h" -#include "components/blocklist/opt_out_blocklist/opt_out_store.h" -#include "url/gurl.h" - -namespace base { -class Clock; -} // namespace base - -namespace content { -class NavigationHandle; -} // namespace content - -namespace lite_video { - -// The current LiteVideo blocklists types. -enum class LiteVideoBlocklistType { - kNone, - // Blocklist for hosts with too many media rebuffer events. - // Keyed by a navigation's host combined with the mainframe host. - kRebufferBlocklist, - // Blocklist for hosts with too many reloads or back-forward navigations. - // Keyed by the mainframe host. - kNavigationBlocklist, - - // Insert new values before this line. - kMaxValue = kNavigationBlocklist, -}; - -// The reasons a navigation could be blocklisted by the LiteVideoUserBlocklist. -// This should be kept in sync with LiteVideoBlocklistReason in enums.xml. -enum class LiteVideoBlocklistReason { - kUnknown, - // The navigation is allowed by all types of this LiteVideoUserBlocklist. - kAllowed, - // The LiteVideo optimization does not support this type navigation (e.g,. not - // HTTP/HTTPS or no host). - kNavigationNotEligibile, - // LiteVideos were blocked because the host was on the - // RebufferBlocklist. - kRebufferingBlocklisted, - // LiteVideos were blocked because the host was on the - // NavigationBlocklist. - kNavigationBlocklisted, - // LiteVideo not shown because it was a reloaded navigation. - kNavigationReload, - // LiteVideo not shown because it was a forward-back navigation. - kNavigationForwardBack, - // LiteVideo not shown because the host was permanently blocklisted. - kHostPermanentlyBlocklisted, - - // Insert new values before this line. - kMaxValue = kHostPermanentlyBlocklisted, -}; - -// The LiteVideoUserBlocklist maintains information about hosts the user -// navigates to and are perceived to be low-quaility experiences because of -// throttling media requests. If the user frequently has a low-quality -// experience on a particular host, it will be added to the blocklist, disabling -// LiteVideos for that host. Currently, hosts are added to the blocklist based -// on excess rebuffers and frequent reloads/back-forward navigations. -class LiteVideoUserBlocklist : public blocklist::OptOutBlocklist { - public: - LiteVideoUserBlocklist( - std::unique_ptr<blocklist::OptOutStore> opt_out_store, - base::Clock* clock, - blocklist::OptOutBlocklistDelegate* blocklist_delegate); - ~LiteVideoUserBlocklist() override; - - // Determine if the navigation is blocklisted by checking the current - // blocklists. Returns if it is blocklisted or LiteVideos should be allowed. - // Virtual for testing. - virtual LiteVideoBlocklistReason IsLiteVideoAllowedOnNavigation( - content::NavigationHandle* navigation_handle) const; - - // Update the entry within the NavigationBlocklistType for the - // |navigation_handle| based on whether it was an opt-out or not. - void AddNavigationToBlocklist(content::NavigationHandle* navigation_handle, - bool opt_out); - - // Update the entry within the RebufferBlocklistType for the - // mainframe and subframe urls based on whether it was an opt-out or not. - void AddRebufferToBlocklist(const GURL& mainframe_url, - absl::optional<GURL> subframe_url, - bool opt_out); - - protected: - // OptOutBlocklist: - bool ShouldUseSessionPolicy(base::TimeDelta* duration, - size_t* history, - int* threshold) const override; - bool ShouldUsePersistentPolicy(base::TimeDelta* duration, - size_t* history, - int* threshold) const override; - bool ShouldUseHostPolicy(base::TimeDelta* duration, - size_t* history, - int* threshold, - size_t* max_hosts) const override; - bool ShouldUseTypePolicy(base::TimeDelta* duration, - size_t* history, - int* threshold) const override; - blocklist::BlocklistData::AllowedTypesAndVersions GetAllowedTypes() - const override; - - private: - - SEQUENCE_CHECKER(sequence_checker_); -}; - -} // namespace lite_video - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_USER_BLOCKLIST_H_
diff --git a/chrome/browser/lite_video/lite_video_user_blocklist_unittest.cc b/chrome/browser/lite_video/lite_video_user_blocklist_unittest.cc deleted file mode 100644 index c780812..0000000 --- a/chrome/browser/lite_video/lite_video_user_blocklist_unittest.cc +++ /dev/null
@@ -1,255 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_user_blocklist.h" - -#include <map> -#include <memory> -#include <string> - -#include "base/strings/string_number_conversions.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/simple_test_clock.h" -#include "base/test/task_environment.h" -#include "base/threading/thread_task_runner_handle.h" -#include "chrome/common/chrome_features.h" -#include "chrome/test/base/chrome_render_view_host_test_harness.h" -#include "chrome/test/base/testing_profile.h" -#include "components/blocklist/opt_out_blocklist/opt_out_blocklist_delegate.h" -#include "components/blocklist/opt_out_blocklist/opt_out_blocklist_item.h" -#include "components/blocklist/opt_out_blocklist/opt_out_store.h" -#include "content/public/browser/web_contents.h" -#include "content/public/test/mock_navigation_handle.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" - -namespace lite_video { - -namespace { - -// Empty mock class to test the LiteVideoUserBlocklist. -class EmptyOptOutBlocklistDelegate : public blocklist::OptOutBlocklistDelegate { - public: - EmptyOptOutBlocklistDelegate() = default; -}; - -class TestLiteVideoUserBlocklist : public LiteVideoUserBlocklist { - public: - TestLiteVideoUserBlocklist( - std::unique_ptr<blocklist::OptOutStore> opt_out_store, - base::Clock* clock, - blocklist::OptOutBlocklistDelegate* blocklist_delegate) - : LiteVideoUserBlocklist(std::move(opt_out_store), - clock, - blocklist_delegate) {} - ~TestLiteVideoUserBlocklist() override = default; - - bool ShouldUseSessionPolicy(base::TimeDelta* duration, - size_t* history, - int* threshold) const override { - return LiteVideoUserBlocklist::ShouldUseSessionPolicy(duration, history, - threshold); - } - - bool ShouldUsePersistentPolicy(base::TimeDelta* duration, - size_t* history, - int* threshold) const override { - return LiteVideoUserBlocklist::ShouldUsePersistentPolicy(duration, history, - threshold); - } - - bool ShouldUseHostPolicy(base::TimeDelta* duration, - size_t* history, - int* threshold, - size_t* max_hosts) const override { - return LiteVideoUserBlocklist::ShouldUseHostPolicy(duration, history, - threshold, max_hosts); - } - - bool ShouldUseTypePolicy(base::TimeDelta* duration, - size_t* history, - int* threshold) const override { - return LiteVideoUserBlocklist::ShouldUseTypePolicy(duration, history, - threshold); - } - - blocklist::BlocklistData::AllowedTypesAndVersions GetAllowedTypes() - const override { - return LiteVideoUserBlocklist::GetAllowedTypes(); - } -}; - -class LiteVideoUserBlocklistTest : public ChromeRenderViewHostTestHarness { - public: - void SetUp() override { - // `ConfigBlocklistWithParams()` must be before base class SetUp. See the - // warning in ScopedFeatureList.h. - ConfigBlocklistWithParams({}); - content::RenderViewHostTestHarness::SetUp(); - } - // Sets up a new blocklist with the given |params|. - void ConfigBlocklistWithParams( - const std::map<std::string, std::string>& params) { - scoped_feature_list_.Reset(); - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kLiteVideo, params); - blocklist_ = std::make_unique<TestLiteVideoUserBlocklist>( - nullptr, &test_clock_, &blocklist_delegate_); - } - - void SeedBlocklist(const std::string& key, LiteVideoBlocklistType type) { - blocklist_->AddEntry(key, true, static_cast<int>(type)); - } - - LiteVideoBlocklistReason CheckBlocklistForSubframeNavigation( - const GURL& mainframe_url, - const GURL& subframe_url) { - // Needed so that a mainframe navigation exists. - NavigateAndCommit(mainframe_url); - content::RenderFrameHostTester* rfh_tester = - content::RenderFrameHostTester::For(main_rfh()); - content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe"); - content::MockNavigationHandle navigation_handle(subframe_url, subframe); - return blocklist_->IsLiteVideoAllowedOnNavigation(&navigation_handle); - } - - LiteVideoBlocklistReason CheckBlocklistForMainframeNavigation( - const GURL& url) { - // Needed so that a mainframe navigation exists. - NavigateAndCommit(url); - content::MockNavigationHandle navigation_handle(url, main_rfh()); - return blocklist_->IsLiteVideoAllowedOnNavigation(&navigation_handle); - } - - void TearDown() override { content::RenderViewHostTestHarness::TearDown(); } - - TestLiteVideoUserBlocklist* blocklist() { return blocklist_.get(); } - - base::SimpleTestClock* test_clock() { return &test_clock_; } - - private: - EmptyOptOutBlocklistDelegate blocklist_delegate_; - // All modificaitons to scoped_feature_list_ need to happen in SetUp or the - // test constructor to avoid race conditions with thread initializations. - base::test::ScopedFeatureList scoped_feature_list_; - - base::SimpleTestClock test_clock_; - std::unique_ptr<TestLiteVideoUserBlocklist> blocklist_; -}; - -class LiteVideoUserBlocklistWithParamsTest : public LiteVideoUserBlocklistTest { - public: - void SetUp() override { - SetUpParams(); - // This creates threads and must be called after all `scoped_feature_list_` - // setup. - content::RenderViewHostTestHarness::SetUp(); - } - - void SetUpParams() { - int max_user_blocklist_hosts = 1; - int user_blocklist_opt_out_history_threshold = 1; - ConfigBlocklistWithParams( - {{"user_blocklist_opt_out_history_threshold", - base::NumberToString(user_blocklist_opt_out_history_threshold)}, - {"max_user_blocklist_hosts", - base::NumberToString(max_user_blocklist_hosts)}}); - } -}; - -TEST_F(LiteVideoUserBlocklistTest, NavigationNotEligibile) { - GURL url("chrome://about"); - EXPECT_EQ(CheckBlocklistForMainframeNavigation(url), - LiteVideoBlocklistReason::kNavigationNotEligibile); -} - -TEST_F(LiteVideoUserBlocklistWithParamsTest, - NavigationBlocklistedByNavigationBlocklist) { - GURL url("https://test.com"); - content::MockNavigationHandle nav_handle; - nav_handle.set_url(url); - blocklist()->AddNavigationToBlocklist(&nav_handle, true); - EXPECT_EQ(CheckBlocklistForMainframeNavigation(url), - LiteVideoBlocklistReason::kNavigationBlocklisted); -} - -TEST_F(LiteVideoUserBlocklistWithParamsTest, - NavigationUnblocklistedByNavigation) { - GURL url("https://test.com"); - content::MockNavigationHandle nav_handle; - nav_handle.set_url(url); - blocklist()->AddNavigationToBlocklist(&nav_handle, true); - test_clock()->Advance(base::Seconds(1)); - EXPECT_EQ(CheckBlocklistForMainframeNavigation(url), - LiteVideoBlocklistReason::kNavigationBlocklisted); - blocklist()->AddNavigationToBlocklist(&nav_handle, false); - test_clock()->Advance(base::Seconds(1)); - EXPECT_EQ(CheckBlocklistForMainframeNavigation(url), - LiteVideoBlocklistReason::kAllowed); -} - -TEST_F(LiteVideoUserBlocklistWithParamsTest, - MainframeNavigationBlocklistedByRebufferBlocklist) { - GURL url("https://test.com"); - blocklist()->AddRebufferToBlocklist(url, absl::nullopt, true); - EXPECT_EQ(CheckBlocklistForMainframeNavigation(url), - LiteVideoBlocklistReason::kRebufferingBlocklisted); -} - -TEST_F(LiteVideoUserBlocklistWithParamsTest, MainframeNavigationAllowed) { - GURL url("https://test.com"); - EXPECT_EQ(CheckBlocklistForMainframeNavigation(url), - LiteVideoBlocklistReason::kAllowed); -} - -TEST_F(LiteVideoUserBlocklistWithParamsTest, - SubframeNavigationBlocklistedByRebufferBlocklist) { - GURL mainframe_url("https://test.com"); - GURL subframe_url("https://subframe.com"); - blocklist()->AddRebufferToBlocklist(mainframe_url, subframe_url, true); - EXPECT_EQ(CheckBlocklistForSubframeNavigation(mainframe_url, subframe_url), - LiteVideoBlocklistReason::kRebufferingBlocklisted); -} - -TEST_F(LiteVideoUserBlocklistWithParamsTest, SubframeNavigationAllowed) { - GURL mainframe_url("https://test.com"); - GURL subframe_url("https://subframe.com"); - EXPECT_EQ(CheckBlocklistForSubframeNavigation(mainframe_url, subframe_url), - LiteVideoBlocklistReason::kAllowed); -} - -TEST_F(LiteVideoUserBlocklistTest, DefaultParams) { - base::TimeDelta duration; - size_t history = 0; - int threshold = 0; - size_t max_hosts = 0; - - EXPECT_TRUE(blocklist()->ShouldUseHostPolicy(&duration, &history, &threshold, - &max_hosts)); - EXPECT_EQ(base::Days(1), duration); - EXPECT_EQ(5u, history); - EXPECT_EQ(5, threshold); - EXPECT_EQ(50u, max_hosts); - - EXPECT_FALSE(blocklist()->ShouldUseTypePolicy(nullptr, nullptr, nullptr)); - - blocklist::BlocklistData::AllowedTypesAndVersions types = - blocklist()->GetAllowedTypes(); - EXPECT_EQ(2u, types.size()); - - auto iter = types.find( - static_cast<int>(LiteVideoBlocklistType::kNavigationBlocklist)); - EXPECT_NE(iter, types.end()); - EXPECT_EQ(0, iter->second); - iter = - types.find(static_cast<int>(LiteVideoBlocklistType::kRebufferBlocklist)); - EXPECT_NE(iter, types.end()); - EXPECT_EQ(0, iter->second); -} - -} // namespace - -} // namespace lite_video
diff --git a/chrome/browser/lite_video/lite_video_util.cc b/chrome/browser/lite_video/lite_video_util.cc deleted file mode 100644 index 0c7c7bbc..0000000 --- a/chrome/browser/lite_video/lite_video_util.cc +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/lite_video/lite_video_util.h" - -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/profiles/profile.h" -#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" - -bool IsLiteVideoAllowedForUser(Profile* profile) { - if (profile->IsOffTheRecord()) - return false; - - if (!lite_video::features::IsLiteVideoEnabled()) - return false; - - // Check if they are a data saver user. - return data_reduction_proxy::DataReductionProxySettings:: - IsDataSaverEnabledByUser(profile->IsOffTheRecord(), profile->GetPrefs()); -}
diff --git a/chrome/browser/lite_video/lite_video_util.h b/chrome/browser/lite_video/lite_video_util.h deleted file mode 100644 index bd4e2f1..0000000 --- a/chrome/browser/lite_video/lite_video_util.h +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_UTIL_H_ -#define CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_UTIL_H_ - -class Profile; - -// Returns true if the user, as represented by |profile| is allowed to have -// the LiteVideo optimization applied. -bool IsLiteVideoAllowedForUser(Profile* profile); - -#endif // CHROME_BROWSER_LITE_VIDEO_LITE_VIDEO_UTIL_H_
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn index f2ee284..21e2388 100644 --- a/chrome/browser/media/router/BUILD.gn +++ b/chrome/browser/media/router/BUILD.gn
@@ -249,6 +249,7 @@ if (!is_android) { sources += [ # In-browser discovery is not used by Android for now. + "discovery/access_code/access_code_cast_discovery_interface_unittest.cc", "discovery/dial/device_description_fetcher_unittest.cc", "discovery/dial/device_description_service_unittest.cc", "discovery/dial/dial_app_discovery_service_unittest.cc",
diff --git a/chrome/browser/media/router/discovery/BUILD.gn b/chrome/browser/media/router/discovery/BUILD.gn index 8c3f81d6..4bece89 100644 --- a/chrome/browser/media/router/discovery/BUILD.gn +++ b/chrome/browser/media/router/discovery/BUILD.gn
@@ -16,13 +16,21 @@ "//chrome/browser:browser_process", "//chrome/browser/media/router:data_decoder_util", "//chrome/browser/media/router:media_router_feature", + "//chrome/browser/media/router/discovery/access_code:discovery_resources_proto", + "//chrome/browser/profiles:profile", + "//chrome/browser/signin:identity_manager_provider", + "//chrome/browser/ui/webui/access_code_cast:mojo_bindings", "//chrome/common:constants", "//components/cast_channel", + "//components/leveldb_proto:leveldb_proto", "//components/media_router/browser", "//components/media_router/common", "//components/media_router/common/mojom:logger", "//components/net_log", "//components/prefs", + "//components/signin/public/base:base", + "//components/signin/public/identity_manager:identity_manager", + "//components/user_manager:user_manager", "//components/version_info", "//content/public/browser", "//content/public/common", @@ -30,6 +38,8 @@ "//third_party/openscreen/src/cast/common/channel/proto:channel_proto", ] sources = [ + "access_code/access_code_cast_discovery_interface.cc", + "access_code/access_code_cast_discovery_interface.h", "dial/device_description_fetcher.cc", "dial/device_description_fetcher.h", "dial/device_description_service.cc",
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.cc new file mode 100644 index 0000000..04367095 --- /dev/null +++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.cc
@@ -0,0 +1,309 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.h" + +#include <cstddef> + +#include "base/callback_helpers.h" +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "base/metrics/histogram_functions.h" +#include "base/strings/strcat.h" +#include "base/threading/thread_task_runner_handle.h" +#include "base/time/time.h" +#include "chrome/browser/profiles/profile.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/identity_manager/access_token_info.h" +#include "components/signin/public/identity_manager/account_info.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "components/user_manager/user.h" +#include "components/user_manager/user_manager.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "net/base/load_flags.h" +#include "net/http/http_request_headers.h" +#include "net/http/http_status_code.h" +#include "services/network/public/mojom/url_response_head.mojom.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace media_router { + +namespace { + +// TODO(b/206131520): Add Policy Switches to +// AccessCodeCastDiscoveryInterface. +constexpr char kGetMethod[] = "GET"; +constexpr char kContentType[] = "application/json; charset=UTF-8"; +constexpr char kDiscoveryOAuth2Scope[] = + "https://www.googleapis.com/auth/applicense.bytebot"; +constexpr char kDiscoveryEndpoint[] = + "https://castedumessaging-pa.googleapis.com/"; +constexpr char kDiscoveryServicePath[] = "v1/receivers/"; +constexpr char kDiscoveryServiceQuery[] = "?checkOnly=true&access_token="; +constexpr char kDiscoveryOAuthConsumerName[] = "access_code_cast_discovery"; +constexpr char kEmptyPostData[] = ""; + +constexpr char kJsonDevice[] = "device"; +constexpr char kJsonDisplayName[] = "displayName"; +constexpr char kJsonId[] = "id"; + +constexpr char kJsonNetworkInfo[] = "networkInfo"; +constexpr char kJsonHostName[] = "hostName"; +constexpr char kJsonPort[] = "port"; +constexpr char kJsonIpV4Address[] = "ipV4Address"; +constexpr char kJsonIpV6Address[] = "ipV6Address"; + +constexpr char kJsonDeviceCapabilities[] = "deviceCapabilities"; +constexpr char kJsonVideoOut[] = "videoOut"; +constexpr char kJsonVideoIn[] = "videoIn"; +constexpr char kJsonAudioOut[] = "audioOut"; +constexpr char kJsonAudioIn[] = "audioIn"; +constexpr char kJsonDevMode[] = "devMode"; + +const int64_t kTimeoutMs = 30000; + +const GURL GetDiscoveryEndpoint() { + return GURL(base::StrCat({kDiscoveryEndpoint, kDiscoveryServicePath})); +} + +const net::NetworkTrafficAnnotationTag kTrafficAnnotation = + net::DefineNetworkTrafficAnnotation("chrome_cast_discovery_api", + R"( + semantics { + sender: "Chrome Cast2Class Discovery Interface" + description: + "A user will be able to cast to cast devices that do not appear in" + "the Google Cast menu, using either the access code or QR code" + "displayed on the cast devices's screen. The access code or QR code" + "will be sent to a discovery server that will confirm that the" + "inputted pin of a user corresponds to a registered chromecast device" + "stored on the discovery server." + trigger: + "The request is triggered when a user attempts to start a casting" + "session with an access code or QR code from the Google cast menu." + data: + "The transmitted information is a sanitized pin." + destination: GOOGLE_OWNED_SERVICE + } + policy { + cookies_allowed: NO + setting: + "No setting. The feature does nothing by default. Users must take" + "an explicit action to trigger it." + chrome_policy { + AccessCodeCastEnabled { + AccessCodeCastEnabled: false + } + } + } + )"); + +// TODO(b/206997996): Add an enum to the EndpointResponse struct so that we can +// check the enum instead of the string +bool IsResponseValid(const absl::optional<base::Value>& response) { + if (!response || !response->is_dict()) { + DVLOG(1) << "response_body was of unexpected format."; + return false; + } + + if (response->DictEmpty()) { + DVLOG(1) << "Response does not have value. Response: " + << response->DebugString(); + return false; + } + return true; +} + +bool HasAuthenticationError(const std::string& response) { + return response == "There was an authentication error"; +} + +bool HasServerError(const std::string& response) { + return response == "There was a response error"; +} + +} // namespace + +AccessCodeCastDiscoveryInterface::AccessCodeCastDiscoveryInterface( + Profile* profile, + const std::string& access_code) + : profile_(profile), + access_code_(access_code), + endpoint_fetcher_(CreateEndpointFetcher(access_code)), + discovery_url_(GetDiscoveryEndpoint()) { + DCHECK(profile_); +} + +AccessCodeCastDiscoveryInterface::AccessCodeCastDiscoveryInterface( + Profile* profile, + const std::string& access_code, + std::unique_ptr<EndpointFetcher> endpoint_fetcher) + : profile_(profile), + access_code_(access_code), + endpoint_fetcher_(std::move(endpoint_fetcher)), + discovery_url_(GetDiscoveryEndpoint()) { + DCHECK(profile_); +} + +AccessCodeCastDiscoveryInterface::~AccessCodeCastDiscoveryInterface() = default; + +void AccessCodeCastDiscoveryInterface::ReportError(AddSinkResultCode error) { + std::move(callback_).Run(absl::nullopt, error); +} + +void AccessCodeCastDiscoveryInterface::SetDeviceCapabilitiesField( + chrome_browser_media::proto::DeviceCapabilities* device_proto, + bool value, + const std::string& key) { + if (key == kJsonVideoOut) { + device_proto->set_video_out(value); + } else if (key == kJsonVideoIn) { + device_proto->set_video_in(value); + } else if (key == kJsonAudioOut) { + device_proto->set_audio_out(value); + } else if (key == kJsonAudioIn) { + device_proto->set_audio_in(value); + } else if (key == kJsonDevMode) { + device_proto->set_dev_mode(value); + } +} + +void AccessCodeCastDiscoveryInterface::SetNetworkInfoField( + chrome_browser_media::proto::NetworkInfo* network_proto, + const std::string& value, + const std::string& key) { + if (key == kJsonHostName) { + network_proto->set_host_name(value); + } else if (key == kJsonPort) { + network_proto->set_port(value); + } else if (key == kJsonIpV4Address) { + network_proto->set_ip_v4_address(value); + } else if (key == kJsonIpV6Address) { + network_proto->set_ip_v6_address(value); + } +} + +std::unique_ptr<EndpointFetcher> +AccessCodeCastDiscoveryInterface::CreateEndpointFetcher( + const std::string& access_code) { + std::vector<std::string> discovery_scopes; + discovery_scopes.push_back(kDiscoveryOAuth2Scope); + + return std::make_unique<EndpointFetcher>( + profile_, kDiscoveryOAuthConsumerName, + GURL(base::StrCat( + {discovery_url_.spec(), access_code, kDiscoveryServiceQuery})), + kGetMethod, kContentType, discovery_scopes, kTimeoutMs, kEmptyPostData, + kTrafficAnnotation); +} + +void AccessCodeCastDiscoveryInterface::ValidateDiscoveryAccessCode( + DiscoveryDeviceCallback callback) { + DCHECK(!callback_); + callback_ = std::move(callback); + + auto* const fetcher_ptr = endpoint_fetcher_.get(); + fetcher_ptr->Fetch( + base::BindOnce(&AccessCodeCastDiscoveryInterface::HandleServerResponse, + weak_ptr_factory_.GetWeakPtr())); +} + +void AccessCodeCastDiscoveryInterface::HandleServerResponse( + std::unique_ptr<EndpointResponse> response) { + const std::string& response_string = response->response; + if (HasAuthenticationError(response_string)) { + DVLOG(1) << "The request to the server failed to be authenticated"; + ReportError(AddSinkResultCode::AUTH_ERROR); + return; + } + + if (HasServerError(response_string)) { + DVLOG(1) << "Did not recieve a response from server while attempting to" + << " validate discovery device."; + ReportError(AddSinkResultCode::SERVER_ERROR); + return; + } + + absl::optional<base::Value> response_value = + base::JSONReader::Read(response->response); + if (!IsResponseValid(response_value)) { + ReportError(AddSinkResultCode::RESPONSE_MALFORMED); + return; + } + + std::pair<absl::optional<DiscoveryDevice>, AddSinkResultCode> + construction_result = + ConstructDiscoveryDeviceFromJson(std::move(response_value.value())); + std::move(callback_).Run(construction_result.first, + construction_result.second); +} + +std::pair<absl::optional<AccessCodeCastDiscoveryInterface::DiscoveryDevice>, + AccessCodeCastDiscoveryInterface::AddSinkResultCode> +AccessCodeCastDiscoveryInterface::ConstructDiscoveryDeviceFromJson( + base::Value json_response) { + DiscoveryDevice discovery_device; + + base::Value* device = json_response.FindKey(kJsonDevice); + if (!device) { + return std::make_pair(absl::nullopt, AddSinkResultCode::RESPONSE_MALFORMED); + } + + std::string* display_name = device->FindStringKey(kJsonDisplayName); + if (!display_name) { + return std::make_pair(absl::nullopt, AddSinkResultCode::RESPONSE_MALFORMED); + } + + std::string* sink_id = device->FindStringKey(kJsonId); + if (!sink_id) { + return std::make_pair(absl::nullopt, AddSinkResultCode::RESPONSE_MALFORMED); + } + + chrome_browser_media::proto::DeviceCapabilities device_capabilities_proto; + base::Value* device_capabilities = device->FindKey(kJsonDeviceCapabilities); + if (!device_capabilities) { + return std::make_pair(absl::nullopt, AddSinkResultCode::RESPONSE_MALFORMED); + } + const auto capability_keys = {kJsonVideoOut, kJsonVideoIn, kJsonAudioOut, + kJsonAudioIn, kJsonDevMode}; + + for (auto* const capability_key : capability_keys) { + absl::optional<bool> capability = + device_capabilities->FindBoolKey(capability_key); + if (capability.has_value()) { + SetDeviceCapabilitiesField(&device_capabilities_proto, capability.value(), + capability_key); + } else { + return std::make_pair(absl::nullopt, + AddSinkResultCode::RESPONSE_MALFORMED); + } + } + + chrome_browser_media::proto::NetworkInfo network_info_proto; + base::Value* network_info = device->FindKey(kJsonNetworkInfo); + if (!network_info) { + return std::make_pair(absl::nullopt, AddSinkResultCode::RESPONSE_MALFORMED); + } + const auto network_keys = {kJsonHostName, kJsonPort, kJsonIpV4Address, + kJsonIpV6Address}; + for (auto* const network_key : network_keys) { + std::string* network_value = network_info->FindStringKey(network_key); + if (network_value) { + SetNetworkInfoField(&network_info_proto, *network_value, network_key); + } else { + return std::make_pair(absl::nullopt, + AddSinkResultCode::RESPONSE_MALFORMED); + } + } + + discovery_device.set_display_name(*display_name); + discovery_device.set_id(*sink_id); + *discovery_device.mutable_device_capabilities() = device_capabilities_proto; + *discovery_device.mutable_network_info() = network_info_proto; + + return std::make_pair(std::move(discovery_device), AddSinkResultCode::OK); +} + +} // namespace media_router
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.h b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.h new file mode 100644 index 0000000..0e27d4c --- /dev/null +++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.h
@@ -0,0 +1,93 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_CAST_DISCOVERY_INTERFACE_H_ +#define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_CAST_DISCOVERY_INTERFACE_H_ + +#include "base/bind.h" +#include "base/callback.h" +#include "base/callback_forward.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/endpoint_fetcher/endpoint_fetcher.h" +#include "chrome/browser/media/router/discovery/access_code/discovery_resources.pb.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/access_code_cast/access_code_cast.mojom.h" +#include "components/leveldb_proto/public/proto_database.h" +#include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h" +#include "google_apis/gaia/google_service_auth_error.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" + +namespace media_router { + +// AccessCodeCastDiscoveryInterface is responsible with communicating with +// the casting discovery server. +class AccessCodeCastDiscoveryInterface { + public: + using DiscoveryDevice = chrome_browser_media::proto::DiscoveryDevice; + + using DiscoveryDeviceCallback = + base::OnceCallback<void(absl::optional<DiscoveryDevice>, + access_code_cast::mojom::AddSinkResultCode)>; + + using AddSinkResultCode = access_code_cast::mojom::AddSinkResultCode; + + AccessCodeCastDiscoveryInterface(Profile* profile, + const std::string& access_code); + + // Used for tests. Can be used if caller constructs their own EndpointFetcher. + AccessCodeCastDiscoveryInterface( + Profile* profile, + const std::string& access_code, + std::unique_ptr<EndpointFetcher> endpoint_fetcher); + + virtual ~AccessCodeCastDiscoveryInterface(); + + AccessCodeCastDiscoveryInterface( + const AccessCodeCastDiscoveryInterface& other) = delete; + AccessCodeCastDiscoveryInterface& operator=( + const AccessCodeCastDiscoveryInterface& other) = delete; + + // ValidateDiscoveryAccessCode is an asynchronous call that attempts to + // validate given |access_code| with the discovery server. The status + // of this attempt will be stored in the |callback| -- either returning an + // error or the actual DiscoveryDevice found on the discovery server. + void ValidateDiscoveryAccessCode(DiscoveryDeviceCallback callback); + + private: + std::unique_ptr<EndpointFetcher> CreateEndpointFetcher( + const std::string& access_code); + + void SetDeviceCapabilitiesField( + chrome_browser_media::proto::DeviceCapabilities* device_proto, + bool value, + const std::string& key); + void SetNetworkInfoField( + chrome_browser_media::proto::NetworkInfo* network_proto, + const std::string& value, + const std::string& key); + std::pair<absl::optional<DiscoveryDevice>, AddSinkResultCode> + ConstructDiscoveryDeviceFromJson(base::Value json_response); + void HandleDiscoveryDeviceJsonError(const std::string& field_missing); + void HandleServerResponse(std::unique_ptr<EndpointResponse> response); + void ReportError(AddSinkResultCode error); + + Profile* const profile_; + // Access code passed down from the WebUI and used in the construction of the + // discovery interface object. + const std::string access_code_; + + std::unique_ptr<EndpointFetcher> endpoint_fetcher_; + + const GURL discovery_url_; + + DiscoveryDeviceCallback callback_; + + base::WeakPtrFactory<AccessCodeCastDiscoveryInterface> weak_ptr_factory_{ + this}; +}; +} // namespace media_router + +#endif // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_CAST_DISCOVERY_INTERFACE_H_
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface_unittest.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface_unittest.cc new file mode 100644 index 0000000..c043031 --- /dev/null +++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface_unittest.cc
@@ -0,0 +1,359 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.h" + +#include "base/strings/stringprintf.h" +#include "base/test/mock_callback.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" +#include "chrome/browser/endpoint_fetcher/endpoint_fetcher.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile.h" +#include "chrome/test/base/testing_profile_manager.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "content/public/test/browser_task_environment.h" +#include "net/http/http_util.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" +#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" +#include "services/network/public/mojom/url_response_head.mojom.h" +#include "services/network/test/test_shared_url_loader_factory.h" +#include "services/network/test/test_url_loader_factory.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using MockDiscoveryDeviceCallback = base::MockCallback< + media_router::AccessCodeCastDiscoveryInterface::DiscoveryDeviceCallback>; + +using AccessCodeCastDiscoveryInterface = + media_router::AccessCodeCastDiscoveryInterface; + +using MockEndpointFetcherCallback = base::MockCallback<EndpointFetcherCallback>; + +using DiscoveryDevice = chrome_browser_media::proto::DiscoveryDevice; + +using AddSinkResultCode = access_code_cast::mojom::AddSinkResultCode; + +using ::testing::_; +using ::testing::Eq; +using ::testing::Invoke; +using ::testing::InvokeArgument; +using ::testing::NiceMock; +using ::testing::Return; + +namespace { + +DiscoveryDevice BuildDiscoveryDeviceProto(const char* display_name, + const char* sink_id) { + DiscoveryDevice discovery_proto; + discovery_proto.set_display_name(display_name); + discovery_proto.set_id(sink_id); + + chrome_browser_media::proto::DeviceCapabilities device_capabilities_proto; + device_capabilities_proto.set_video_out(true); + device_capabilities_proto.set_video_in(true); + device_capabilities_proto.set_audio_out(true); + device_capabilities_proto.set_audio_in(true); + device_capabilities_proto.set_dev_mode(true); + + chrome_browser_media::proto::NetworkInfo network_info_proto; + network_info_proto.set_host_name("GoogleNet"); + network_info_proto.set_port(":666"); + network_info_proto.set_ip_v4_address("11:11"); + network_info_proto.set_ip_v6_address("22:22"); + + *discovery_proto.mutable_device_capabilities() = device_capabilities_proto; + *discovery_proto.mutable_network_info() = network_info_proto; + + return discovery_proto; +} + +const char kMockPostData[] = "mock_post_data"; +int64_t kMockTimeoutMs = 1000000; +const char kMockOAuthConsumerName[] = "mock_oauth_consumer_name"; +const char kMockScope[] = "mock_scope"; +const char kMockEndpoint[] = "https://my-endpoint.com"; +const char kHttpMethod[] = "POST"; +const char kContentType[] = "mock_content_type"; +const char kEmail[] = "mock_email@gmail.com"; + +const char kMalformedResponse[] = "{{{foo_device:::broken}}"; +const char kEmptyResponse[] = ""; +const char kExpectedResponse[] = "{}"; +const char kEndpointResponseSuccess[] = + R"({ + "device": { + "displayName": "test_device", + "id": "1234", + "deviceCapabilities": { + "videoOut": true, + "videoIn": true, + "audioOut": true, + "audioIn": true, + "devMode": true + }, + "networkInfo": { + "hostName": "GoogleNet", + "port": ":666", + "ipV4Address": "11:11", + "ipV6Address": "22:22" + } + } + })"; +const char kEndpointResponseFieldsMissing[] = + R"({ + "device": { + "displayName": "test_device", + "id": "1234", + "deviceCapabilities": { + "videoOut": true, + "videoIn": true, + "audioOut": true, + "audioIn": true, + "devMode": true + }, + "networkInfo": { + "hostName": "GoogleNet", + "port": ":666", + } + } + })"; +// videoOut is a string instead of a bool in this test case +const char kEndpointResponseWrongDataTypes[] = + R"({ + "device": { + "displayName": "test_device", + "id": "1234", + "deviceCapabilities": { + "videoOut": "true", + "videoIn": true, + "audioOut": true, + "audioIn": true, + "devMode": true + }, + "networkInfo": { + "hostName": "GoogleNet", + "port": ":666", + "ipV4Address": "11:11", + "ipV6Address": "22:22" + } + } + })"; + +} // namespace + +MATCHER_P(DiscoveryDeviceProtoEquals, message, "") { + std::string expected_serialized, actual_serialized; + message.SerializeToString(&expected_serialized); + // Must extract the actual proto from the optional<DiscoveryDevice> + CHECK(arg.has_value()); + DiscoveryDevice arg_value = arg.value(); + arg_value.SerializeToString(&actual_serialized); + return expected_serialized == actual_serialized; +} + +class AccessCodeCastDiscoveryInterfaceTest : public testing::Test { + protected: + AccessCodeCastDiscoveryInterfaceTest() + : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), + profile_manager_(TestingBrowserProcess::GetGlobal()) {} + + AccessCodeCastDiscoveryInterfaceTest( + const AccessCodeCastDiscoveryInterfaceTest& + access_code_cast_discovery_interface_test) = delete; + AccessCodeCastDiscoveryInterfaceTest& operator=( + const AccessCodeCastDiscoveryInterfaceTest& + access_code_cast_discovery_interface_test) = delete; + + ~AccessCodeCastDiscoveryInterfaceTest() override {} + + void SetUp() override { + ASSERT_TRUE(profile_manager_.SetUp()); + Profile* profile = profile_manager()->CreateTestingProfile("foo_email"); + + scoped_refptr<network::SharedURLLoaderFactory> test_url_loader_factory = + base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( + &test_url_loader_factory_); + + endpoint_fetcher_ = std::make_unique<EndpointFetcher>( + kMockOAuthConsumerName, GURL(kMockEndpoint), kHttpMethod, kContentType, + std::vector<std::string>{kMockScope}, kMockTimeoutMs, kMockPostData, + TRAFFIC_ANNOTATION_FOR_TESTS, test_url_loader_factory, + identity_test_env_.identity_manager()); + + discovery_interface_ = std::make_unique<AccessCodeCastDiscoveryInterface>( + profile, "123456", std::move(endpoint_fetcher_)); + + in_process_data_decoder_ = + std::make_unique<data_decoder::test::InProcessDataDecoder>(); + SignIn(); + } + + void SetEndpointFetcherMockResponse(const GURL& request_url, + const std::string& response_data, + net::HttpStatusCode response_code, + net::Error error) { + auto head = network::mojom::URLResponseHead::New(); + std::string headers(base::StringPrintf( + "HTTP/1.1 %d %s\nContent-type: application/json\n\n", + static_cast<int>(response_code), GetHttpReasonPhrase(response_code))); + head->headers = base::MakeRefCounted<net::HttpResponseHeaders>( + net::HttpUtil::AssembleRawHeaders(headers)); + head->mime_type = "application/json"; + network::URLLoaderCompletionStatus status(error); + status.decoded_body_length = response_data.size(); + test_url_loader_factory_.AddResponse(request_url, std::move(head), + response_data, status); + } + + void SignIn() { + identity_test_env_.MakePrimaryAccountAvailable(kEmail, + signin::ConsentLevel::kSync); + identity_test_env_.SetAutomaticIssueOfAccessTokens(true); + } + + MockEndpointFetcherCallback& endpoint_fetcher_callback() { + return mock_callback_; + } + + AccessCodeCastDiscoveryInterface* stub_interface() { + return discovery_interface_.get(); + } + + EndpointFetcher* endpoint_fetcher() { return endpoint_fetcher_.get(); } + + network::TestURLLoaderFactory* test_url_loader_factory() { + return &test_url_loader_factory_; + } + + signin::IdentityTestEnvironment& identity_test_env() { + return identity_test_env_; + } + + TestingProfileManager* profile_manager() { return &profile_manager_; } + + private: + content::BrowserTaskEnvironment task_environment_; + signin::IdentityTestEnvironment identity_test_env_; + MockEndpointFetcherCallback mock_callback_; + std::unique_ptr<AccessCodeCastDiscoveryInterface> discovery_interface_; + TestingProfileManager profile_manager_; + network::TestURLLoaderFactory test_url_loader_factory_; + std::unique_ptr<EndpointFetcher> endpoint_fetcher_; + std::unique_ptr<data_decoder::test::InProcessDataDecoder> + in_process_data_decoder_; +}; + +TEST_F(AccessCodeCastDiscoveryInterfaceTest, + ServerResponseAuthenticationError) { + // Test to validate that an authentication error is propagated from the + // discovery interface. + identity_test_env().SetAutomaticIssueOfAccessTokens(false); + + MockDiscoveryDeviceCallback mock_callback; + EXPECT_CALL(mock_callback, + Run(Eq(absl::nullopt), AddSinkResultCode::AUTH_ERROR)); + + stub_interface()->ValidateDiscoveryAccessCode(mock_callback.Get()); + identity_test_env().WaitForAccessTokenRequestIfNecessaryAndRespondWithError( + GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(AccessCodeCastDiscoveryInterfaceTest, ServerError) { + // Test to validate that a server error is propagated from the discovery + // interface. + SetEndpointFetcherMockResponse(GURL(kMockEndpoint), kExpectedResponse, + net::HTTP_BAD_REQUEST, net::ERR_FAILED); + + MockDiscoveryDeviceCallback mock_callback; + + EXPECT_CALL(mock_callback, + Run(Eq(absl::nullopt), AddSinkResultCode::SERVER_ERROR)); + + stub_interface()->ValidateDiscoveryAccessCode(mock_callback.Get()); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(AccessCodeCastDiscoveryInterfaceTest, ServerResponseMalformedError) { + // Test to validate that a malformed server response is propagated from the + // discovery interface. + SetEndpointFetcherMockResponse(GURL(kMockEndpoint), kMalformedResponse, + net::HTTP_OK, net::OK); + + MockDiscoveryDeviceCallback mock_callback; + + EXPECT_CALL(mock_callback, + Run(Eq(absl::nullopt), AddSinkResultCode::RESPONSE_MALFORMED)); + + stub_interface()->ValidateDiscoveryAccessCode(mock_callback.Get()); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(AccessCodeCastDiscoveryInterfaceTest, ServerResponseEmptyError) { + // Test to validate that an empty server response is propagated from the + // discovery interface. + SetEndpointFetcherMockResponse(GURL(kMockEndpoint), kEmptyResponse, + net::HTTP_OK, net::OK); + + MockDiscoveryDeviceCallback mock_callback; + + EXPECT_CALL(mock_callback, + Run(Eq(absl::nullopt), AddSinkResultCode::RESPONSE_MALFORMED)); + + stub_interface()->ValidateDiscoveryAccessCode(mock_callback.Get()); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(AccessCodeCastDiscoveryInterfaceTest, ServerResponseSucess) { + // Test to validate that a successful server response is propagated from + // the discovery interface and all fields are set in the returned proto. + SetEndpointFetcherMockResponse(GURL(kMockEndpoint), kEndpointResponseSuccess, + net::HTTP_OK, net::OK); + + MockDiscoveryDeviceCallback mock_callback; + + DiscoveryDevice discovery_device_proto = + BuildDiscoveryDeviceProto("test_device", "1234"); + + EXPECT_CALL(mock_callback, + Run(DiscoveryDeviceProtoEquals(discovery_device_proto), + AddSinkResultCode::OK)); + + stub_interface()->ValidateDiscoveryAccessCode(mock_callback.Get()); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(AccessCodeCastDiscoveryInterfaceTest, FieldsMissingInResponse) { + // Test to validate that a server response with missing fields is + // propagated from the discovery interface. + SetEndpointFetcherMockResponse(GURL(kMockEndpoint), + kEndpointResponseFieldsMissing, net::HTTP_OK, + net::OK); + + MockDiscoveryDeviceCallback mock_callback; + + EXPECT_CALL(mock_callback, + Run(Eq(absl::nullopt), AddSinkResultCode::RESPONSE_MALFORMED)); + + stub_interface()->ValidateDiscoveryAccessCode(mock_callback.Get()); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(AccessCodeCastDiscoveryInterfaceTest, WrongDataTypesInResponse) { + // Test to validate that a server response with wrong data types is + // propagated from the discovery interface. + SetEndpointFetcherMockResponse(GURL(kMockEndpoint), + kEndpointResponseWrongDataTypes, net::HTTP_OK, + net::OK); + + MockDiscoveryDeviceCallback mock_callback; + + EXPECT_CALL(mock_callback, + Run(Eq(absl::nullopt), AddSinkResultCode::RESPONSE_MALFORMED)); + + stub_interface()->ValidateDiscoveryAccessCode(mock_callback.Get()); + base::RunLoop().RunUntilIdle(); +}
diff --git a/chrome/browser/media/webrtc/same_origin_observer.h b/chrome/browser/media/webrtc/same_origin_observer.h index 0b07045d..7604280 100644 --- a/chrome/browser/media/webrtc/same_origin_observer.h +++ b/chrome/browser/media/webrtc/same_origin_observer.h
@@ -19,7 +19,7 @@ // This will not trigger the callback until the navigation has been committed, // so that WebContents::GetLastCommittedURL will return the new origin, and thus // allow for easier code re-use. Note that that Loading hasn't actually started -// yet, so this is still suitable for listening to for i.e. terminating tab +// yet, so this is still suitable for listening to for, e.g., terminating a tab // capture when a site is no longer the same origin. class SameOriginObserver : public content::WebContentsObserver { public:
diff --git a/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc b/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc index 14a81917..9d1d41e506 100644 --- a/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc +++ b/chrome/browser/nacl_host/nacl_browser_delegate_impl.cc
@@ -40,24 +40,10 @@ #include "extensions/common/url_pattern.h" #endif -namespace { - -// These are temporarily needed for testing non-sfi mode on ChromeOS without -// passing command-line arguments to Chrome. -const char* const kAllowedNonSfiOrigins[] = { - "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", // see http://crbug.com/355141 - "4EB74897CB187C7633357C2FE832E0AD6A44883A" // see http://crbug.com/355141 -}; - -} // namespace - NaClBrowserDelegateImpl::NaClBrowserDelegateImpl( ProfileManager* profile_manager) : profile_manager_(profile_manager), inverse_debug_patterns_(false) { DCHECK(profile_manager_); - for (size_t i = 0; i < base::size(kAllowedNonSfiOrigins); ++i) { - allowed_nonsfi_origins_.insert(kAllowedNonSfiOrigins[i]); - } } NaClBrowserDelegateImpl::~NaClBrowserDelegateImpl() { @@ -183,20 +169,6 @@ #endif } -bool NaClBrowserDelegateImpl::IsNonSfiModeAllowed( - const base::FilePath& profile_directory, - const GURL& manifest_url) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); -#if BUILDFLAG(ENABLE_EXTENSIONS) - auto* registry = extensions::ExtensionRegistry::Get( - profile_manager_->GetProfileByPath(profile_directory)); - return IsExtensionOrSharedModuleAllowed( - manifest_url, ®istry->enabled_extensions(), allowed_nonsfi_origins_); -#else - return false; -#endif -} - // static void NaClBrowserDelegateImpl::CreateInfoBarOnUiThread(int render_process_id, int render_view_id) {
diff --git a/chrome/browser/nacl_host/nacl_browser_delegate_impl.h b/chrome/browser/nacl_host/nacl_browser_delegate_impl.h index 836ffca..37508ca1 100644 --- a/chrome/browser/nacl_host/nacl_browser_delegate_impl.h +++ b/chrome/browser/nacl_host/nacl_browser_delegate_impl.h
@@ -42,8 +42,6 @@ const base::FilePath& profile_directory) override; void SetDebugPatterns(const std::string& debug_patterns) override; bool URLMatchesDebugPatterns(const GURL& manifest_url) override; - bool IsNonSfiModeAllowed(const base::FilePath& profile_directory, - const GURL& manifest_url) override; private: // Creates a NaCl infobar and delegate for the given render process and view @@ -57,7 +55,6 @@ raw_ptr<ProfileManager> profile_manager_; bool inverse_debug_patterns_; - std::set<std::string> allowed_nonsfi_origins_; };
diff --git a/chrome/browser/notifications/notifier_state_tracker.cc b/chrome/browser/notifications/notifier_state_tracker.cc index 07f35ddd..38ebb6e 100644 --- a/chrome/browser/notifications/notifier_state_tracker.cc +++ b/chrome/browser/notifications/notifier_state_tracker.cc
@@ -145,10 +145,11 @@ const PrefService* pref_service = profile_->GetPrefs(); CHECK(pref_service); const base::ListValue* pref_list = pref_service->GetList(pref_name); - for (size_t i = 0; i < pref_list->GetList().size(); ++i) { - std::string element; - if (pref_list->GetString(i, &element) && !element.empty()) - ids_field->insert(element); + base::Value::ConstListView pref_list_view = pref_list->GetList(); + for (size_t i = 0; i < pref_list_view.size(); ++i) { + const std::string* element = pref_list_view[i].GetIfString(); + if (element && !element->empty()) + ids_field->insert(*element); else LOG(WARNING) << i << "-th element is not a string for " << pref_name; }
diff --git a/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc index e0228396..515f0f76 100644 --- a/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc
@@ -7,8 +7,6 @@ #include "base/metrics/field_trial_params.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" -#include "chrome/browser/lite_video/lite_video_features.h" -#include "chrome/browser/lite_video/lite_video_observer.h" #include "chrome/browser/profiles/profile.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" @@ -99,12 +97,6 @@ data_reduction_proxy_bytes_saved += received_data_length * origin_save_data_savings / 100; } - if (auto* lite_video_observer = LiteVideoObserver::FromWebContents( - content::WebContents::FromRenderFrameHost(rfh))) { - DCHECK(lite_video::features::IsLiteVideoEnabled()); - data_reduction_proxy_bytes_saved += - lite_video_observer->GetAndClearEstimatedDataSavingBytes(); - } data_reduction_proxy_settings->data_reduction_proxy_service() ->UpdateDataUseForHost(
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc index fed0d43..a037a957 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc +++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -26,6 +26,7 @@ #include "base/time/time.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "build/os_buildflags.h" #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.h" @@ -3147,10 +3148,15 @@ ASSERT_EQ(all_frames_value, main_frame_value); } +#if BUILDFLAG(IS_MAC) // crbug.com/1277391 +#define MAYBE_PageLCPAnimatedImage DISABLED_PageLCPAnimatedImage +#else +#define MAYBE_PageLCPAnimatedImage PageLCPAnimatedImage +#endif // Tests that an animated image's reported LCP values are smaller than its load // times, when the feature flag for animated image reporting is enabled. IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTestWithAnimatedLCPFlag, - PageLCPAnimatedImage) { + MAYBE_PageLCPAnimatedImage) { test_animated_image_lcp(/*smaller=*/true, /*animated=*/true); }
diff --git a/chrome/browser/paint_preview/android/javatests/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewAccessibilityTest.java b/chrome/browser/paint_preview/android/javatests/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewAccessibilityTest.java index 0a869b8..3d83a860 100644 --- a/chrome/browser/paint_preview/android/javatests/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewAccessibilityTest.java +++ b/chrome/browser/paint_preview/android/javatests/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewAccessibilityTest.java
@@ -4,8 +4,6 @@ package org.chromium.chrome.browser.paint_preview; -import android.os.Build; - import androidx.test.filters.MediumTest; import org.junit.After; @@ -18,7 +16,6 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisableIf; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.paint_preview.services.PaintPreviewTabService; import org.chromium.chrome.browser.tab.Tab; @@ -58,8 +55,6 @@ */ @Test @MediumTest - @DisableIf. - Build(message = "https://crbug.com/1276517", sdk_is_greater_than = Build.VERSION_CODES.O) public void smokeTest() throws ExecutionException, TimeoutException { Tab tab = mActivityTestRule.getActivity().getActivityTab(); TabbedPaintPreview tabbedPaintPreview =
diff --git a/chrome/browser/password_entry_edit/android/java/res/layout/credential_edit_view.xml b/chrome/browser/password_entry_edit/android/java/res/layout/credential_edit_view.xml index ab2f326..77038651 100644 --- a/chrome/browser/password_entry_edit/android/java/res/layout/credential_edit_view.xml +++ b/chrome/browser/password_entry_edit/android/java/res/layout/credential_edit_view.xml
@@ -130,7 +130,7 @@ android:layout_height="wrap_content" android:paddingTop="@dimen/credential_edit_button_layout_padding" android:paddingBottom="@dimen/credential_edit_button_layout_padding" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" app:stackedMargin="@dimen/credential_edit_button_layout_stacked_margin" app:primaryButtonText="@string/done" app:secondaryButtonText="@string/cancel"
diff --git a/chrome/browser/predictors/autocomplete_action_predictor.cc b/chrome/browser/predictors/autocomplete_action_predictor.cc index 71d6e4e..2c3cbac1 100644 --- a/chrome/browser/predictors/autocomplete_action_predictor.cc +++ b/chrome/browser/predictors/autocomplete_action_predictor.cc
@@ -185,6 +185,9 @@ no_state_prefetch_handle_->OnCancel(); no_state_prefetch_handle_.reset(); } + + // TODO(https://crbug.com/1166085): Find a proper way to reset + // prerender_handle_ here. } void AutocompleteActionPredictor::StartPrerendering( @@ -203,19 +206,22 @@ return; } - // TODO(https://crbug.com/1166085): Cancel an ongoing prerender if exists - // and start a new one when its request URL is different from the URL of the - // ongoing prerender. Otherwise, the new request is ignored. - // TODO(https://crbug.com/1166085): Add tests covering the code path of - // StartPrerendering. - std::unique_ptr<content::PrerenderHandle> new_prerender_handle = - web_contents.StartPrerendering( - url, content::PrerenderTriggerType::kEmbedder, "_DirectURLInput"); - // This check is to avoid unintentional cancellation, due to the fact that - // StartPrerendering may return nullptr in cases such as requesting same - // prerendering url. - if (new_prerender_handle) - prerender_handle_ = std::move(new_prerender_handle); + // TODO(https://crbug.com/1166085): Reset the handle upon prerendering + // activation/cancellation. There is a case that a user input the same url + // after activation/cancellation, and this mechanism prevents the user from + // starting a new prerendering. + if (prerender_handle_) { + // `url` has already been prerendered. Avoid starting new prerendering. + if (prerender_handle_->GetInitialPrerenderingUrl() == url) { + return; + } + // `url` does not matched with previously prerendered url. Reset the + // handle to trigger cancellation. + prerender_handle_.reset(); + } + + prerender_handle_ = web_contents.StartPrerendering( + url, content::PrerenderTriggerType::kEmbedder, "_DirectURLInput"); } else if (base::FeatureList::IsEnabled( features::kOmniboxTriggerForNoStatePrefetch)) { content::SessionStorageNamespace* session_storage_namespace = @@ -326,6 +332,10 @@ "AutocompleteActionPredictor.NoStatePrefetchStatus", NoStatePrefetchStatus::kNotStarted); } + + // TODO(https://crbug.com/1166085): Find a proper way to reset + // prerender_handle_ here. + UpdateDatabaseFromTransitionalMatches(opened_url); }
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc index 84a3168..ec46db4 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
@@ -2858,9 +2858,10 @@ /*expect_probe=*/true); } +// Flaky test. See crbug.com/1278069. IN_PROC_BROWSER_TEST_F( ProbingEnabled_CanaryOn_TLSCanaryBadDisabled_DNSCanaryGood_PrefetchProxyBrowserTest, - DISABLE_ON_WIN_MAC_CHROMEOS(NoProbe)) { + DISABLED_NoProbe) { RunProbeTest(/*wait_for_tls=*/false, /*probe_success=*/false, /*expect_successful_tls_probe=*/false,
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_canary_checker.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_canary_checker.h index 5d09869..7dd916e 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_canary_checker.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_canary_checker.h
@@ -68,7 +68,16 @@ // Backoff policy to use to compute how long we should wait between the end // of last retry and start of next retry. - net::BackoffEntry::Policy backoff_policy; + net::BackoffEntry::Policy backoff_policy = { + .num_errors_to_ignore = 0, + .initial_delay_ms = 100, + .multiply_factor = 2, + .jitter_factor = 0.2, + // No maximum backoff. + .maximum_backoff_ms = -1, + .entry_lifetime_ms = -1, + .always_use_initial_delay = false, + }; }; // Cache entry representing a canary check result.
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_canary_checker_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_canary_checker_unittest.cc index 028b11d..6dfaf03 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_canary_checker_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_canary_checker_unittest.cc
@@ -322,8 +322,7 @@ EXPECT_TRUE(checker->IsActive()); } -// TODO(https://crbug.com/1277788): Fails on MSAN. -TEST_F(PrefetchProxyCanaryCheckerTest, DISABLED_NetError) { +TEST_F(PrefetchProxyCanaryCheckerTest, NetError) { base::HistogramTester histogram_tester; GURL probe_url("https://probe-url.com"); std::unique_ptr<TestPrefetchProxyCanaryChecker> checker = @@ -368,8 +367,7 @@ "PrefetchProxy.CanaryChecker.TimeUntilFailure.DNS", 0); } -// TODO(https://crbug.com/1277788): Fails on MSAN. -TEST_F(PrefetchProxyCanaryCheckerTest, DISABLED_TimeUntilFailure) { +TEST_F(PrefetchProxyCanaryCheckerTest, TimeUntilFailure) { base::HistogramTester histogram_tester; GURL probe_url("https://probe-url.com"); std::unique_ptr<TestPrefetchProxyCanaryChecker> checker =
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc index a0821a0..e18533a 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc
@@ -163,16 +163,6 @@ PrefetchProxyCanaryChecker::RetryPolicy retry_policy; retry_policy.max_retries = PrefetchProxyCanaryCheckRetries(); - retry_policy.backoff_policy = { - .num_errors_to_ignore = 0, - .initial_delay_ms = 100, - .multiply_factor = 2, - .jitter_factor = 0.2, - // No maximum backoff. - .maximum_backoff_ms = -1, - .entry_lifetime_ms = -1, - .always_use_initial_delay = false, - }; if (PrefetchProxyTLSCanaryCheckEnabled()) { tls_canary_check_ = std::make_unique<PrefetchProxyCanaryChecker>(
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc index a7467e4..46ecb9d0 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc
@@ -17,6 +17,8 @@ #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" #include "chrome/common/chrome_features.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" +#include "components/prefs/pref_service.h" +#include "components/unified_consent/url_keyed_data_collection_consent_helper.h" const char kIsolatedPrerenderLimitNSPSubresourcesCmdLineFlag[] = "isolated-prerender-max-subresource-per-prerender"; @@ -237,7 +239,8 @@ return base::Seconds(max_seconds); } -bool PrefetchProxySendDecoyRequestForIneligiblePrefetch() { +bool PrefetchProxySendDecoyRequestForIneligiblePrefetch( + PrefService* pref_service) { if (base::CommandLine::ForCurrentProcess()->HasSwitch( "prefetch-proxy-never-send-decoy-requests-for-testing")) { return false; @@ -247,6 +250,18 @@ return true; } + if (base::GetFieldTrialParamByFeatureAsBool( + features::kIsolatePrerenders, "disable_decoys_for_msbb", true)) { + std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper> + helper = unified_consent::UrlKeyedDataCollectionConsentHelper:: + NewAnonymizedDataCollectionConsentHelper(pref_service); + if (helper->IsEnabled()) { + // The user opted-in to Make Search and Browsing Better, no need to send + // a decoy request. + return false; + } + } + double probability = base::GetFieldTrialParamByFeatureAsDouble( features::kIsolatePrerenders, "ineligible_decoy_request_probability", 1.0);
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h index eee267e..3e520786 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h
@@ -11,6 +11,8 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" +class PrefService; + // This command line flag enables NoStatePrefetch on Prefetch Proxy. extern const char kIsolatedPrerenderEnableNSPCmdLineFlag[]; @@ -108,8 +110,10 @@ // Returns true if an ineligible prefetch request should be put on the network, // but not cached, to disguise the presence of cookies (or other criteria). The // return value is randomly decided based on variation params since always -// sending the decoy request is expensive from a data use perspective. -bool PrefetchProxySendDecoyRequestForIneligiblePrefetch(); +// sending the decoy request is expensive from a data use perspective. Decoys +// may be disabled for users that opted-in to "Make Search and Browsing Better". +bool PrefetchProxySendDecoyRequestForIneligiblePrefetch( + PrefService* pref_service); // Returns true if any domain can issue private prefetches using the Google // proxy. Normally, this is restricted to Google domains.
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params_unittest.cc index 99391f5e..9a3fc832 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params_unittest.cc
@@ -8,6 +8,9 @@ #include "base/test/scoped_feature_list.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "components/unified_consent/pref_names.h" #include "testing/gtest/include/gtest/gtest.h" TEST(PrefetchProxyParamsTest, PrefetchPosition_DefaultEmpty) { @@ -74,9 +77,13 @@ scoped_feature_list.InitAndEnableFeatureWithParameters( features::kIsolatePrerenders, {{"ineligible_decoy_request_probability", "-1"}}); + TestingPrefServiceSimple pref_service; + pref_service.registry()->RegisterBooleanPref( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, false); for (size_t i = 0; i < 100; i++) { - EXPECT_FALSE(PrefetchProxySendDecoyRequestForIneligiblePrefetch()); + EXPECT_FALSE( + PrefetchProxySendDecoyRequestForIneligiblePrefetch(&pref_service)); } } @@ -85,8 +92,34 @@ scoped_feature_list.InitAndEnableFeatureWithParameters( features::kIsolatePrerenders, {{"ineligible_decoy_request_probability", "2"}}); + TestingPrefServiceSimple pref_service; + pref_service.registry()->RegisterBooleanPref( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, false); for (size_t i = 0; i < 100; i++) { - EXPECT_TRUE(PrefetchProxySendDecoyRequestForIneligiblePrefetch()); + EXPECT_TRUE( + PrefetchProxySendDecoyRequestForIneligiblePrefetch(&pref_service)); + } +} + +TEST(PrefetchProxyParamsTest, NoDecoysForMSBB) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeatureWithParameters( + features::kIsolatePrerenders, + {{"ineligible_decoy_request_probability", "1"}, + {"disable_decoys_for_msbb", "true"}}); + TestingPrefServiceSimple pref_service; + pref_service.registry()->RegisterBooleanPref( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, true); + for (size_t i = 0; i < 100; i++) { + EXPECT_FALSE( + PrefetchProxySendDecoyRequestForIneligiblePrefetch(&pref_service)); + } + + pref_service.SetBoolean( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, false); + for (size_t i = 0; i < 100; i++) { + EXPECT_TRUE( + PrefetchProxySendDecoyRequestForIneligiblePrefetch(&pref_service)); } }
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc index 1219e1c..82bfd37 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
@@ -1502,7 +1502,8 @@ // Consider whether to send a decoy request to mask any user state (i.e.: // cookies), and if so randomly decide whether to send a decoy request. if (ShouldConsiderDecoyRequestForStatus(*status) && - PrefetchProxySendDecoyRequestForIneligiblePrefetch()) { + PrefetchProxySendDecoyRequestForIneligiblePrefetch( + profile_->GetPrefs())) { prefetch_container->SetIsDecoy(true); page_->urls_to_prefetch_.push_back(prefetch_container); prefetch_container->SetPrefetchStatus(
diff --git a/chrome/browser/prerender/prerender_omnibox_ui_browsertest.cc b/chrome/browser/prerender/prerender_omnibox_ui_browsertest.cc index a8d6bfa..eebfd51f 100644 --- a/chrome/browser/prerender/prerender_omnibox_ui_browsertest.cc +++ b/chrome/browser/prerender/prerender_omnibox_ui_browsertest.cc
@@ -177,4 +177,64 @@ EXPECT_EQ(GetActiveWebContents()->GetLastCommittedURL(), kPrerenderingUrl); } +// This test starts two different url prerendering by +// AutocompleteActionPredictor, and checks that the second one is going to +// cancel the first one. +IN_PROC_BROWSER_TEST_F(PrerenderOmniboxUIBrowserTest, + CancelAutocompleteActionPredictorOldPrerendering) { + Observe(GetActiveWebContents()); + const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html"); + ASSERT_TRUE(GetActiveWebContents()); + ASSERT_TRUE(content::NavigateToURL(GetActiveWebContents(), kInitialUrl)); + + // Attempt to prerender a direct URL input. + ASSERT_TRUE(GetAutocompleteActionPredictor()); + const GURL kPrerenderingUrl = + embedded_test_server()->GetURL("/empty.html?prerender"); + content::test::PrerenderHostObserver old_prerender_observer( + *GetActiveWebContents(), kPrerenderingUrl); + const GURL kNewUrl = embedded_test_server()->GetURL("/empty.html?newUrl"); + GetAutocompleteActionPredictor()->StartPrerendering( + kPrerenderingUrl, *GetActiveWebContents(), gfx::Size(50, 50)); + EXPECT_NE(prerender_helper().GetHostForUrl(kPrerenderingUrl), + content::RenderFrameHost::kNoFrameTreeNodeId); + GetAutocompleteActionPredictor()->StartPrerendering( + kNewUrl, *GetActiveWebContents(), gfx::Size(50, 50)); + + old_prerender_observer.WaitForDestroyed(); + StartOmniboxPrerenderingAndWaitForActivation(kNewUrl); + + EXPECT_TRUE(IsPrerenderingNavigation()); + EXPECT_EQ(GetActiveWebContents()->GetLastCommittedURL(), kNewUrl); +} + +// This test starts same url prerendering twice by AutocompleteActionPredictor, +// and checks that the second one will not trigger cancellation mechanism. +IN_PROC_BROWSER_TEST_F(PrerenderOmniboxUIBrowserTest, + AutocompleteActionPredictorSameURL) { + base::HistogramTester histogram_tester; + Observe(GetActiveWebContents()); + const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html"); + ASSERT_TRUE(GetActiveWebContents()); + ASSERT_TRUE(content::NavigateToURL(GetActiveWebContents(), kInitialUrl)); + + // Attempt to prerender a direct URL input. + ASSERT_TRUE(GetAutocompleteActionPredictor()); + const GURL kPrerenderingUrl = + embedded_test_server()->GetURL("/empty.html?prerender"); + GetAutocompleteActionPredictor()->StartPrerendering( + kPrerenderingUrl, *GetActiveWebContents(), gfx::Size(50, 50)); + GetAutocompleteActionPredictor()->StartPrerendering( + kPrerenderingUrl, *GetActiveWebContents(), gfx::Size(50, 50)); + + histogram_tester.ExpectUniqueSample( + "Prerender.Experimental.PrerenderHostFinalStatus", + /*PrerenderHost::FinalStatus::kTriggerDestroyed*/ 1, 0); + + StartOmniboxPrerenderingAndWaitForActivation(kPrerenderingUrl); + + EXPECT_TRUE(IsPrerenderingNavigation()); + EXPECT_EQ(GetActiveWebContents()->GetLastCommittedURL(), kPrerenderingUrl); +} + } // namespace
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_dialog.xml b/chrome/browser/privacy_review/android/java/res/layout/privacy_review_dialog.xml index 1861ccf4..d92b87b 100644 --- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_dialog.xml +++ b/chrome/browser/privacy_review/android/java/res/layout/privacy_review_dialog.xml
@@ -7,7 +7,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/default_bg_color"> + android:background="@macro/default_bg_color"> <com.google.android.material.appbar.AppBarLayout android:id="@+id/app_bar_layout"
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index 9888256..d72e7d22 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -51,8 +51,6 @@ #include "chrome/browser/download/download_core_service.h" #include "chrome/browser/download/download_core_service_factory.h" #include "chrome/browser/lifetime/application_lifetime.h" -#include "chrome/browser/lite_video/lite_video_keyed_service.h" -#include "chrome/browser/lite_video/lite_video_keyed_service_factory.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h" #include "chrome/browser/password_manager/password_store_factory.h" #include "chrome/browser/permissions/adaptive_quiet_notification_permission_ui_enabler.h" @@ -1610,13 +1608,6 @@ ash::AccountManagerPolicyControllerFactory::GetForBrowserContext(profile); #endif - // Creates the LiteVideo Keyed Service and begins loading the - // hint cache and user blocklist. - auto* lite_video_keyed_service = - LiteVideoKeyedServiceFactory::GetForProfile(profile); - if (lite_video_keyed_service) - lite_video_keyed_service->Initialize(profile->GetPath()); - // TODO(crbug.com/1031477): Remove once getting this created with the browser // context does not change dependency initialization order to cause crashes. AdaptiveQuietNotificationPermissionUiEnabler::GetForProfile(profile);
diff --git a/chrome/browser/renderer_context_menu/link_to_text_menu_observer.cc b/chrome/browser/renderer_context_menu/link_to_text_menu_observer.cc index 9050d12..10717e0 100644 --- a/chrome/browser/renderer_context_menu/link_to_text_menu_observer.cc +++ b/chrome/browser/renderer_context_menu/link_to_text_menu_observer.cc
@@ -214,7 +214,7 @@ std::unique_ptr<ui::DataTransferEndpoint> data_transfer_endpoint = !render_frame_host_->GetBrowserContext()->IsOffTheRecord() ? std::make_unique<ui::DataTransferEndpoint>( - render_frame_host_->GetLastCommittedOrigin()) + render_frame_host_->GetMainFrame()->GetLastCommittedOrigin()) : nullptr; ui::ScopedClipboardWriter scw(ui::ClipboardBuffer::kCopyPaste, @@ -260,7 +260,7 @@ std::unique_ptr<ui::DataTransferEndpoint> data_transfer_endpoint = !render_frame_host_->GetBrowserContext()->IsOffTheRecord() ? std::make_unique<ui::DataTransferEndpoint>( - render_frame_host_->GetLastCommittedOrigin()) + render_frame_host_->GetMainFrame()->GetLastCommittedOrigin()) : nullptr; ui::ScopedClipboardWriter scw(ui::ClipboardBuffer::kCopyPaste,
diff --git a/chrome/browser/renderer_context_menu/link_to_text_menu_observer_interactive_uitest.cc b/chrome/browser/renderer_context_menu/link_to_text_menu_observer_interactive_uitest.cc index 2df45378..277ecdb 100644 --- a/chrome/browser/renderer_context_menu/link_to_text_menu_observer_interactive_uitest.cc +++ b/chrome/browser/renderer_context_menu/link_to_text_menu_observer_interactive_uitest.cc
@@ -29,13 +29,6 @@ public: LinkToTextMenuObserverTest(); - void SetUp() override { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {shared_highlighting::kSharedHighlightingUseBlocklist}, {}); - InProcessBrowserTest::SetUp(); - } - void SetUpOnMainThread() override { extensions::ExtensionBrowserTest::SetUpOnMainThread(); Reset(false);
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index 0ddcda1..118d0f27 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -3162,7 +3162,8 @@ if (render_frame_host && !render_frame_host->GetBrowserContext()->IsOffTheRecord()) { return std::make_unique<ui::DataTransferEndpoint>( - render_frame_host->GetLastCommittedOrigin(), notify_if_restricted); + render_frame_host->GetMainFrame()->GetLastCommittedOrigin(), + notify_if_restricted); } return nullptr; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js index a60e970..b54e8de 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -349,14 +349,11 @@ const mockFeedback = this.createMockFeedback(); this.runWithLoadedTree('<p>before</p><a href="a">a</a>', function(rootNode) { const go = rootNode.find({role: RoleType.LINK}); - // Menus no longer nest a message loop, so we can launch menu and confirm - // expected speech. The menu will not block test shutdown. mockFeedback.call(go.focus.bind(go)) .expectSpeech('a', 'Link') .call(doCmd('contextMenu')) .expectSpeech(/menu opened/) .call(press(KeyCode.ESCAPE)) - .expectSpeech(/menu closed/) .expectSpeech('a', 'Link'); mockFeedback.replay(); }.bind(this));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js index 76c837c5..b298716 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -789,14 +789,7 @@ } return false; case 'contextMenu': - if (ChromeVoxState.instance.currentRange) { - let actionNode = ChromeVoxState.instance.currentRange.start.node; - if (actionNode.role === RoleType.INLINE_TEXT_BOX) { - actionNode = actionNode.parent; - } - actionNode.showContextMenu(); - return false; - } + EventGenerator.sendKeyPress(KeyCode.APPS); break; case 'showHeadingsList': (new PanelCommand(PanelCommandType.OPEN_MENUS, 'role_heading')).send();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js index d826f449..2645b93 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
@@ -93,7 +93,7 @@ this.addListener_(EventType.LIVE_REGION_CHANGED, this.onLiveRegionChanged); this.addListener_(EventType.LOAD_COMPLETE, this.onLoadComplete); - this.addListener_(EventType.MENU_END, this.onMenuEnd); + this.addListener_(EventType.FOCUS_AFTER_MENU_CLOSE, this.onMenuEnd); this.addListener_(EventType.MENU_START, this.onEventDefault); this.addListener_(EventType.RANGE_VALUE_CHANGED, this.onValueChanged); this.addListener_( @@ -683,16 +683,18 @@ * @param {!ChromeVoxEvent} evt */ onMenuEnd(evt) { - this.onEventDefault(evt); - // This is a work around for Chrome context menus not firing a focus event // after you close them. chrome.automation.getFocus(function(focus) { if (focus) { - const event = new CustomAutomationEvent( - EventType.FOCUS, focus, - {eventFrom: 'page', eventFromAction: ActionType.FOCUS}); - this.onFocus(event); + // Directly output the node here; do not go through |onFocus| as it + // contains a lot of logic that can move the selection (if in an + // editable). + const range = cursors.Range.fromNode(focus); + new Output() + .withRichSpeechAndBraille(range, null, OutputEventType.NAVIGATE) + .go(); + ChromeVoxState.instance.setCurrentRange(range); } }.bind(this)); }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js index d1dcd3d2..d4e25f3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
@@ -2094,3 +2094,26 @@ ]); }); }); + + +TEST_F('ChromeVoxEditingTest', 'ContextMenus', function() { + const mockFeedback = this.createMockFeedback(); + const site = ` + <textarea>abc</textarea> + `; + this.runWithLoadedTree(site, async function(root) { + await this.focusFirstTextField(root); + + const textField = root.find({role: RoleType.TEXT_FIELD}); + mockFeedback.expectSpeech('Text area') + .call(() => { + textField.setSelection(0, 2); + }) + .expectSpeech('ab', 'selected') + .call(doCmd('contextMenu')) + .expectSpeech(' menu opened') + .call(this.press(KeyCode.ESCAPE)) + .expectSpeech('ab', 'selected') + .replay(); + }); +});
diff --git a/chrome/browser/resources/tab_search/app.ts b/chrome/browser/resources/tab_search/app.ts index 862a754..a019d0e 100644 --- a/chrome/browser/resources/tab_search/app.ts +++ b/chrome/browser/resources/tab_search/app.ts
@@ -129,7 +129,7 @@ private searchText_: string; private availableHeight_: number; filteredItems_: Array<TitleItem|TabData|TabGroupData>; - private fuzzySearchOptions_: FuzzySearchOptions; + private fuzzySearchOptions_: FuzzySearchOptions<TabData|TabGroupData>; private moveActiveTabToBottom_: boolean; private recentlyClosedDefaultItemDisplayCount_: number; private searchResultText_: string;
diff --git a/chrome/browser/resources/tab_search/fuzzy_search.ts b/chrome/browser/resources/tab_search/fuzzy_search.ts index 855a588..846c1a4 100644 --- a/chrome/browser/resources/tab_search/fuzzy_search.ts +++ b/chrome/browser/resources/tab_search/fuzzy_search.ts
@@ -8,16 +8,15 @@ import Fuse from './fuse.js'; import {ItemData} from './tab_data.js'; -export type FuzzySearchOptions = - Fuse.IFuseOptions<ItemData>&{useFuzzySearch: boolean}; +export type FuzzySearchOptions<T extends ItemData> = + Fuse.IFuseOptions<T>&{useFuzzySearch: boolean}; /** * @return A new array of entries satisfying the input. If no search input is * present, returns a shallow copy of the records. */ -export function fuzzySearch( - input: string, records: ItemData[], - options: FuzzySearchOptions): ItemData[] { +export function fuzzySearch<T extends ItemData>( + input: string, records: T[], options: FuzzySearchOptions<T>): T[] { if (input.length === 0) { return [...records]; } @@ -38,8 +37,8 @@ acc.push(name as string); return acc; }, [] as string[]); - result = new Fuse<ItemData>(records, options).search(input).map(result => { - const item = cloneTabDataObj(result.item); + result = new Fuse<T>(records, options).search(input).map(result => { + const item = cloneTabDataObj<T>(result.item); item.highlightRanges = keyNames.reduce((acc, key) => { const match = result.matches!.find(e => e.key === key); if (match) { @@ -63,7 +62,7 @@ return result; } -function cloneTabDataObj(tabData: ItemData): ItemData { +function cloneTabDataObj<T extends ItemData>(tabData: T): T { const clone = Object.assign({}, tabData); clone.highlightRanges = {}; Object.setPrototypeOf(clone, Object.getPrototypeOf(tabData)); @@ -92,9 +91,8 @@ * for how to calculate score and `prioritizeMatchResult` for how to calculate * priority. */ -function exactSearch( - searchText: string, records: ItemData[], - options: Fuse.IFuseOptions<ItemData>): ItemData[] { +function exactSearch<T extends ItemData>( + searchText: string, records: T[], options: Fuse.IFuseOptions<T>): T[] { if (searchText.length === 0) { return records; } @@ -221,8 +219,8 @@ * 3. All remaining items with a search key matching the searchText elsewhere in * the string. */ -function prioritizeMatchResult( - searchText: string, keys: string[], result: ItemData[]): ItemData[] { +function prioritizeMatchResult<T extends ItemData>( + searchText: string, keys: string[], result: T[]): T[] { const itemsMatchingStringStart = []; const itemsMatchingWordStart = []; const others = [];
diff --git a/chrome/browser/resources/tab_search/tab_search.ts b/chrome/browser/resources/tab_search/tab_search.ts index a0a65a2..7e0ff11 100644 --- a/chrome/browser/resources/tab_search/tab_search.ts +++ b/chrome/browser/resources/tab_search/tab_search.ts
@@ -6,11 +6,11 @@ export {TabSearchAppElement} from './app.js'; export {BiMap} from './bimap.js'; -export {fuzzySearch} from './fuzzy_search.js'; +export {fuzzySearch, FuzzySearchOptions} from './fuzzy_search.js'; export {InfiniteList} from './infinite_list.js'; -export {TabData, TabItemType} from './tab_data.js'; +export {ItemData, TabData, TabItemType} from './tab_data.js'; export {Color as TabGroupColor} from './tab_group_types.mojom-webui.js'; -export {PageCallbackRouter, PageRemote, ProfileData, RecentlyClosedTab, RecentlyClosedTabGroup, Tab, TabGroup, TabsRemovedInfo, TabUpdateInfo} from './tab_search.mojom-webui.js'; +export {PageCallbackRouter, PageRemote, ProfileData, RecentlyClosedTab, RecentlyClosedTabGroup, SwitchToTabInfo, Tab, TabGroup, TabsRemovedInfo, TabUpdateInfo, Window} from './tab_search.mojom-webui.js'; export {TabSearchApiProxy, TabSearchApiProxyImpl} from './tab_search_api_proxy.js'; export {TabSearchGroupItem} from './tab_search_group_item.js'; export {TabSearchItem} from './tab_search_item.js';
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc index c7c154f..f881f5b2 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
@@ -70,15 +70,13 @@ const int kDownloadAttributionUserGestureLimitForExtendedReporting = 5; void AddEventUrlToReferrerChain(const download::DownloadItem& item, + content::RenderFrameHost* render_frame_host, ReferrerChain* out_referrer_chain) { ReferrerChainEntry* event_url_entry = out_referrer_chain->Add(); event_url_entry->set_url(item.GetURL().spec()); event_url_entry->set_type(ReferrerChainEntry::EVENT_URL); event_url_entry->set_referrer_url( - content::DownloadItemUtils::GetWebContents( - const_cast<download::DownloadItem*>(&item)) - ->GetLastCommittedURL() - .spec()); + render_frame_host->GetLastCommittedURL().spec()); event_url_entry->set_is_retargeting(false); event_url_entry->set_navigation_time_msec(base::Time::Now().ToJavaTime()); for (const GURL& url : item.GetUrlChain()) @@ -87,8 +85,7 @@ int GetDownloadAttributionUserGestureLimit(const download::DownloadItem& item) { content::WebContents* web_contents = - content::DownloadItemUtils::GetWebContents( - const_cast<download::DownloadItem*>(&item)); + content::DownloadItemUtils::GetWebContents(&item); if (!web_contents) return kDownloadAttributionUserGestureLimit; @@ -538,11 +535,17 @@ // If no navigation event is found, this download is not triggered by regular // navigation (e.g. html5 file apis, etc). We look for the referrer chain - // based on relevant WebContents instead. + // based on relevant RenderFrameHost instead. + content::RenderFrameHost* render_frame_host = + content::DownloadItemUtils::GetRenderFrameHost(&item); + content::RenderFrameHost* outermost_render_frame_host = + render_frame_host ? render_frame_host->GetOutermostMainFrame() : nullptr; if (result == SafeBrowsingNavigationObserverManager::NAVIGATION_EVENT_NOT_FOUND && - web_contents && web_contents->GetLastCommittedURL().is_valid()) { - AddEventUrlToReferrerChain(item, referrer_chain.get()); + web_contents && outermost_render_frame_host && + outermost_render_frame_host->GetLastCommittedURL().is_valid()) { + AddEventUrlToReferrerChain(item, outermost_render_frame_host, + referrer_chain.get()); result = GetNavigationObserverManager(web_contents) ->IdentifyReferrerChainByWebContents( web_contents, GetDownloadAttributionUserGestureLimit(item),
diff --git a/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc b/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc index 85173a0..29aedea9 100644 --- a/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc +++ b/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc
@@ -4,47 +4,78 @@ #include "chrome/browser/safe_browsing/tailored_security/consented_message_android.h" +#include "base/metrics/histogram_functions.h" #include "chrome/browser/android/android_theme_resources.h" #include "chrome/browser/android/resource_mapper.h" #include "chrome/browser/safe_browsing/android/safe_browsing_settings_launcher_android.h" +#include "chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h" #include "chrome/grit/generated_resources.h" #include "components/messages/android/message_dispatcher_bridge.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" -#include "base/logging.h" -#include "content/public/browser/web_contents.h" - namespace safe_browsing { +namespace { +void LogOutcome(TailoredSecurityOutcome outcome, bool enable) { + std::string histogram = + enable ? "SafeBrowsing.TailoredSecurityConsentedEnabledMessageOutcome" + : "SafeBrowsing.TailoredSecurityConsentedDisabledMessageOutcome"; + base::UmaHistogramEnumeration(histogram, outcome); +} + +} // namespace + TailoredSecurityConsentedModalAndroid::TailoredSecurityConsentedModalAndroid() = default; TailoredSecurityConsentedModalAndroid:: ~TailoredSecurityConsentedModalAndroid() { - DismissMessage(messages::DismissReason::UNKNOWN); + DismissMessageInternal(messages::DismissReason::UNKNOWN); } void TailoredSecurityConsentedModalAndroid::DisplayMessage( - content::WebContents* web_contents) { + content::WebContents* web_contents, + bool enable) { if (message_) { return; } web_contents_ = web_contents; + is_enable_message_ = enable; message_ = std::make_unique<messages::MessageWrapper>( - messages::MessageIdentifier::TAILORED_SECURITY_ENABLED, - base::NullCallback(), + is_enable_message_ + ? messages::MessageIdentifier::TAILORED_SECURITY_ENABLED + : messages::MessageIdentifier::TAILORED_SECURITY_DISABLED, + base::BindOnce( + &TailoredSecurityConsentedModalAndroid::HandleMessageAccepted, + base::Unretained(this)), base::BindOnce( &TailoredSecurityConsentedModalAndroid::HandleMessageDismissed, base::Unretained(this))); - message_->SetTitle( - l10n_util::GetStringUTF16(IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_TITLE)); - message_->SetDescription(l10n_util::GetStringUTF16( - IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_DESCRIPTION)); + std::u16string title, description; + int icon_resource_id; + if (is_enable_message_) { + title = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_TITLE); + description = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_DESCRIPTION); + icon_resource_id = + ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_MESSAGE_SAFETY_CHECK); + } else { + title = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_TITLE); + description = l10n_util::GetStringUTF16( + IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION); + icon_resource_id = + ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_MESSAGE_GPP_MAYBE_GREY); + } + message_->SetTitle(title); + message_->SetDescription(description); message_->SetPrimaryButtonText(l10n_util::GetStringUTF16( IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_OK_BUTTON)); - message_->SetIconResourceId( - ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_MESSAGE_SAFETY_CHECK)); + message_->SetIconResourceId(icon_resource_id); + message_->DisableIconTint(); message_->SetSecondaryIconResourceId( ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_MESSAGE_SETTINGS)); message_->SetSecondaryActionCallback(base::BindOnce( @@ -54,27 +85,31 @@ messages::MessageDispatcherBridge::Get()->EnqueueWindowScopedMessage( message_.get(), web_contents_->GetTopLevelNativeWindow(), messages::MessagePriority::kNormal); + LogOutcome(TailoredSecurityOutcome::kShown, is_enable_message_); } -void TailoredSecurityConsentedModalAndroid::DismissMessage( +void TailoredSecurityConsentedModalAndroid::DismissMessageInternal( messages::DismissReason dismiss_reason) { - if (message_) { - messages::MessageDispatcherBridge::Get()->DismissMessage(message_.get(), - dismiss_reason); - } + if (!message_) + return; + messages::MessageDispatcherBridge::Get()->DismissMessage(message_.get(), + dismiss_reason); } void TailoredSecurityConsentedModalAndroid::HandleSettingsClicked() { - // TODO(crbug.com/1257628): Update pref about user action. - // TODO(crbug.com/1257621): Add histogram to calculate conversion rate. ShowSafeBrowsingSettings(web_contents_); - DismissMessage(messages::DismissReason::DISMISSED_BY_FEATURE); + LogOutcome(TailoredSecurityOutcome::kSettings, is_enable_message_); + DismissMessageInternal(messages::DismissReason::SECONDARY_ACTION); } void TailoredSecurityConsentedModalAndroid::HandleMessageDismissed( messages::DismissReason dismiss_reason) { - // TODO(crbug.com/1257628): Update pref about user action. + LogOutcome(TailoredSecurityOutcome::kDismissed, is_enable_message_); message_.reset(); } +void TailoredSecurityConsentedModalAndroid::HandleMessageAccepted() { + LogOutcome(TailoredSecurityOutcome::kAccepted, is_enable_message_); +} + } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/tailored_security/consented_message_android.h b/chrome/browser/safe_browsing/tailored_security/consented_message_android.h index 270c0bd8..b1c1e04 100644 --- a/chrome/browser/safe_browsing/tailored_security/consented_message_android.h +++ b/chrome/browser/safe_browsing/tailored_security/consented_message_android.h
@@ -22,15 +22,22 @@ TailoredSecurityConsentedModalAndroid(); ~TailoredSecurityConsentedModalAndroid(); - void DisplayMessage(content::WebContents* web_contents); - void DismissMessage(messages::DismissReason dismiss_reason); + // Show the message for the given `web_contents`, when the Tailored security + // setting has been `enabled`. + void DisplayMessage(content::WebContents* web_contents, bool enabled); private: + void DismissMessageInternal(messages::DismissReason dismiss_reason); void HandleSettingsClicked(); + void HandleMessageAccepted(); void HandleMessageDismissed(messages::DismissReason dismiss_reason); std::unique_ptr<messages::MessageWrapper> message_; raw_ptr<content::WebContents> web_contents_ = nullptr; + + // Whether the message is shown for Tailored Security being enabled or + // disabled. + bool is_enable_message_; }; } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h b/chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h index f12f411..7968e40 100644 --- a/chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_outcome.h
@@ -13,7 +13,8 @@ kAccepted = 0, kDismissed = 1, kSettings = 2, - kMaxValue = kSettings, + kShown = 3, + kMaxValue = kShown, }; #endif // CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_OUTCOME_H_
diff --git a/chrome/browser/share/android/java/res/layout/qrcode_dialog.xml b/chrome/browser/share/android/java/res/layout/qrcode_dialog.xml index 6cb35b5..1ef9180 100644 --- a/chrome/browser/share/android/java/res/layout/qrcode_dialog.xml +++ b/chrome/browser/share/android/java/res/layout/qrcode_dialog.xml
@@ -8,7 +8,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:background="@color/default_bg_color"> + android:background="@macro/default_bg_color"> <com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout"
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetTest.java index 7419b213..1ef104e3 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetTest.java
@@ -35,12 +35,14 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.R; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.share.ShareHistoryBridge; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.MenuUtils; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetTestSupport; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -287,8 +289,11 @@ @Test @SmallTest - @Feature({"ShareUsageRanking"}) - public void nothingFromDefaultRankingAvailable() { + @Feature({ChromeFeatureList.SHARE_USAGE_RANKING}) + @EnableFeatures({ChromeFeatureList.SHARE_USAGE_RANKING, + ChromeFeatureList.SHARE_USAGE_RANKING_FIXED_MORE}) + public void + nothingFromDefaultRankingAvailable() { replaceRecentShareHistory(defaultTestHistory()); replaceSystemApps(defaultTestSystemApps());
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java index 874ab80..6e188a9 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java
@@ -959,7 +959,7 @@ public boolean deserialize(@Nullable ByteBuffer bytes) { // TODO(crbug.com/1135573) add in metrics for serialize and deserialize // Do not attempt to deserialize if the bytes are null - if (bytes == null) { + if (bytes == null || !bytes.hasRemaining()) { return false; } try {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index e56ade2..8463149 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -411,6 +411,7 @@ "//chrome/browser/image_decoder", "//chrome/browser/media:mojo_bindings", "//chrome/browser/media/router:media_router_feature", + "//chrome/browser/media/router/discovery/access_code:discovery_resources_proto", "//chrome/browser/profiles", "//chrome/browser/profiles:profile", "//chrome/browser/profiling_host", @@ -1687,6 +1688,7 @@ "//chrome/browser/cart:mojo_bindings", "//chrome/browser/image_editor", "//chrome/browser/media/router", + "//chrome/browser/media/router/discovery:discovery", "//chrome/browser/new_tab_page/chrome_colors:generate_chrome_colors_info", "//chrome/browser/new_tab_page/modules/drive:mojo_bindings", "//chrome/browser/new_tab_page/modules/photos:mojo_bindings", @@ -2933,6 +2935,7 @@ "//chrome/browser/ash/crosapi", "//chrome/browser/ash/crostini:crostini_installer_types_mojom", "//chrome/browser/chromeos", + "//chrome/browser/media/router/discovery/access_code:discovery_resources_proto", "//chrome/browser/nearby_sharing:share_target", "//chrome/browser/nearby_sharing/certificates", "//chrome/browser/nearby_sharing/client",
diff --git a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.h b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.h index 92968fd..11aa5d16 100644 --- a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.h +++ b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.h
@@ -67,9 +67,6 @@ private: // Weak reference to owner of this class. Always outlives this view. - // TODO(crbug.com/1277218): Is this really the case? - // AutofillPopupControllerImpl::HideViewAndDie() calls this class's Hide(), - // which does not delete itself. base::WeakPtr<AutofillPopupController> controller_; // Call to confirm a requested deletion.
diff --git a/chrome/browser/ui/android/management/java/res/layout/enterprise_management.xml b/chrome/browser/ui/android/management/java/res/layout/enterprise_management.xml index bb7d5cd..8b3bd4a 100644 --- a/chrome/browser/ui/android/management/java/res/layout/enterprise_management.xml +++ b/chrome/browser/ui/android/management/java/res/layout/enterprise_management.xml
@@ -8,7 +8,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:padding="@dimen/fre_vertical_spacing"> <ImageView
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_background.xml index 6c0fbc4..b1ffc537 100644 --- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_background.xml +++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_background.xml
@@ -5,6 +5,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - <solid android:color="@color/default_bg_color" /> + <solid android:color="@color/default_bg_color_baseline" /> <corners android:radius="@dimen/quick_action_search_widget_background_radius" /> </shape>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_dino_background.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_dino_background.xml index ca73eb0..7de6984 100644 --- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_dino_background.xml +++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/drawable/quick_action_search_widget_dino_background.xml
@@ -15,11 +15,11 @@ </item> <item> <shape android:shape="rectangle"> - <solid android:color="@color/default_bg_color" /> + <solid android:color="@color/default_bg_color_baseline" /> <size android:width="@dimen/quick_action_search_widget_dino_size" android:height="@dimen/quick_action_search_widget_dino_size" /> <corners android:radius="@dimen/quick_action_search_widget_dino_corner_radius" /> </shape> </item> -</ripple> \ No newline at end of file +</ripple>
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/java/res/xml/quick_action_search_widget_small_info.xml b/chrome/browser/ui/android/quickactionsearchwidget/java/res/xml/quick_action_search_widget_small_info.xml index 694d96b..bedeee78d 100644 --- a/chrome/browser/ui/android/quickactionsearchwidget/java/res/xml/quick_action_search_widget_small_info.xml +++ b/chrome/browser/ui/android/quickactionsearchwidget/java/res/xml/quick_action_search_widget_small_info.xml
@@ -6,7 +6,7 @@ <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/quick_action_search_widget_small_layout" android:minWidth="@dimen/quick_action_search_widget_width" - android:minHeight="@dimen/quick_action_search_widget_small_height" + android:minHeight="@dimen/quick_action_search_widget_xsmall_height" android:minResizeWidth="@dimen/quick_action_search_widget_width" android:minResizeHeight="@dimen/quick_action_search_widget_xsmall_height" android:resizeMode="vertical|horizontal"
diff --git a/chrome/browser/ui/android/theme/BUILD.gn b/chrome/browser/ui/android/theme/BUILD.gn index 4fac4fb4..a9302e48f 100644 --- a/chrome/browser/ui/android/theme/BUILD.gn +++ b/chrome/browser/ui/android/theme/BUILD.gn
@@ -9,6 +9,7 @@ "java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java", "java/src/org/chromium/chrome/browser/theme/ThemeUtils.java", "java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java", + "java/src/org/chromium/chrome/browser/ui/theme/ChromeSemanticColorUtils.java", ] deps = [ ":java_resources",
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/ChromeSemanticColorUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/ChromeSemanticColorUtils.java new file mode 100644 index 0000000..4037a21 --- /dev/null +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/ChromeSemanticColorUtils.java
@@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.theme; + +import android.content.Context; + +import androidx.annotation.ColorInt; + +import org.chromium.components.browser_ui.styles.SemanticColorUtils; + +/** Chrome specific version of {@link SemanticColorUtils}. */ +public class ChromeSemanticColorUtils { + /** + * Returns the semantic color value that corresponds to + * contextual_search_promo_background_color. + */ + public static @ColorInt int getContextualSearchPromoBackgroundColor(Context context) { + return SemanticColorUtils.getDefaultBgColor(context); + } + + /** Returns the semantic color value that corresponds to overlay_panel_bar_background_color. */ + public static @ColorInt int getOverlayPanelBarBackgroundColor(Context context) { + return SemanticColorUtils.getDefaultBgColor(context); + } +} \ No newline at end of file
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewBinder.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewBinder.java index 7a8498cc..83021bd 100644 --- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewBinder.java +++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewBinder.java
@@ -241,10 +241,11 @@ } else if (key == ContinueButtonProperties.ACCOUNT) { Account account = model.get(ContinueButtonProperties.ACCOUNT); // Prefers to use given name if it is provided otherwise falls back to using the name. - String name = - account.getGivenName() != null ? account.getGivenName() : account.getName(); - String btnText = - String.format(context.getString(R.string.account_selection_continue), name); + String givenName = account.getGivenName(); + String displayedName = + givenName != null && !givenName.isEmpty() ? givenName : account.getName(); + String btnText = String.format( + context.getString(R.string.account_selection_continue), displayedName); Button button = view.findViewById(R.id.account_selection_continue_btn); button.setText(btnText); } else if (key == ContinueButtonProperties.ON_CLICK_LISTENER) {
diff --git a/chrome/browser/ui/app_list/app_list_sort_browsertest.cc b/chrome/browser/ui/app_list/app_list_sort_browsertest.cc index 2015f3e3..a551613e3 100644 --- a/chrome/browser/ui/app_list/app_list_sort_browsertest.cc +++ b/chrome/browser/ui/app_list/app_list_sort_browsertest.cc
@@ -236,7 +236,7 @@ ash::ShellTestApi().SetTabletModeEnabledForTest(false); ash::AcceleratorController::Get()->PerformActionIfEnabled( ash::TOGGLE_APP_LIST_FULLSCREEN, {}); - app_list_test_api_.WaitForBubbleWindow(); + app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/false); ReorderByMouseClickAtContextMenu(ash::AppListSortOrder::kNameAlphabetical, MenuType::kAppListPageMenu); @@ -258,7 +258,7 @@ ash::ShellTestApi().SetTabletModeEnabledForTest(false); ash::AcceleratorController::Get()->PerformActionIfEnabled( ash::TOGGLE_APP_LIST_FULLSCREEN, {}); - app_list_test_api_.WaitForBubbleWindow(); + app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/false); // Move apps to one folder. const std::string folder_id = @@ -285,7 +285,7 @@ ash::ShellTestApi().SetTabletModeEnabledForTest(false); ash::AcceleratorController::Get()->PerformActionIfEnabled( ash::TOGGLE_APP_LIST_FULLSCREEN, {}); - app_list_test_api_.WaitForBubbleWindow(); + app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/false); ReorderByMouseClickAtContextMenu(ash::AppListSortOrder::kNameAlphabetical, MenuType::kAppListNonFolderItemMenu); @@ -308,7 +308,7 @@ ash::ShellTestApi().SetTabletModeEnabledForTest(false); ash::AcceleratorController::Get()->PerformActionIfEnabled( ash::TOGGLE_APP_LIST_FULLSCREEN, {}); - app_list_test_api_.WaitForBubbleWindow(); + app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/false); // Move apps to one folder. app_list_test_api_.CreateFolderWithApps({app1_id_, app2_id_, app3_id_}); @@ -337,7 +337,7 @@ ash::ShellTestApi().SetTabletModeEnabledForTest(false); ash::AcceleratorController::Get()->PerformActionIfEnabled( ash::TOGGLE_APP_LIST_FULLSCREEN, {}); - app_list_test_api_.WaitForBubbleWindow(); + app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/false); // Move apps to one folder. app_list_test_api_.CreateFolderWithApps({app1_id_, app2_id_, app3_id_}); @@ -354,3 +354,44 @@ EXPECT_EQ(GetAppIdsInOrdinalOrder(), std::vector<std::string>({app3_id_, app2_id_, app1_id_})); } + +// Verifies that clicking at the reorder undo toast should revert the temporary +// sorting order. +IN_PROC_BROWSER_TEST_F(AppListSortBrowserTest, UndoTemporarySorting) { + ash::ShellTestApi().SetTabletModeEnabledForTest(false); + + ash::AcceleratorController::Get()->PerformActionIfEnabled( + ash::TOGGLE_APP_LIST_FULLSCREEN, {}); + app_list_test_api_.WaitForBubbleWindow(/*wait_for_opening_animation=*/true); + + // Verify the default app order. + EXPECT_EQ(GetAppIdsInOrdinalOrder(), + std::vector<std::string>({app3_id_, app2_id_, app1_id_})); + + ReorderByMouseClickAtContextMenu(ash::AppListSortOrder::kNameAlphabetical, + MenuType::kAppListPageMenu); + EXPECT_EQ(GetAppIdsInOrdinalOrder(), + std::vector<std::string>({app1_id_, app2_id_, app3_id_})); + + // Ensure that the reorder undo toast's bounds update. + app_list_test_api_.GetTopLevelAppsGridView() + ->GetWidget() + ->LayoutRootViewIfNecessary(); + + // The toast should be visible. + EXPECT_TRUE(app_list_test_api_.GetBubbleReorderUndoToastVisibility()); + + // Mouse click at the undo button. + views::View* reorder_undo_toast_button = + app_list_test_api_.GetBubbleReorderUndoButton(); + event_generator_->MoveMouseTo( + reorder_undo_toast_button->GetBoundsInScreen().CenterPoint()); + event_generator_->ClickLeftButton(); + + // Verify that the default app order is recovered. + EXPECT_EQ(GetAppIdsInOrdinalOrder(), + std::vector<std::string>({app3_id_, app2_id_, app1_id_})); + + // The toast should be hidden. + EXPECT_FALSE(app_list_test_api_.GetBubbleReorderUndoToastVisibility()); +}
diff --git a/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc b/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc index 32bbe60..b29a89d 100644 --- a/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc +++ b/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc
@@ -860,6 +860,9 @@ app_list::reorder::GenerateReorderParamsForAppListItems(order, GetItems()); + // Send the update in the temporary sorting order to ash. + ash::AppListController::Get()->OnTemporarySortOrderChanged(order); + // Notify the ash side of the new positions. Updates are local-only because // `temporary_sort_manager_` is active. for (const auto& reorder_param : reorder_params) @@ -952,6 +955,10 @@ } temporary_sort_manager_.reset(); + + // Send the update in the temporary sorting order to ash. + ash::AppListController::Get()->OnTemporarySortOrderChanged( + /*new_order=*/absl::nullopt); } void ChromeAppListModelUpdater::RevertTemporaryPositions() {
diff --git a/chrome/browser/ui/app_list/search/os_settings_provider.cc b/chrome/browser/ui/app_list/search/os_settings_provider.cc index fc55ebb..13d84c1 100644 --- a/chrome/browser/ui/app_list/search/os_settings_provider.cc +++ b/chrome/browser/ui/app_list/search/os_settings_provider.cc
@@ -10,7 +10,6 @@ #include "ash/public/cpp/app_list/app_list_config.h" #include "ash/public/cpp/app_list/app_list_features.h" -#include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_macros.h" @@ -42,7 +41,7 @@ using Section = chromeos::settings::mojom::Section; constexpr char kOsSettingsResultPrefix[] = "os-settings://"; -constexpr double kScoreEps = 1.0e-5; +constexpr float kScoreEps = 1e-5f; constexpr size_t kNumRequestedResults = 5u; constexpr size_t kMaxShownResults = 2u; @@ -66,36 +65,34 @@ UMA_HISTOGRAM_ENUMERATION("Apps.AppList.OsSettingsProvider.Error", error); } -bool ContainsBetterAncestor(Subpage subpage, - const double score, - const chromeos::settings::Hierarchy* hierarchy, - const base::flat_map<Subpage, double>& subpages, - const base::flat_map<Section, double>& sections) { - // Returns whether or not a higher-scoring ancestor subpage or section of - // |subpage| is present within |subpages| or |sections|. +bool ContainsAncestor(Subpage subpage, + const chromeos::settings::Hierarchy* hierarchy, + const base::flat_set<Subpage>& subpages, + const base::flat_set<Section>& sections) { + // Returns whether or not an ancestor subpage or section of |subpage| is + // present within |subpages| or |sections|. const auto& metadata = hierarchy->GetSubpageMetadata(subpage); // Check parent subpage if one exists. if (metadata.parent_subpage) { const auto it = subpages.find(metadata.parent_subpage); - if ((it != subpages.end() && it->second >= score) || - ContainsBetterAncestor(metadata.parent_subpage.value(), score, - hierarchy, subpages, sections)) + if (it != subpages.end() || + ContainsAncestor(metadata.parent_subpage.value(), hierarchy, subpages, + sections)) return true; } // Check section. const auto it = sections.find(metadata.section); - return it != sections.end() && it->second >= score; + return it != sections.end(); } -bool ContainsBetterAncestor(Setting setting, - const double score, - const chromeos::settings::Hierarchy* hierarchy, - const base::flat_map<Subpage, double>& subpages, - const base::flat_map<Section, double>& sections) { - // Returns whether or not a higher-scoring ancestor subpage or section of - // |setting| is present within |subpages| or |sections|. +bool ContainsAncestor(Setting setting, + const chromeos::settings::Hierarchy* hierarchy, + const base::flat_set<Subpage>& subpages, + const base::flat_set<Section>& sections) { + // Returns whether or not an ancestor subpage or section of |setting| is + // present within |subpages| or |sections|. const auto& metadata = hierarchy->GetSettingMetadata(setting); // Check primary subpage only. Alternate subpages aren't used enough for the @@ -103,15 +100,14 @@ if (metadata.primary.second) { const auto parent_subpage = metadata.primary.second.value(); const auto it = subpages.find(parent_subpage); - if ((it != subpages.end() && it->second >= score) || - ContainsBetterAncestor(parent_subpage, score, hierarchy, subpages, - sections)) + if (it != subpages.end() || + ContainsAncestor(parent_subpage, hierarchy, subpages, sections)) return true; } // Check section. const auto it = sections.find(metadata.primary.first); - return it != sections.end() && it->second >= score; + return it != sections.end(); } } // namespace @@ -119,7 +115,7 @@ OsSettingsResult::OsSettingsResult( Profile* profile, const chromeos::settings::mojom::SearchResultPtr& result, - const double relevance_score, + const float relevance_score, const gfx::ImageSkia& icon, const std::u16string& query) : profile_(profile), url_path_(result->url_path_with_parameters) { @@ -302,7 +298,7 @@ int i = 0; for (const auto& result : FilterResults(query, sorted_results, hierarchy_)) { - const double score = 1.0 - i * kScoreEps; + const float score = 1.0f - i * kScoreEps; search_results.emplace_back(std::make_unique<OsSettingsResult>( profile_, result, score, icon_, last_query_)); ++i; @@ -365,8 +361,8 @@ const std::vector<chromeos::settings::mojom::SearchResultPtr>& results, const chromeos::settings::Hierarchy* hierarchy) { base::flat_set<std::string> seen_urls; - base::flat_map<Subpage, double> seen_subpages; - base::flat_map<Section, double> seen_sections; + base::flat_set<Subpage> seen_subpages; + base::flat_set<Section> seen_sections; std::vector<SettingsResultPtr> clean_results; for (const SettingsResultPtr& result : results) { @@ -395,26 +391,22 @@ seen_urls.insert(url); clean_results.push_back(result.Clone()); if (result->type == SettingsResultType::kSubpage) - seen_subpages.insert( - std::make_pair(result->id->get_subpage(), result->relevance_score)); + seen_subpages.insert(result->id->get_subpage()); if (result->type == SettingsResultType::kSection) - seen_sections.insert( - std::make_pair(result->id->get_section(), result->relevance_score)); + seen_sections.insert(result->id->get_section()); } // Iterate through the clean results a second time. Remove subpage or setting - // results that have a higher-scoring ancestor subpage or section also present - // in the results. + // results that have an ancestor subpage or section also present in the + // results. for (size_t i = 0; i < clean_results.size(); ++i) { const auto& result = clean_results[i]; if ((result->type == SettingsResultType::kSubpage && - ContainsBetterAncestor(result->id->get_subpage(), - result->relevance_score, hierarchy_, - seen_subpages, seen_sections)) || + ContainsAncestor(result->id->get_subpage(), hierarchy_, seen_subpages, + seen_sections)) || (result->type == SettingsResultType::kSetting && - ContainsBetterAncestor(result->id->get_setting(), - result->relevance_score, hierarchy_, - seen_subpages, seen_sections))) { + ContainsAncestor(result->id->get_setting(), hierarchy_, seen_subpages, + seen_sections))) { clean_results.erase(clean_results.begin() + i); --i; }
diff --git a/chrome/browser/ui/app_list/search/os_settings_provider.h b/chrome/browser/ui/app_list/search/os_settings_provider.h index 3424fc18..f3ff8aa 100644 --- a/chrome/browser/ui/app_list/search/os_settings_provider.h +++ b/chrome/browser/ui/app_list/search/os_settings_provider.h
@@ -41,7 +41,7 @@ public: OsSettingsResult(Profile* profile, const chromeos::settings::mojom::SearchResultPtr& result, - double relevance_score, + float relevance_score, const gfx::ImageSkia& icon, const std::u16string& query); ~OsSettingsResult() override;
diff --git a/chrome/browser/ui/app_list/test/test_app_list_controller.h b/chrome/browser/ui/app_list/test/test_app_list_controller.h index f14af6c..2a0b0d7 100644 --- a/chrome/browser/ui/app_list/test/test_app_list_controller.h +++ b/chrome/browser/ui/app_list/test/test_app_list_controller.h
@@ -35,6 +35,8 @@ aura::Window* GetWindow() override; bool IsVisible(const absl::optional<int64_t>& display_id) override; bool IsVisible() override; + void OnTemporarySortOrderChanged( + const absl::optional<ash::AppListSortOrder>& new_order) override {} }; } // namespace test
diff --git a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc index d5d21fd..ef989859 100644 --- a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc +++ b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
@@ -219,8 +219,12 @@ night_light_client_->Start(); if (ash::features::IsProjectorEnabled()) { - projector_app_client_ = std::make_unique<ProjectorAppClientImpl>(); projector_client_ = std::make_unique<ProjectorClientImpl>(); + + // ProjectorAppClient may trigger function that eventually use the + // ProjectorClient. Therefore, create the ProjectorAppClient after the + // ProjectorClient. + projector_app_client_ = std::make_unique<ProjectorAppClientImpl>(); } desks_templates_client_ = std::make_unique<DesksTemplatesClient>();
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc index 8e3fa8c..9dff61ea 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
@@ -2106,12 +2106,12 @@ EXPECT_TRUE(primary_label->GetVisible()); EXPECT_EQ(primary_label->GetText(), target_file_name); EXPECT_TRUE(secondary_label->GetVisible()); - WaitForText(secondary_label, u"Being scanned"); + WaitForText(secondary_label, u"Scanning"); EXPECT_EQ(secondary_label->GetEnabledColor(), gfx::kGoogleBlue300); // The accessible name should indicate that the download is being scanning. EXPECT_EQ(GetAccessibleName(download_chips.at(0)), - base::UTF16ToUTF8(u"Download being scanned " + target_file_name)); + base::UTF16ToUTF8(u"Download scanning " + target_file_name)); // Stop scanning and mark that the download is *not* malicious. UpdateInProgressDownloadIsDangerousMixedContentOrMightBeMalicious(
diff --git a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc index 08d24a5b..2b1fa82c 100644 --- a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc
@@ -58,6 +58,9 @@ base::Unretained(this))) { if (!base::FeatureList::IsEnabled( ash::features::kOnDeviceSpeechRecognition)) { + ash::ProjectorController::Get()->OnSpeechRecognitionAvailabilityChanged( + ash::SpeechRecognitionAvailability:: + kOnDeviceSpeechRecognitionNotSupported); return; }
diff --git a/chrome/browser/ui/ash/projector/projector_soda_installation_controller.cc b/chrome/browser/ui/ash/projector/projector_soda_installation_controller.cc index dcb650e0..44c2a2d4 100644 --- a/chrome/browser/ui/ash/projector/projector_soda_installation_controller.cc +++ b/chrome/browser/ui/ash/projector/projector_soda_installation_controller.cc
@@ -39,11 +39,21 @@ : app_client_(client), projector_controller_(projector_controller) { speech::SodaInstaller::GetInstance()->AddObserver(this); - bool recognition_available = - OnDeviceSpeechRecognizer::IsOnDeviceSpeechRecognizerAvailable( - GetLocale()); + if (!IsLanguageSupported(speech::GetLanguageCode(GetLocale()))) { + projector_controller_->OnSpeechRecognitionAvailabilityChanged( + ash::SpeechRecognitionAvailability::kUserLanguageNotSupported); + return; + } - projector_controller_->OnSpeechRecognitionAvailable(recognition_available); + if (!OnDeviceSpeechRecognizer::IsOnDeviceSpeechRecognizerAvailable( + GetLocale())) { + projector_controller_->OnSpeechRecognitionAvailabilityChanged( + ash::SpeechRecognitionAvailability::kSodaNotInstalled); + return; + } + + projector_controller_->OnSpeechRecognitionAvailabilityChanged( + ash::SpeechRecognitionAvailability::kAvailable); } ProjectorSodaInstallationController::~ProjectorSodaInstallationController() { @@ -86,7 +96,8 @@ if (!soda_installer->IsSodaInstalled(speech::GetLanguageCode(GetLocale()))) return; - projector_controller_->OnSpeechRecognitionAvailable(true); + projector_controller_->OnSpeechRecognitionAvailabilityChanged( + ash::SpeechRecognitionAvailability::kAvailable); app_client_->OnSodaInstalled(); }
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc index fe71852..d87440f 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -11,7 +11,9 @@ #include "base/check_op.h" #include "base/command_line.h" #include "base/i18n/rtl.h" +#include "base/memory/weak_ptr.h" #include "base/strings/utf_string_conversions.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/accessibility/accessibility_state_utils.h" #include "chrome/browser/ui/autofill/autofill_popup_view.h" @@ -19,6 +21,7 @@ #include "components/autofill/core/browser/ui/autofill_popup_delegate.h" #include "components/autofill/core/browser/ui/popup_item_ids.h" #include "components/autofill/core/browser/ui/suggestion.h" +#include "components/autofill/core/common/autofill_features.h" #include "components/password_manager/content/browser/content_password_manager_driver.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/native_web_keyboard_event.h" @@ -55,8 +58,15 @@ gfx::NativeView container_view, const gfx::RectF& element_bounds, base::i18n::TextDirection text_direction) { - if (previous.get() && previous->delegate_.get() == delegate.get() && + if (previous && previous->delegate_.get() == delegate.get() && previous->container_view() == container_view) { + if (base::FeatureList::IsEnabled( + features::kAutofillDelayPopupControllerDeletion)) { + // Cancels pending deletions of |previous| that were scheduled by + // HideViewAndDie(). Otherwise, |previous| would might be destroyed + // prematurely. + previous->weak_ptr_factory_.InvalidateWeakPtrs(); + } previous->SetElementBounds(element_bounds); previous->ClearState(); return previous; @@ -91,6 +101,8 @@ const std::vector<Suggestion>& suggestions, bool autoselect_first_suggestion, PopupType popup_type) { + // TODO(crbug.com/1277218): Remove when kAutofillDelayPopupControllerDeletion + // is launched. WeakPtr<AutofillPopupControllerImpl> weak_this = GetWeakPtr(); if (IsMouseLocked()) { @@ -575,7 +587,18 @@ view_->Hide(); } - delete this; + if (!base::FeatureList::IsEnabled( + features::kAutofillDelayPopupControllerDeletion)) { + delete this; + return; + } + + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce( + [](base::WeakPtr<AutofillPopupControllerImpl> weak_this) { + delete weak_this.get(); + }, + GetWeakPtr())); } bool AutofillPopupControllerImpl::IsMouseLocked() const {
diff --git a/chrome/browser/ui/dialogs/outdated_upgrade_bubble.cc b/chrome/browser/ui/dialogs/outdated_upgrade_bubble.cc index 36fbd92..1500f222 100644 --- a/chrome/browser/ui/dialogs/outdated_upgrade_bubble.cc +++ b/chrome/browser/ui/dialogs/outdated_upgrade_bubble.cc
@@ -11,6 +11,7 @@ #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_dialogs.h"
diff --git a/chrome/browser/ui/intent_picker_tab_helper.cc b/chrome/browser/ui/intent_picker_tab_helper.cc index b9c835e..75cd966a 100644 --- a/chrome/browser/ui/intent_picker_tab_helper.cc +++ b/chrome/browser/ui/intent_picker_tab_helper.cc
@@ -23,6 +23,10 @@ #include "ui/gfx/favicon_size.h" #include "ui/gfx/image/image.h" +#if defined(OS_CHROMEOS) +#include "chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h" +#endif + namespace { apps::mojom::AppType GetAppType(apps::PickerEntryType picker_entry_type) { @@ -63,6 +67,17 @@ IntentPickerTabHelper* tab_helper = FromWebContents(web_contents); if (!tab_helper) return; + +#if defined(OS_CHROMEOS) + if (should_show_icon && !tab_helper->should_show_icon_) { + // This point doesn't exactly match when the icon is shown in the UI (e.g. + // if the tab is not active), but recording here corresponds more closely to + // navigations which cause the icon to appear. + apps::IntentHandlingMetrics::RecordIntentPickerIconEvent( + apps::IntentHandlingMetrics::IntentPickerIconEvent::kIconShown); + } +#endif + tab_helper->should_show_icon_ = should_show_icon; Browser* browser = chrome::FindBrowserWithWebContents(web_contents); if (!browser)
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java index b679cc6..faa0c41 100644 --- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java +++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java
@@ -100,6 +100,8 @@ public static final int UMA_AUTOFILL_VIRTUAL_CARD_FILLED = 44; public static final int UMA_WINDOW_ERROR = 45; public static final int UMA_MODULE_INSTALL_FAILURE = 46; + public static final int UMA_PRICE_TRACKING_SUCCESS = 47; + public static final int UMA_PRICE_TRACKING_FAILURE = 48; private @Nullable SnackbarController mController; private CharSequence mText;
diff --git a/chrome/browser/ui/omnibox/omnibox_pedal_implementations.cc b/chrome/browser/ui/omnibox/omnibox_pedal_implementations.cc index 056c781..8d2b6c0 100644 --- a/chrome/browser/ui/omnibox/omnibox_pedal_implementations.cc +++ b/chrome/browser/ui/omnibox/omnibox_pedal_implementations.cc
@@ -8,31 +8,23 @@ #include "base/strings/utf_string_conversions.h" #include "build/branding_buildflags.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "components/omnibox/browser/actions/omnibox_pedal.h" #include "components/omnibox/browser/autocomplete_input.h" #include "components/omnibox/browser/autocomplete_provider_client.h" #include "components/omnibox/browser/buildflags.h" #include "components/omnibox/browser/omnibox_client.h" #include "components/omnibox/browser/omnibox_field_trial.h" +#include "components/omnibox/browser/vector_icons.h" #include "components/omnibox/common/omnibox_features.h" #include "components/omnibox/resources/grit/omnibox_pedal_synonyms.h" #include "components/prefs/pref_service.h" #include "components/strings/grit/components_strings.h" +#include "components/vector_icons/vector_icons.h" -// This carefully simplifies preprocessor condition usage below. -#if (!defined(OS_ANDROID) || BUILDFLAG(ENABLE_VR)) -#define SUPPORTS_DESKTOP_ICONS 1 -#else -#define SUPPORTS_DESKTOP_ICONS 0 -#endif - -#if SUPPORTS_DESKTOP_ICONS #if BUILDFLAG(GOOGLE_CHROME_BRANDING) #include "chrome/app/vector_icons/vector_icons.h" #endif -#include "components/omnibox/browser/vector_icons.h" // nogncheck -#include "components/vector_icons/vector_icons.h" // nogncheck -#endif // ============================================================================= @@ -581,11 +573,10 @@ IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_DOC)) {} -#if SUPPORTS_DESKTOP_ICONS + const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDriveDocsIcon; } -#endif std::vector<SynonymGroupSpec> SpecifySynonymGroups( bool locale_is_english) const override { @@ -626,11 +617,10 @@ IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SHEET)) {} -#if SUPPORTS_DESKTOP_ICONS + const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDriveSheetsIcon; } -#endif std::vector<SynonymGroupSpec> SpecifySynonymGroups( bool locale_is_english) const override { @@ -671,11 +661,10 @@ IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SLIDE)) {} -#if SUPPORTS_DESKTOP_ICONS + const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDriveSlidesIcon; } -#endif std::vector<SynonymGroupSpec> SpecifySynonymGroups( bool locale_is_english) const override { @@ -717,7 +706,7 @@ IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_CALENDAR_EVENT)) {} -#if SUPPORTS_DESKTOP_ICONS && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) const gfx::VectorIcon& GetVectorIcon() const override { return kGoogleCalendarIcon; } @@ -762,7 +751,7 @@ IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_SITE)) {} -#if SUPPORTS_DESKTOP_ICONS && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) const gfx::VectorIcon& GetVectorIcon() const override { return kGoogleSitesIcon; } @@ -808,7 +797,7 @@ IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_KEEP_NOTE)) {} -#if SUPPORTS_DESKTOP_ICONS && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) const gfx::VectorIcon& GetVectorIcon() const override { return kGoogleKeepNoteIcon; } @@ -853,11 +842,10 @@ IDS_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUGGESTION_CONTENTS, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_CREATE_GOOGLE_FORM)) {} -#if SUPPORTS_DESKTOP_ICONS + const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDriveFormsIcon; } -#endif std::vector<SynonymGroupSpec> SpecifySynonymGroups( bool locale_is_english) const override { @@ -939,7 +927,7 @@ IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_MANAGE_GOOGLE_ACCOUNT)) {} -#if SUPPORTS_DESKTOP_ICONS && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) const gfx::VectorIcon& GetVectorIcon() const override { return kGoogleSuperGIcon; } @@ -985,7 +973,7 @@ IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD_SUFFIX, IDS_ACC_OMNIBOX_PEDAL_CHANGE_GOOGLE_PASSWORD)) {} -#if SUPPORTS_DESKTOP_ICONS && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) const gfx::VectorIcon& GetVectorIcon() const override { return kGoogleSuperGIcon; } @@ -1032,11 +1020,9 @@ IDS_ACC_OMNIBOX_PEDAL_CLOSE_INCOGNITO_WINDOWS), GURL()) {} -#if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kIncognitoIcon; } -#endif std::vector<SynonymGroupSpec> SpecifySynonymGroups( bool locale_is_english) const override { @@ -1095,11 +1081,9 @@ IDS_ACC_OMNIBOX_PEDAL_PLAY_CHROME_DINO_GAME), GURL("chrome://dino")) {} -#if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { return omnibox::kDinoIcon; } -#endif std::vector<SynonymGroupSpec> SpecifySynonymGroups( bool locale_is_english) const override { @@ -1179,7 +1163,7 @@ return {}; } -#if SUPPORTS_DESKTOP_ICONS && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) const gfx::VectorIcon& GetVectorIcon() const override { return kGoogleSuperGIcon; } @@ -1218,7 +1202,7 @@ return {}; } -#if SUPPORTS_DESKTOP_ICONS && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) const gfx::VectorIcon& GetVectorIcon() const override { return kGoogleSuperGIcon; } @@ -1359,27 +1343,9 @@ return {}; } -#if SUPPORTS_DESKTOP_ICONS const gfx::VectorIcon& GetVectorIcon() const override { - // Prefer the idiomatic icon for each platform. This icon selection - // logic follows that of the sharing hub. - // See: chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc - // Note: When pedals are implemented on Android, we may want to - // consider using omnibox::kShareIcon (three dots with lines). - // TODO(orinj): Eliminate the code duplication here and get the - // same icon from SharingHubIconView::GetVectorIcon once pedals - // are moved to src-internal. -#if BUILDFLAG(IS_CHROMEOS_ASH) - return omnibox::kShareIcon; -#elif defined(OS_MAC) - return omnibox::kShareMacIcon; -#elif defined(OS_WIN) - return omnibox::kShareWinIcon; -#else - return omnibox::kSendIcon; -#endif + return GetSharingHubVectorIcon(); } -#endif bool IsReadyToTrigger( const AutocompleteInput& input, @@ -1571,6 +1537,18 @@ // ============================================================================= +const gfx::VectorIcon& GetSharingHubVectorIcon() { +#if BUILDFLAG(IS_CHROMEOS_ASH) + return omnibox::kShareIcon; +#elif defined(OS_MAC) + return omnibox::kShareMacIcon; +#elif defined(OS_WIN) + return omnibox::kShareWinIcon; +#else + return omnibox::kSendIcon; +#endif +} + std::unordered_map<OmniboxPedalId, scoped_refptr<OmniboxPedal>> GetPedalImplementations(bool incognito, bool testing) { std::unordered_map<OmniboxPedalId, scoped_refptr<OmniboxPedal>> pedals;
diff --git a/chrome/browser/ui/omnibox/omnibox_pedal_implementations.h b/chrome/browser/ui/omnibox/omnibox_pedal_implementations.h index 6cad598..de5ddf3c 100644 --- a/chrome/browser/ui/omnibox/omnibox_pedal_implementations.h +++ b/chrome/browser/ui/omnibox/omnibox_pedal_implementations.h
@@ -11,8 +11,17 @@ #include "components/omnibox/browser/actions/omnibox_pedal.h" #include "components/omnibox/browser/actions/omnibox_pedal_concepts.h" +namespace gfx { +struct VectorIcon; +} + // Returns the full set of encapsulated OmniboxPedal implementations. std::unordered_map<OmniboxPedalId, scoped_refptr<OmniboxPedal>> GetPedalImplementations(bool incognito, bool testing); +// This utility method is used by `SharingHubIconView` and its related Pedal +// (Chrome Action button) in the omnibox. It returns the sharing hub icon, +// taking platform into account. +const gfx::VectorIcon& GetSharingHubVectorIcon(); + #endif // CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_PEDAL_IMPLEMENTATIONS_H_
diff --git a/chrome/browser/ui/page_info/chrome_page_info_delegate.cc b/chrome/browser/ui/page_info/chrome_page_info_delegate.cc index 8e5484e..4c7b4702 100644 --- a/chrome/browser/ui/page_info/chrome_page_info_delegate.cc +++ b/chrome/browser/ui/page_info/chrome_page_info_delegate.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/page_info/chrome_page_info_delegate.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/bluetooth/bluetooth_chooser_context_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/content_settings/page_specific_content_settings_delegate.h"
diff --git a/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc b/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc index 6ab339f2..97bd6758 100644 --- a/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc +++ b/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc
@@ -6,6 +6,7 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/content_settings/chrome_content_settings_utils.h" #include "chrome/browser/page_info/about_this_site_service_factory.h" #include "chrome/browser/permissions/permission_manager_factory.h"
diff --git a/chrome/browser/ui/startup/infobar_utils.cc b/chrome/browser/ui/startup/infobar_utils.cc index 8c5e9b5..aeb1f88 100644 --- a/chrome/browser/ui/startup/infobar_utils.cc +++ b/chrome/browser/ui/startup/infobar_utils.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "build/buildflag.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/obsolete_system/obsolete_system.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index b4349ea..279afd0 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -34,7 +34,6 @@ #include "chrome/browser/history/history_tab_helper.h" #include "chrome/browser/history/top_sites_factory.h" #include "chrome/browser/history_clusters/history_clusters_tab_helper.h" -#include "chrome/browser/lite_video/lite_video_observer.h" #include "chrome/browser/login_detection/login_detection_tab_helper.h" #include "chrome/browser/media/history/media_history_contents_observer.h" #include "chrome/browser/media/media_engagement_service.h" @@ -302,7 +301,6 @@ HttpsOnlyModeTabHelper::CreateForWebContents(web_contents); webapps::InstallableManager::CreateForWebContents(web_contents); PrefetchProxyTabHelper::CreateForWebContents(web_contents); - LiteVideoObserver::MaybeCreateForWebContents(web_contents); login_detection::LoginDetectionTabHelper::MaybeCreateForWebContents( web_contents); if (MediaEngagementService::IsEnabled())
diff --git a/chrome/browser/ui/tabs/tab_strip_model.h b/chrome/browser/ui/tabs/tab_strip_model.h index bff863a..ba75b4a 100644 --- a/chrome/browser/ui/tabs/tab_strip_model.h +++ b/chrome/browser/ui/tabs/tab_strip_model.h
@@ -52,7 +52,7 @@ // TabStripModel // // A model & low level controller of a Browser Window tabstrip. Holds a vector -// of WebContentses, and provides an API for adding, removing and +// of WebContents, and provides an API for adding, removing and // shuffling them, as well as a higher level API for doing specific Browser- // related tasks like adding new Tabs from just a URL, etc. //
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc index df872d6..a27db54f 100644 --- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc +++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
@@ -291,9 +291,14 @@ }; PopupSeparator::PopupSeparator(AutofillPopupBaseView* popup) : popup_(popup) { - // Add some spacing between the the previous item and the separator. SetPreferredHeight(views::MenuConfig::instance().separator_thickness); - SetBorder(views::CreateEmptyBorder(GetContentsVerticalPadding(), 0, 0, 0)); + // Add some spacing between the previous item and the separator. + // If the feature AutofillVisualImprovementsForSuggestionUi is enabled, also + // add a padding after the separator. + // TODO(crbug.com/1274134): Clean up once improvements are launched. + SetBorder(views::CreateEmptyBorder( + GetContentsVerticalPadding(), 0, + UseImprovedSuggestionUi() ? GetContentsVerticalPadding() : 0, 0)); } void PopupSeparator::OnThemeChanged() { @@ -1104,8 +1109,12 @@ void AutofillPopupFooterView::RefreshStyle() { AutofillPopupItemView::RefreshStyle(); SetBorder(views::CreateSolidSidedBorder( - // If the footer is the first item, do not draw a separator line. - /*top=*/GetLineNumber() == 0 + // If the footer is the first item, do not draw a top border line that + // acts as a separator line. + // Also, if the feature to improve the suggestion UI is used, do not draw + // it. + // TODO(crbug.com/1274134): Clean up once improvements are launched. + /*top=*/(GetLineNumber() == 0 || UseImprovedSuggestionUi()) ? 0 : views::MenuConfig::instance().separator_thickness, /*left=*/0, @@ -1372,14 +1381,13 @@ return controller_->GetSuggestionAt(line_number).frontend_id; }; - // Process and add all the suggestions which are in the primary container. - // Collect all footer line numbers such that those can be added to the footer - // container below. DCHECK that all non-footer items are added before any - // footer items. - for (int current_line_number = 0; current_line_number < line_count; - ++current_line_number) { - int frontend_id = line_number_to_frontend_id(current_line_number); - switch (frontend_id) { + // Returns true if the item at |line_number| is a footer item. + // Returns false if the |line_number| exceeds the line count. + auto is_footer_item = [&](int line_number) { + if (line_number >= line_count) + return false; + + switch (line_number_to_frontend_id(line_number)) { case PopupItemId::POPUP_ITEM_ID_SCAN_CREDIT_CARD: case PopupItemId::POPUP_ITEM_ID_CREDIT_CARD_SIGNIN_PROMO: case PopupItemId::POPUP_ITEM_ID_PASSWORD_ACCOUNT_STORAGE_EMPTY: @@ -1390,42 +1398,52 @@ POPUP_ITEM_ID_PASSWORD_ACCOUNT_STORAGE_OPT_IN_AND_GENERATE: case PopupItemId::POPUP_ITEM_ID_SHOW_ACCOUNT_CARDS: case PopupItemId::POPUP_ITEM_ID_USE_VIRTUAL_CARD: - // TODO(crbug.com/1274134): Clean up once improvements are launched. - if (UseImprovedSuggestionUi()) { - DCHECK(footer_item_line_numbers.empty()); - rows_.push_back(AutofillPopupSuggestionView::Create( - this, current_line_number, frontend_id, - controller_->GetPopupType())); - } else { - footer_item_line_numbers.emplace_back(current_line_number); - } - break; + return UseImprovedSuggestionUi(); - // Collect all the footer lines for subsequent processing. case PopupItemId::POPUP_ITEM_ID_ALL_SAVED_PASSWORDS_ENTRY: case PopupItemId::POPUP_ITEM_ID_CLEAR_FORM: case PopupItemId::POPUP_ITEM_ID_AUTOFILL_OPTIONS: - footer_item_line_numbers.emplace_back(current_line_number); - break; + return true; - // Separator lines can be added both into the footer section and into the - // scrollable section before. + default: + return false; + } + }; + + // Process and add all the suggestions which are in the primary container. + // Collect all footer line numbers such that those can be added to the footer + // container below. DCHECK that all non-footer items are added before any + // footer items. + for (int current_line_number = 0; current_line_number < line_count; + ++current_line_number) { + // Collect all footer item numbers for subsequent processing. + if (is_footer_item(current_line_number)) { + footer_item_line_numbers.emplace_back(current_line_number); + continue; + } + + int frontend_id = line_number_to_frontend_id(current_line_number); + bool is_separator = frontend_id == PopupItemId::POPUP_ITEM_ID_SEPARATOR; + + // Non-footer items must precede footer items. + // The separator item can be part of both the footer or the scroll view. + DCHECK(footer_item_line_numbers.empty() || is_separator); + + switch (frontend_id) { + // The separator should be added to the scroll view only if the next item + // is not a footer item and the footer section has not been started yet. case PopupItemId::POPUP_ITEM_ID_SEPARATOR: - // Directly add the separator view unless the loop is already processing - // footer items. In this case, add it to the footer items for subsequent - // processing. - // TODO(crbug.com/1274134): Clean up once improvements are launched. - if (footer_item_line_numbers.empty()) { + if (footer_item_line_numbers.empty() && + !is_footer_item(current_line_number + 1)) { rows_.push_back( AutofillPopupSeparatorView::Create(this, current_line_number)); } else { - footer_item_line_numbers.emplace_back(current_line_number); + footer_item_line_numbers.push_back(current_line_number); } break; case PopupItemId::POPUP_ITEM_ID_MIXED_FORM_MESSAGE: case PopupItemId::POPUP_ITEM_ID_INSECURE_CONTEXT_PAYMENT_DISABLED_MESSAGE: - DCHECK(footer_item_line_numbers.empty()); rows_.push_back( AutofillPopupWarningView::Create(this, current_line_number)); break; @@ -1434,13 +1452,13 @@ case PopupItemId::POPUP_ITEM_ID_PASSWORD_ENTRY: case PopupItemId::POPUP_ITEM_ID_ACCOUNT_STORAGE_USERNAME_ENTRY: case PopupItemId::POPUP_ITEM_ID_ACCOUNT_STORAGE_PASSWORD_ENTRY: - DCHECK(footer_item_line_numbers.empty()); rows_.push_back(PasswordPopupSuggestionView::Create( this, current_line_number, frontend_id)); break; + // The default section contains most of the suggestions including + // addresses and credit cards. default: - DCHECK(footer_item_line_numbers.empty()); rows_.push_back(AutofillPopupSuggestionView::Create( this, current_line_number, frontend_id, controller_->GetPopupType())); @@ -1472,9 +1490,17 @@ // corners appear properly; on Mac, the clipping path will not apply // properly to a scrollable area. NOTE: GetContentsVerticalPadding is // guaranteed to return a size which accommodates the rounded corners. + // Add the padding to the top unconditionally, but only add a padding to the + // bottom if there are no footer items to follow or if the feature to + // improve the UI is not enabled. + // TODO(crbug.com/1274134): Clean up once improvements are launched. views::View* padding_wrapper = new views::View(); - padding_wrapper->SetBorder( - views::CreateEmptyBorder(gfx::Insets(GetContentsVerticalPadding(), 0))); + padding_wrapper->SetBorder(views::CreateEmptyBorder(gfx::Insets( + GetContentsVerticalPadding(), 0, + (!UseImprovedSuggestionUi() || footer_item_line_numbers.empty()) + ? GetContentsVerticalPadding() + : 0, + 0))); padding_wrapper->SetLayoutManager(std::make_unique<views::FillLayout>()); padding_wrapper->AddChildView(scroll_view_.get()); AddChildView(padding_wrapper);
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h index 01bef23..907fd3b 100644 --- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h +++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h
@@ -112,7 +112,8 @@ // Creates child views based on the suggestions given by |controller_|. // This method expects that all non-footer suggestions precede footer - // suggestions. Separator views can be both a footer or non-footer suggestion. + // suggestions. Separator views can be both a footer or non-footer suggestion + // but they are not allowed to be the first or last item. void CreateChildViews(); // Applies certain rounding rules to the given width, such as matching the
diff --git a/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc index 35190a2..4972f59 100644 --- a/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc
@@ -6,6 +6,7 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/test/base/in_process_browser_test.h" #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views_unittest.cc b/chrome/browser/ui/views/overlay/overlay_window_views_unittest.cc index ab008ba..64730eeb 100644 --- a/chrome/browser/ui/views/overlay/overlay_window_views_unittest.cc +++ b/chrome/browser/ui/views/overlay/overlay_window_views_unittest.cc
@@ -6,6 +6,7 @@ #include <utility> #include "base/memory/raw_ptr.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/ui/views/overlay/close_image_button.h" #include "chrome/browser/ui/views/overlay/overlay_window_views.h" #include "chrome/browser/ui/views/overlay/track_image_button.h"
diff --git a/chrome/browser/ui/views/profiles/profile_picker_interactive_uitest.cc b/chrome/browser/ui/views/profiles/profile_picker_interactive_uitest.cc index f3ba316..ea3b523 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_interactive_uitest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_interactive_uitest.cc
@@ -9,6 +9,7 @@ #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/ui/profile_picker.h"
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc index 9ce291fc..9557025 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -14,6 +14,7 @@ #include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/interstitials/chrome_settings_page_helper.h"
diff --git a/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc b/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc index e1e028d8..204d1f2 100644 --- a/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc +++ b/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc
@@ -8,6 +8,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/ui/browser_command_controller.h" +#include "chrome/browser/ui/omnibox/omnibox_pedal_implementations.h" #include "chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h" #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.h" #include "chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.h" @@ -83,15 +84,7 @@ PageActionIconView::ExecuteSource execute_source) {} const gfx::VectorIcon& SharingHubIconView::GetVectorIcon() const { -#if BUILDFLAG(IS_CHROMEOS_ASH) - return omnibox::kShareIcon; -#elif defined(OS_MAC) - return omnibox::kShareMacIcon; -#elif defined(OS_WIN) - return omnibox::kShareWinIcon; -#else - return omnibox::kSendIcon; -#endif + return GetSharingHubVectorIcon(); } bool SharingHubIconView::ShouldShowLabel() const {
diff --git a/chrome/browser/ui/views/side_search/side_search_browser_controller_browsertest.cc b/chrome/browser/ui/views/side_search/side_search_browser_controller_browsertest.cc index a6d1b4b..c85239f 100644 --- a/chrome/browser/ui/views/side_search/side_search_browser_controller_browsertest.cc +++ b/chrome/browser/ui/views/side_search/side_search_browser_controller_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/extensions/chrome_test_extension_loader.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h"
diff --git a/chrome/browser/ui/views/ssl_client_certificate_selector_browsertest.cc b/chrome/browser/ui/views/ssl_client_certificate_selector_browsertest.cc index c3902cb..d6ac696 100644 --- a/chrome/browser/ui/views/ssl_client_certificate_selector_browsertest.cc +++ b/chrome/browser/ui/views/ssl_client_certificate_selector_browsertest.cc
@@ -7,6 +7,7 @@ #include "base/memory/raw_ptr.h" #include "base/test/metrics/histogram_tester.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ssl/ssl_client_auth_metrics.h" #include "chrome/browser/ssl/ssl_client_auth_requestor_mock.h"
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc index dbfc270..2045433 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
@@ -47,6 +47,7 @@ #include "ui/base/pointer/touch_ui_controller.h" #include "ui/events/types/event_type.h" #include "ui/gfx/color_palette.h" +#include "ui/gfx/color_utils.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/paint_vector_icon.h" @@ -317,12 +318,14 @@ } void TabGroupEditorBubbleView::AddedToWidget() { - if (!move_menu_item_->GetEnabled()) { - const SkColor disabled_color = move_menu_item_->GetCurrentTextColor(); - move_menu_item_->SetImageModel( - views::Button::STATE_DISABLED, - ui::ImageModel::FromVectorIcon(kMoveGroupToNewWindowIcon, - disabled_color)); + for (auto menu_item : menu_items_) { + const bool enabled = menu_item->GetEnabled(); + const SkColor text_color = menu_item->GetCurrentTextColor(); + const SkColor icon_color = + enabled ? color_utils::DeriveDefaultIconColor(text_color) : text_color; + menu_item->SetImageModel( + enabled ? views::Button::STATE_NORMAL : views::Button::STATE_DISABLED, + ui::ImageModel::FromVectorIcon(kMoveGroupToNewWindowIcon, icon_color)); } } @@ -415,22 +418,23 @@ base::BindRepeating(&TabGroupEditorBubbleView::NewTabInGroupPressed, base::Unretained(this)), &kNewTabInGroupIcon)); + menu_items_.push_back(new_tab_menu_item); - AddChildView(CreateMenuItem( + menu_items_.push_back(AddChildView(CreateMenuItem( TAB_GROUP_HEADER_CXMENU_UNGROUP, l10n_util::GetStringUTF16(IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP), base::BindRepeating(&TabGroupEditorBubbleView::UngroupPressed, base::Unretained(this), header_view), - &kUngroupIcon)); + &kUngroupIcon))); - AddChildView(CreateMenuItem( + menu_items_.push_back(AddChildView(CreateMenuItem( TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP, l10n_util::GetStringUTF16(IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP), base::BindRepeating(&TabGroupEditorBubbleView::CloseGroupPressed, base::Unretained(this)), - &kCloseGroupIcon)); + &kCloseGroupIcon))); - move_menu_item_ = AddChildView( + auto* move_menu_item = AddChildView( CreateMenuItem(TAB_GROUP_HEADER_CXMENU_MOVE_GROUP_TO_NEW_WINDOW, l10n_util::GetStringUTF16( IDS_TAB_GROUP_HEADER_CXMENU_MOVE_GROUP_TO_NEW_WINDOW), @@ -438,9 +442,10 @@ &TabGroupEditorBubbleView::MoveGroupToNewWindowPressed, base::Unretained(this)), &kMoveGroupToNewWindowIcon)); - move_menu_item_->SetEnabled( + move_menu_item->SetEnabled( tab_strip_model->count() != tab_strip_model->group_model()->GetTabGroup(group_)->tab_count()); + menu_items_.push_back(move_menu_item); // Setting up the layout.
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h index 5b81363..30270e5 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h
@@ -132,7 +132,7 @@ raw_ptr<ColorPickerView> color_selector_; raw_ptr<views::ToggleButton> save_group_toggle_ = nullptr; - raw_ptr<views::LabelButton> move_menu_item_ = nullptr; + std::vector<raw_ptr<views::LabelButton>> menu_items_; // If true will use the |anchor_rect_| provided in the constructor, otherwise // fall back to using the anchor view bounds.
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc index 9e499c0b..bd4ce8a 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc
@@ -13,9 +13,16 @@ #include "chrome/browser/metrics/tab_count_metrics.h" #include "chrome/browser/ui/tabs/tab_style.h" #include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/location_bar/location_bar_view.h" +#include "chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h" +#include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" #include "chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h" #include "chrome/browser/ui/views/tabs/tab_hover_card_thumbnail_observer.h" #include "chrome/browser/ui/views/tabs/tab_strip.h" +#include "chrome/browser/ui/views/tabs/tab_strip_controller.h" +#include "components/omnibox/browser/omnibox_edit_model.h" +#include "components/omnibox/browser/omnibox_popup_view.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/events/event_observer.h" #include "ui/events/types/event_type.h" @@ -26,6 +33,33 @@ namespace { +// Fetches the Omnibox drop-down widget, or returns null if the drop-down is +// not visible. +void FixWidgetStackOrder(views::Widget* widget, const Browser* browser) { +#if defined(OS_LINUX) + // Ensure the hover card Widget assumes the highest z-order to avoid occlusion + // by other secondary UI Widgets (such as the omnibox Widget, see + // crbug.com/1226536). + widget->StackAtTop(); +#else // !deifned(OS_LINUX) + // Hover card should always render above omnibox (see crbug.com/1272106). + if (!browser || !widget) + return; + BrowserView* const browser_view = + BrowserView::GetBrowserViewForBrowser(browser); + if (!browser_view) + return; + auto* const popup_view = browser_view->GetLocationBarView() + ->omnibox_view() + ->model() + ->get_popup_view(); + if (!popup_view || !popup_view->IsOpen()) + return; + widget->StackAboveWidget( + static_cast<OmniboxPopupContentsView*>(popup_view)->GetWidget()); +#endif // !defined(OS_LINUX) +} + base::TimeDelta GetPreviewImageCaptureDelay( ThumbnailImage::CaptureReadiness readiness) { int ms = 0; @@ -302,13 +336,8 @@ UpdateCardContent(target_tab_); slide_animator_->UpdateTargetBounds(); MaybeStartThumbnailObservation(target_tab_, is_initial); - -#if defined(OS_LINUX) - // Ensure the hover card Widget assumes the highest z-order to avoid occlusion - // by other secondary UI Widgets (such as the omnibox Widget, see - // crbug.com/1226536). - hover_card_->GetWidget()->StackAtTop(); -#endif + FixWidgetStackOrder(hover_card_->GetWidget(), + tab_strip_->controller()->GetBrowser()); if (!is_initial || !UseAnimations()) { OnCardFullyVisible();
diff --git a/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc b/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc index 50cf2c69..f9bf692 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc +++ b/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc
@@ -333,8 +333,10 @@ auto close_bubble_and_run_callback = [](FeaturePromoBubbleView* view, base::RepeatingClosure callback, const ui::Event& event) { - view->CloseBubble(); - callback.Run(); + if (view->GetWidget()) + view->CloseBubble(); + if (callback) + callback.Run(); }; std::vector<views::Label*> labels;
diff --git a/chrome/browser/ui/web_applications/web_app_launch_utils.cc b/chrome/browser/ui/web_applications/web_app_launch_utils.cc index ebe20f9..7074c19 100644 --- a/chrome/browser/ui/web_applications/web_app_launch_utils.cc +++ b/chrome/browser/ui/web_applications/web_app_launch_utils.cc
@@ -8,6 +8,7 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "base/trace_event/base_tracing.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/app_mode/app_mode_utils.h" #include "chrome/browser/buildflags.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/webui/access_code_cast/BUILD.gn b/chrome/browser/ui/webui/access_code_cast/BUILD.gn index 0bc62a27..3ecb6af 100644 --- a/chrome/browser/ui/webui/access_code_cast/BUILD.gn +++ b/chrome/browser/ui/webui/access_code_cast/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//mojo/public/tools/bindings/mojom.gni") +import("//third_party/protobuf/proto_library.gni") assert(!is_android, "AccessCodeCast is not for android.")
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast.mojom b/chrome/browser/ui/webui/access_code_cast/access_code_cast.mojom index f607f969..36eafbc 100644 --- a/chrome/browser/ui/webui/access_code_cast/access_code_cast.mojom +++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast.mojom
@@ -21,11 +21,13 @@ AUTH_ERROR, HTTP_RESPONSE_CODE_ERROR, RESPONSE_MALFORMED, + EMPTY_RESPONSE, INVALID_ACCESS_CODE, ACCESS_CODE_NOT_FOUND, TOO_MANY_REQUESTS, SERVICE_NOT_PRESENT, - SERVER_ERROR + SERVER_ERROR, + SINK_CREATION_ERROR };
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc index 2edd359c..eb24c19 100644 --- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc +++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc
@@ -9,8 +9,13 @@ AccessCodeCastHandler::AccessCodeCastHandler( mojo::PendingReceiver<access_code_cast::mojom::PageHandler> page_handler, - mojo::PendingRemote<access_code_cast::mojom::Page> page) - : page_(std::move(page)), receiver_(this, std::move(page_handler)) {} + mojo::PendingRemote<access_code_cast::mojom::Page> page, + Profile* profile) + : page_(std::move(page)), + receiver_(this, std::move(page_handler)), + profile_(profile) { + DCHECK(profile_); +} AccessCodeCastHandler::~AccessCodeCastHandler() = default; @@ -18,10 +23,33 @@ const std::string& access_code, access_code_cast::mojom::CastDiscoveryMethod discovery_method, AddSinkCallback callback) { - // TODO (b/204571687): Complete communication with the discovery server once - // implementation has finished on the discovery server interface + add_sink_callback_ = std::move(callback); + + discovery_server_interface_ = + std::make_unique<AccessCodeCastDiscoveryInterface>(profile_, access_code); + + discovery_server_interface_->ValidateDiscoveryAccessCode( + base::BindOnce(&AccessCodeCastHandler::OnAccessCodeValidated, + weak_ptr_factory_.GetWeakPtr())); +} + +void AccessCodeCastHandler::OnAccessCodeValidated( + absl::optional<DiscoveryDevice> discovery_device, + access_code_cast::mojom::AddSinkResultCode result_code) { + if (discovery_device.has_value() && + result_code == access_code_cast::mojom::AddSinkResultCode::OK) { + CreateSink(std::move(add_sink_callback_)); + } else { + std::move(add_sink_callback_).Run(result_code); + } +} +void AccessCodeCastHandler::CreateSink(AddSinkCallback callback) { + // TODO (b/205184100): Complete implementation of creating a media sink after + // validation + NOTIMPLEMENTED(); } void AccessCodeCastHandler::CastToSink(CastToSinkCallback callback) { // TODO (b/204572061): Complete casting implementation + NOTIMPLEMENTED(); }
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.h b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.h index 33a7daf..203f5944 100644 --- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.h +++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.h
@@ -6,16 +6,23 @@ #define CHROME_BROWSER_UI_WEBUI_ACCESS_CODE_CAST_ACCESS_CODE_CAST_HANDLER_H_ #include "base/scoped_observation.h" +#include "chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.h" +#include "chrome/browser/media/router/discovery/access_code/discovery_resources.pb.h" #include "chrome/browser/ui/app_list/search/search_controller.h" #include "chrome/browser/ui/webui/access_code_cast/access_code_cast.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" +using ::media_router::AccessCodeCastDiscoveryInterface; + class AccessCodeCastHandler : public access_code_cast::mojom::PageHandler { public: + using DiscoveryDevice = chrome_browser_media::proto::DiscoveryDevice; + AccessCodeCastHandler( mojo::PendingReceiver<access_code_cast::mojom::PageHandler> page_handler, - mojo::PendingRemote<access_code_cast::mojom::Page> page); + mojo::PendingRemote<access_code_cast::mojom::Page> page, + Profile* profile); ~AccessCodeCastHandler() override; // access_code_cast::mojom::PageHandler overrides: @@ -27,12 +34,27 @@ void CastToSink(CastToSinkCallback callback) override; private: + void CreateSink(AddSinkCallback callback); + + void OnAccessCodeValidated( + absl::optional<DiscoveryDevice> discovery_device, + access_code_cast::mojom::AddSinkResultCode result_code); + mojo::Remote<access_code_cast::mojom::Page> page_; mojo::Receiver<access_code_cast::mojom::PageHandler> receiver_; + std::unique_ptr<AccessCodeCastDiscoveryInterface> discovery_server_interface_; + // The dispatcher only needs to cast to the most recent sink that was // added. Store this value after the call to add is made. const std::string recent_sink_id; + + // Used to fetch OAuth2 access tokens. + Profile* const profile_; + + AddSinkCallback add_sink_callback_; + + base::WeakPtrFactory<AccessCodeCastHandler> weak_ptr_factory_{this}; }; #endif // CHROME_BROWSER_UI_WEBUI_ACCESS_CODE_CAST_ACCESS_CODE_CAST_HANDLER_H_
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc b/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc index 7f7b790..89677d0 100644 --- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc +++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc
@@ -142,8 +142,8 @@ mojo::PendingReceiver<access_code_cast::mojom::PageHandler> receiver) { DCHECK(page); - page_handler_ = std::make_unique<AccessCodeCastHandler>(std::move(receiver), - std::move(page)); + page_handler_ = std::make_unique<AccessCodeCastHandler>( + std::move(receiver), std::move(page), Profile::FromWebUI(web_ui())); } WEB_UI_CONTROLLER_TYPE_IMPL(AccessCodeCastUI)
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc index ba14e76..e3be9c71 100644 --- a/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc +++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" +#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/common/chrome_features.h" #include "chrome/grit/generated_resources.h" #include "chrome/installer/util/google_update_settings.h" @@ -20,6 +21,7 @@ #include "chromeos/login/auth/challenge_response/cert_utils.h" #include "chromeos/login/auth/cryptohome_key_constants.h" #include "components/account_id/account_id.h" +#include "components/signin/public/identity_manager/account_info.h" #include "components/user_manager/known_user.h" #include "components/version_info/version_info.h" #include "content/public/browser/storage_partition.h" @@ -62,15 +64,31 @@ return user && user->using_saml(); } -InSessionPasswordSyncManager* GetInSessionPasswordSyncManager() { +Profile* GetActiveUserProfile() { const user_manager::User* user = user_manager::UserManager::Get()->GetActiveUser(); Profile* profile = chromeos::ProfileHelper::Get()->GetProfileByUser(user); + return profile; +} +std::string GetHostedDomain(const std::string& gaia_id) { + Profile* profile = GetActiveUserProfile(); + auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); + if (!identity_manager) { + return std::string(); + } + const AccountInfo account_info = + identity_manager->FindExtendedAccountInfoByGaiaId(gaia_id); + return account_info.hosted_domain; +} + +InSessionPasswordSyncManager* GetInSessionPasswordSyncManager() { + Profile* profile = GetActiveUserProfile(); return InSessionPasswordSyncManagerFactory::GetForProfile(profile); } const char kMainElement[] = "$(\'main-element\')."; +const char kIdpTestingDomain[] = "example.com"; } // namespace @@ -177,17 +195,21 @@ params.SetBoolean("dontResizeNonEmbeddedPages", false); params.SetBoolean("enableGaiaActionButtons", false); - std::string enterprise_enrollment_domain( - g_browser_process->platform_part() - ->browser_policy_connector_ash() - ->GetEnterpriseEnrollmentDomain()); + std::string hosted_domain = GetHostedDomain(context.gaia_id); - if (enterprise_enrollment_domain.empty()) { - enterprise_enrollment_domain = gaia::ExtractDomainName(context.email); + if (hosted_domain.empty()) { + LOG(ERROR) << "Couldn't get hosted_domain from account info."; + params.SetBoolean("doSamlRedirect", force_saml_redirect_for_testing_); + } else { + params.SetString( + "enterpriseEnrollmentDomain", + force_saml_redirect_for_testing_ ? kIdpTestingDomain : hosted_domain); + params.SetBoolean("doSamlRedirect", + force_saml_redirect_for_testing_ + ? true + : ShouldDoSamlRedirect(context.email)); } - params.SetString("enterpriseEnrollmentDomain", enterprise_enrollment_domain); - const std::string app_locale = g_browser_process->GetApplicationLocale(); DCHECK(!app_locale.empty()); params.SetString("hl", app_locale); @@ -195,8 +217,6 @@ params.SetString("gaiaId", context.gaia_id); params.SetBoolean("extractSamlPasswordAttributes", login::ExtractSamlPasswordAttributesEnabled()); - params.SetBoolean("doSamlRedirect", force_saml_redirect_for_testing_ ? - true : ShouldDoSamlRedirect(context.email)); params.SetString("clientVersion", version_info::GetVersionNumber()); params.SetBoolean("readOnlyEmail", true); @@ -216,9 +236,8 @@ CallJavascript("setWidth", base::Value(width)); } -void LockScreenReauthHandler::CallJavascript( - const std::string& function, - const base::Value& params) { +void LockScreenReauthHandler::CallJavascript(const std::string& function, + const base::Value& params) { CallJavascriptFunction(std::string(kMainElement) + function, params); }
diff --git a/chrome/browser/ui/webui/image_editor/image_editor.mojom b/chrome/browser/ui/webui/image_editor/image_editor.mojom index c02dd35..cb0568d 100644 --- a/chrome/browser/ui/webui/image_editor/image_editor.mojom +++ b/chrome/browser/ui/webui/image_editor/image_editor.mojom
@@ -7,14 +7,29 @@ import "skia/public/mojom/bitmap.mojom"; import "ui/gfx/geometry/mojom/geometry.mojom"; -// Represents user actions from the image editor. -// TODO (crbug/1269052) Create final end to end user action enum. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. enum EditAction { - kDraw = 0, - kCrop = 1, - kText = 2, - kSave = 3, - kShare = 4, + kToolCrop = 0, + kToolText = 1, + kToolDraw = 2, + kToolCircle = 3, + kToolRect = 4, + kToolLine = 5, + kToolArrow = 6, + kToolEmoji = 7, + kToolHighlight = 8, + kZoomIn = 9, + kZoomOut = 10, + kCopy = 11, + kSave = 12, + kShare = 13, + kTextColorChnage = 14, + kTextFontChange = 15, + kTextSizeChange = 16, + kDrawSizeChange = 17, + kDrawColorChange = 18, + kHighlightColorChange = 19, }; // Represents the Chrome side of the desktop screenshot editing session.
diff --git a/chrome/browser/ui/webui/image_editor/image_editor_ui.cc b/chrome/browser/ui/webui/image_editor/image_editor_ui.cc index fc34097..af79b6c 100644 --- a/chrome/browser/ui/webui/image_editor/image_editor_ui.cc +++ b/chrome/browser/ui/webui/image_editor/image_editor_ui.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/webui/image_editor/image_editor_ui.h" +#include "base/metrics/histogram_functions.h" #include "base/strings/stringprintf.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/image_editor/editor_untrusted_source.h" @@ -33,7 +34,7 @@ ImageEditorUI::~ImageEditorUI() = default; void ImageEditorUI::RecordUserAction(mojom::EditAction action) { - // TODO(crbug/1269052) add metrics code; + base::UmaHistogramEnumeration("Sharing.DesktopScreenshot.Action", action); } void ImageEditorUI::BindInterface(
diff --git a/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc b/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc index a333ebf..0326594 100644 --- a/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc
@@ -708,13 +708,14 @@ options.image_alias = image_alias; VLOG(1) << "image_alias = " << image_alias; } - if (options.image_server_url || options.image_alias) { - auto* crostini_manager = crostini::CrostiniManager::GetForProfile(profile_); - crostini_manager->SetRestartOptions(container_id, std::move(options)); - } + crostini::CrostiniManager::GetForProfile(profile_) + ->RestartCrostiniWithOptions(container_id, std::move(options), + base::DoNothing()); apps::mojom::IntentPtr intent = apps::mojom::Intent::New(); intent->extras = container_id.ToMap(); + + // The Terminal will be added as an observer to the above restart. LaunchTerminal(std::move(intent)); }
diff --git a/chrome/browser/ui/webui/settings/chromeos/languages_section.cc b/chrome/browser/ui/webui/settings/chromeos/languages_section.cc index 3714ad1..e3bfb7f 100644 --- a/chrome/browser/ui/webui/settings/chromeos/languages_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/languages_section.cc
@@ -565,10 +565,8 @@ } bool LanguagesSection::IsEmojiSuggestionAllowed() const { - return base::FeatureList::IsEnabled( - ::chromeos::features::kEmojiSuggestAddition) && - pref_service_->GetBoolean( - ::chromeos::prefs::kEmojiSuggestionEnterpriseAllowed); + return pref_service_->GetBoolean( + ::chromeos::prefs::kEmojiSuggestionEnterpriseAllowed); } bool LanguagesSection::IsSpellCheckEnabled() const {
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc index c007cc7..a822b7e 100644 --- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc +++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
@@ -18,6 +18,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/supports_user_data.h" #include "base/threading/sequenced_task_runner_handle.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/enterprise/browser_management/management_service_factory.h" #include "chrome/browser/enterprise/util/managed_browser_utils.h" #include "chrome/browser/policy/chrome_policy_conversions_client.h"
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc index 6437e2f..023e3c5 100644 --- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc +++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -17,6 +17,7 @@ #include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/threading/thread_task_runner_handle.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/enterprise/browser_management/management_service_factory.h" #include "chrome/browser/policy/cloud/user_policy_signin_service.h" #include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h"
diff --git a/chrome/browser/video_tutorials/internal/android/java/res/layout/language_picker.xml b/chrome/browser/video_tutorials/internal/android/java/res/layout/language_picker.xml index 756717c..f66e328 100644 --- a/chrome/browser/video_tutorials/internal/android/java/res/layout/language_picker.xml +++ b/chrome/browser/video_tutorials/internal/android/java/res/layout/language_picker.xml
@@ -9,7 +9,7 @@ android:id="@+id/language_picker" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/default_bg_color" + android:background="@macro/default_bg_color" android:paddingTop="12dp" > <org.chromium.ui.widget.ChromeImageButton
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc index 630485f..b959abb 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -955,7 +955,7 @@ void WebAppPublisherHelper::StoreShortcutId( const std::string& shortcut_id, - const WebApplicationShortcutsMenuItemInfo& menu_item_info) { + const WebAppShortcutsMenuItemInfo& menu_item_info) { shortcut_id_map_.emplace(shortcut_id, std::move(menu_item_info)); }
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h index 410bf4f..bc10d01e 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
@@ -213,9 +213,8 @@ std::string GenerateShortcutId(); - void StoreShortcutId( - const std::string& shortcut_id, - const WebApplicationShortcutsMenuItemInfo& menu_item_info); + void StoreShortcutId(const std::string& shortcut_id, + const WebAppShortcutsMenuItemInfo& menu_item_info); // Execute the user command from the context menu items. Currently // on the web app shortcut need to be execute in the publisher. @@ -381,7 +380,7 @@ apps::MediaRequests media_requests_; #endif - std::map<std::string, WebApplicationShortcutsMenuItemInfo> shortcut_id_map_; + std::map<std::string, WebAppShortcutsMenuItemInfo> shortcut_id_map_; ShortcutId::Generator shortcut_id_generator_; std::unique_ptr<web_app::LinkCapturingMigrationManager>
diff --git a/chrome/browser/web_applications/app_service/web_apps.cc b/chrome/browser/web_applications/app_service/web_apps.cc index 99627c2..e2cff0dd 100644 --- a/chrome/browser/web_applications/app_service/web_apps.cc +++ b/chrome/browser/web_applications/app_service/web_apps.cc
@@ -452,7 +452,7 @@ size_t menu_item_index = 0; - for (const WebApplicationShortcutsMenuItemInfo& menu_item_info : + for (const WebAppShortcutsMenuItemInfo& menu_item_info : web_app->shortcuts_menu_item_infos()) { const std::map<SquareSizePx, SkBitmap>* menu_item_icon_bitmaps = nullptr; if (menu_item_index < shortcuts_menu_icon_bitmaps.size()) {
diff --git a/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc b/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc index 0c2da47..20c64611 100644 --- a/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc +++ b/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc
@@ -272,7 +272,7 @@ size_t menu_item_index = 0; - for (const WebApplicationShortcutsMenuItemInfo& menu_item_info : + for (const WebAppShortcutsMenuItemInfo& menu_item_info : web_app->shortcuts_menu_item_infos()) { const std::map<SquareSizePx, SkBitmap>* menu_item_icon_bitmaps = nullptr; if (menu_item_index < shortcuts_menu_icon_bitmaps.size()) {
diff --git a/chrome/browser/web_applications/os_integration_manager.cc b/chrome/browser/web_applications/os_integration_manager.cc index 4933cba3..ab51ff2 100644 --- a/chrome/browser/web_applications/os_integration_manager.cc +++ b/chrome/browser/web_applications/os_integration_manager.cc
@@ -455,8 +455,7 @@ void OsIntegrationManager::RegisterShortcutsMenu( const AppId& app_id, - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos, + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps, ResultCallback callback) { if (!ShouldRegisterShortcutsMenuWithOs()) {
diff --git a/chrome/browser/web_applications/os_integration_manager.h b/chrome/browser/web_applications/os_integration_manager.h index f0f9995..b956400 100644 --- a/chrome/browser/web_applications/os_integration_manager.h +++ b/chrome/browser/web_applications/os_integration_manager.h
@@ -234,8 +234,7 @@ ResultCallback callback); virtual void RegisterShortcutsMenu( const AppId& app_id, - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos, + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps, ResultCallback callback); virtual void ReadAllShortcutsMenuIconsAndRegisterShortcutsMenu(
diff --git a/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.cc b/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.cc index ff5a9e6f..7cc452e 100644 --- a/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.cc +++ b/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.cc
@@ -561,13 +561,13 @@ GenerateWebApplicationInfoForTestApp(); info->title = u"Shortcuts"; { - WebApplicationShortcutsMenuItemInfo menu_item; + WebAppShortcutsMenuItemInfo menu_item; menu_item.name = u"One"; menu_item.url = GURL("chrome://test-system-app/pwa.html#one"); info->shortcuts_menu_item_infos.push_back(std::move(menu_item)); } { - WebApplicationShortcutsMenuItemInfo menu_item; + WebAppShortcutsMenuItemInfo menu_item; menu_item.name = u"Two"; menu_item.url = GURL("chrome://test-system-app/pwa.html#two"); info->shortcuts_menu_item_infos.push_back(std::move(menu_item));
diff --git a/chrome/browser/web_applications/test/mock_os_integration_manager.h b/chrome/browser/web_applications/test/mock_os_integration_manager.h index 9fe6d91..4ee8b98 100644 --- a/chrome/browser/web_applications/test/mock_os_integration_manager.h +++ b/chrome/browser/web_applications/test/mock_os_integration_manager.h
@@ -46,7 +46,7 @@ MOCK_METHOD(void, RegisterShortcutsMenu, (const AppId& app_id, - const std::vector<WebApplicationShortcutsMenuItemInfo>& + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps, ResultCallback callback),
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc index eb79eb8..e9668fd4 100644 --- a/chrome/browser/web_applications/test/web_app_test_utils.cc +++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -148,26 +148,25 @@ return url_handlers; } -std::vector<WebApplicationShortcutsMenuItemInfo> -CreateRandomShortcutsMenuItemInfos(const GURL& scope, RandomHelper& random) { +std::vector<WebAppShortcutsMenuItemInfo> CreateRandomShortcutsMenuItemInfos( + const GURL& scope, + RandomHelper& random) { const uint32_t suffix = random.next_uint(); - std::vector<WebApplicationShortcutsMenuItemInfo> shortcuts_menu_item_infos; + std::vector<WebAppShortcutsMenuItemInfo> shortcuts_menu_item_infos; for (int i = random.next_uint(4) + 1; i >= 0; --i) { std::string suffix_str = base::NumberToString(suffix) + base::NumberToString(i); - WebApplicationShortcutsMenuItemInfo shortcut_info; + WebAppShortcutsMenuItemInfo shortcut_info; shortcut_info.url = scope.Resolve("shortcut" + suffix_str); shortcut_info.name = base::UTF8ToUTF16("shortcut" + suffix_str); - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> shortcut_icons_any; - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> - shortcut_icons_maskable; - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> - shortcut_icons_monochrome; + std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_icons_any; + std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_icons_maskable; + std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_icons_monochrome; for (int j = random.next_uint(4) + 1; j >= 0; --j) { std::string icon_suffix_str = suffix_str + base::NumberToString(j); - WebApplicationShortcutsMenuItemInfo::Icon shortcut_icon; + WebAppShortcutsMenuItemInfo::Icon shortcut_icon; shortcut_icon.url = scope.Resolve("/shortcuts/icon" + icon_suffix_str); // Within each shortcut_icons_*, square_size_px must be unique. shortcut_icon.square_size_px = (j * 10) + random.next_uint(10);
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc index fe375c6..bbf1f772 100644 --- a/chrome/browser/web_applications/web_app.cc +++ b/chrome/browser/web_applications/web_app.cc
@@ -305,8 +305,7 @@ } void WebApp::SetShortcutsMenuItemInfos( - std::vector<WebApplicationShortcutsMenuItemInfo> - shortcuts_menu_item_infos) { + std::vector<WebAppShortcutsMenuItemInfo> shortcuts_menu_item_infos) { shortcuts_menu_item_infos_ = std::move(shortcuts_menu_item_infos); }
diff --git a/chrome/browser/web_applications/web_app.h b/chrome/browser/web_applications/web_app.h index 0539ddd..d61254a 100644 --- a/chrome/browser/web_applications/web_app.h +++ b/chrome/browser/web_applications/web_app.h
@@ -210,8 +210,8 @@ } // Represents the "shortcuts" field in the manifest. - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos() const { + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos() + const { return shortcuts_menu_item_infos_; } @@ -281,8 +281,7 @@ void SetDownloadedIconSizes(IconPurpose purpose, SortedSizesPx sizes); void SetIsGeneratedIcon(bool is_generated_icon); void SetShortcutsMenuItemInfos( - std::vector<WebApplicationShortcutsMenuItemInfo> - shortcuts_menu_item_infos); + std::vector<WebAppShortcutsMenuItemInfo> shortcuts_menu_item_infos); void SetDownloadedShortcutsMenuIconsSizes(std::vector<IconSizes> icon_sizes); void SetFileHandlers(apps::FileHandlers file_handlers); void SetFileHandlerApprovalState(ApiApprovalState approval_state); @@ -354,7 +353,7 @@ SortedSizesPx downloaded_icon_sizes_monochrome_; SortedSizesPx downloaded_icon_sizes_maskable_; bool is_generated_icon_ = false; - std::vector<WebApplicationShortcutsMenuItemInfo> shortcuts_menu_item_infos_; + std::vector<WebAppShortcutsMenuItemInfo> shortcuts_menu_item_infos_; std::vector<IconSizes> downloaded_shortcuts_menu_icons_sizes_; apps::FileHandlers file_handlers_; absl::optional<apps::ShareTarget> share_target_;
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc index beee6e4..78ab097 100644 --- a/chrome/browser/web_applications/web_app_database.cc +++ b/chrome/browser/web_applications/web_app_database.cc
@@ -422,14 +422,14 @@ } } - for (const WebApplicationShortcutsMenuItemInfo& shortcut_info : + for (const WebAppShortcutsMenuItemInfo& shortcut_info : web_app.shortcuts_menu_item_infos()) { WebAppShortcutsMenuItemInfoProto* shortcut_info_proto = local_data->add_shortcuts_menu_item_infos(); shortcut_info_proto->set_name(base::UTF16ToUTF8(shortcut_info.name)); shortcut_info_proto->set_url(shortcut_info.url.spec()); for (IconPurpose purpose : kIconPurposes) { - for (const WebApplicationShortcutsMenuItemInfo::Icon& icon_info : + for (const WebAppShortcutsMenuItemInfo::Icon& icon_info : shortcut_info.GetShortcutIconInfosForPurpose(purpose)) { sync_pb::WebAppIconInfo* shortcut_icon_info_proto; switch (purpose) { @@ -851,10 +851,10 @@ web_app->SetShareTarget(std::move(share_target)); } - std::vector<WebApplicationShortcutsMenuItemInfo> shortcuts_menu_item_infos; + std::vector<WebAppShortcutsMenuItemInfo> shortcuts_menu_item_infos; for (const auto& shortcut_info_proto : local_data.shortcuts_menu_item_infos()) { - WebApplicationShortcutsMenuItemInfo shortcut_info; + WebAppShortcutsMenuItemInfo shortcut_info; shortcut_info.name = base::UTF8ToUTF16(shortcut_info_proto.name()); shortcut_info.url = GURL(shortcut_info_proto.url()); for (IconPurpose purpose : kIconPurposes) { @@ -877,9 +877,9 @@ break; } - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> manifest_icons; + std::vector<WebAppShortcutsMenuItemInfo::Icon> manifest_icons; for (const auto& icon_info_proto : *shortcut_manifest_icons) { - WebApplicationShortcutsMenuItemInfo::Icon shortcut_icon_info; + WebAppShortcutsMenuItemInfo::Icon shortcut_icon_info; shortcut_icon_info.square_size_px = icon_info_proto.size_in_px(); shortcut_icon_info.url = GURL(icon_info_proto.url()); manifest_icons.emplace_back(std::move(shortcut_icon_info));
diff --git a/chrome/browser/web_applications/web_app_install_task_unittest.cc b/chrome/browser/web_applications/web_app_install_task_unittest.cc index 77a411a..31cb2a2 100644 --- a/chrome/browser/web_applications/web_app_install_task_unittest.cc +++ b/chrome/browser/web_applications/web_app_install_task_unittest.cc
@@ -1568,8 +1568,8 @@ web_app_info->theme_color = theme_color; web_app_info->title = u"App Name"; - WebApplicationShortcutsMenuItemInfo shortcut_item; - WebApplicationShortcutsMenuItemInfo::Icon icon; + WebAppShortcutsMenuItemInfo shortcut_item; + WebAppShortcutsMenuItemInfo::Icon icon; shortcut_item.name = base::UTF8ToUTF16(shortcut_name); shortcut_item.url = shortcut_url;
diff --git a/chrome/browser/web_applications/web_app_install_utils.cc b/chrome/browser/web_applications/web_app_install_utils.cc index 2b08d3e..dcea922 100644 --- a/chrome/browser/web_applications/web_app_install_utils.cc +++ b/chrome/browser/web_applications/web_app_install_utils.cc
@@ -100,24 +100,24 @@ // Populate |web_app_info|'s shortcuts_menu_item_infos vector using the // blink::Manifest's shortcuts vector. -std::vector<WebApplicationShortcutsMenuItemInfo> ToWebAppShortcutsMenuItemInfos( +std::vector<WebAppShortcutsMenuItemInfo> ToWebAppShortcutsMenuItemInfos( const std::vector<blink::Manifest::ShortcutItem>& shortcuts) { - std::vector<WebApplicationShortcutsMenuItemInfo> web_app_shortcut_infos; + std::vector<WebAppShortcutsMenuItemInfo> web_app_shortcut_infos; web_app_shortcut_infos.reserve(shortcuts.size()); int num_shortcut_icons = 0; for (const auto& shortcut : shortcuts) { - WebApplicationShortcutsMenuItemInfo shortcut_info; + WebAppShortcutsMenuItemInfo shortcut_info; shortcut_info.name = shortcut.name; shortcut_info.url = shortcut.url; for (IconPurpose purpose : kIconPurposes) { - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> shortcut_icons; + std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_icons; for (const auto& icon : shortcut.icons) { DCHECK(!icon.purpose.empty()); if (!base::Contains(icon.purpose, purpose)) continue; - WebApplicationShortcutsMenuItemInfo::Icon info; + WebAppShortcutsMenuItemInfo::Icon info; // Filter out non-square or too large icons. auto valid_size_it = std::find_if(
diff --git a/chrome/browser/web_applications/web_app_install_utils_unittest.cc b/chrome/browser/web_applications/web_app_install_utils_unittest.cc index 45c0bf8e..41748b3 100644 --- a/chrome/browser/web_applications/web_app_install_utils_unittest.cc +++ b/chrome/browser/web_applications/web_app_install_utils_unittest.cc
@@ -470,7 +470,7 @@ EXPECT_EQ(1u, web_app_info.shortcuts_menu_item_infos[0] .GetShortcutIconInfosForPurpose(IconPurpose::ANY) .size()); - WebApplicationShortcutsMenuItemInfo::Icon web_app_shortcut_icon = + WebAppShortcutsMenuItemInfo::Icon web_app_shortcut_icon = web_app_info.shortcuts_menu_item_infos[0].GetShortcutIconInfosForPurpose( IconPurpose::ANY)[0]; EXPECT_EQ(kIconUrl2, web_app_shortcut_icon.url); @@ -548,7 +548,7 @@ UpdateWebAppInfoFromManifest( manifest, GURL("http://www.chromium.org/manifest.json"), &web_app_info); - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> all_icons; + std::vector<WebAppShortcutsMenuItemInfo::Icon> all_icons; for (const auto& shortcut : web_app_info.shortcuts_menu_item_infos) { for (const auto& icon_info : shortcut.GetShortcutIconInfosForPurpose(IconPurpose::ANY)) { @@ -602,7 +602,7 @@ UpdateWebAppInfoFromManifest( manifest, GURL("http://www.chromium.org/manifest.json"), &web_app_info); - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> all_icons; + std::vector<WebAppShortcutsMenuItemInfo::Icon> all_icons; for (const auto& shortcut : web_app_info.shortcuts_menu_item_infos) { for (const auto& icon_info : shortcut.GetShortcutIconInfosForPurpose(IconPurpose::ANY)) { @@ -616,13 +616,12 @@ // their own map in web_app_info. TEST(WebAppInstallUtils, PopulateShortcutItemIcons) { WebApplicationInfo web_app_info; - WebApplicationShortcutsMenuItemInfo::Icon icon; + WebAppShortcutsMenuItemInfo::Icon icon; const GURL kIconUrl1("http://www.chromium.org/shortcuts/icon1.png"); { - WebApplicationShortcutsMenuItemInfo shortcut_item; - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> - shortcut_manifest_icons; + WebAppShortcutsMenuItemInfo shortcut_item; + std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_manifest_icons; shortcut_item.name = std::u16string(kShortcutItemName) + u"1"; shortcut_item.url = GURL("http://www.chromium.org/shortcuts/action"); icon.url = kIconUrl1; @@ -635,9 +634,8 @@ const GURL kIconUrl2("http://www.chromium.org/shortcuts/icon2.png"); { - WebApplicationShortcutsMenuItemInfo shortcut_item; - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> - shortcut_manifest_icons; + WebAppShortcutsMenuItemInfo shortcut_item; + std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_manifest_icons; shortcut_item.name = std::u16string(kShortcutItemName) + u"2"; icon.url = kIconUrl1; icon.square_size_px = kIconSize;
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc index dc5d682..dd43ab4 100644 --- a/chrome/browser/web_applications/web_app_registrar.cc +++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -675,11 +675,11 @@ : SortedSizesPx(); } -std::vector<WebApplicationShortcutsMenuItemInfo> +std::vector<WebAppShortcutsMenuItemInfo> WebAppRegistrar::GetAppShortcutsMenuItemInfos(const AppId& app_id) const { auto* web_app = GetAppById(app_id); return web_app ? web_app->shortcuts_menu_item_infos() - : std::vector<WebApplicationShortcutsMenuItemInfo>(); + : std::vector<WebAppShortcutsMenuItemInfo>(); } std::vector<IconSizes> WebAppRegistrar::GetAppDownloadedShortcutsMenuIconsSizes(
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h index ee375fc..e67b391 100644 --- a/chrome/browser/web_applications/web_app_registrar.h +++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -173,7 +173,7 @@ // Returns the "shortcuts" field from the app manifest, use // |WebAppIconManager| to load shortcuts menu icons bitmaps data. - std::vector<WebApplicationShortcutsMenuItemInfo> GetAppShortcutsMenuItemInfos( + std::vector<WebAppShortcutsMenuItemInfo> GetAppShortcutsMenuItemInfos( const AppId& app_id) const; // Represents which icon sizes we successfully downloaded from the
diff --git a/chrome/browser/web_applications/web_app_shortcut_manager.cc b/chrome/browser/web_applications/web_app_shortcut_manager.cc index 888a4a1..1b4efb7a 100644 --- a/chrome/browser/web_applications/web_app_shortcut_manager.cc +++ b/chrome/browser/web_applications/web_app_shortcut_manager.cc
@@ -174,8 +174,7 @@ void WebAppShortcutManager::RegisterShortcutsMenuWithOs( const AppId& app_id, - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos, + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (!web_app::ShouldRegisterShortcutsMenuWithOs() || @@ -253,7 +252,7 @@ const AppId& app_id, RegisterShortcutsMenuCallback callback, ShortcutsMenuIconBitmaps shortcuts_menu_icon_bitmaps) { - std::vector<WebApplicationShortcutsMenuItemInfo> shortcuts_menu_item_infos = + std::vector<WebAppShortcutsMenuItemInfo> shortcuts_menu_item_infos = registrar_->GetAppShortcutsMenuItemInfos(app_id); if (!shortcuts_menu_item_infos.empty()) { RegisterShortcutsMenuWithOs(app_id, shortcuts_menu_item_infos, @@ -384,8 +383,8 @@ } #if defined(OS_LINUX) - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos = app->shortcuts_menu_item_infos(); + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos = + app->shortcuts_menu_item_infos(); int num_entries = std::min(static_cast<int>(shortcuts_menu_item_infos.size()), kMaxApplicationDockMenuItems); for (int i = 0; i < num_entries; i++) {
diff --git a/chrome/browser/web_applications/web_app_shortcut_manager.h b/chrome/browser/web_applications/web_app_shortcut_manager.h index ae91c21..ed88708 100644 --- a/chrome/browser/web_applications/web_app_shortcut_manager.h +++ b/chrome/browser/web_applications/web_app_shortcut_manager.h
@@ -94,8 +94,7 @@ // registration flow. void RegisterShortcutsMenuWithOs( const AppId& app_id, - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos, + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps); void UnregisterShortcutsMenuWithOs(const AppId& app_id);
diff --git a/chrome/browser/web_applications/web_app_shortcuts_menu.cc b/chrome/browser/web_applications/web_app_shortcuts_menu.cc index bc12b93b..55a45aac 100644 --- a/chrome/browser/web_applications/web_app_shortcuts_menu.cc +++ b/chrome/browser/web_applications/web_app_shortcuts_menu.cc
@@ -19,8 +19,7 @@ const AppId& app_id, const base::FilePath& profile_path, const base::FilePath& shortcut_data_dir, - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos, + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps) { NOTIMPLEMENTED(); DCHECK(ShouldRegisterShortcutsMenuWithOs());
diff --git a/chrome/browser/web_applications/web_app_shortcuts_menu.h b/chrome/browser/web_applications/web_app_shortcuts_menu.h index b50bd5b..9fbf200d 100644 --- a/chrome/browser/web_applications/web_app_shortcuts_menu.h +++ b/chrome/browser/web_applications/web_app_shortcuts_menu.h
@@ -25,8 +25,7 @@ const AppId& app_id, const base::FilePath& profile_path, const base::FilePath& shortcut_data_dir, - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos, + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps); // Deletes the ShortcutsMenu from the OS. This should be called during the
diff --git a/chrome/browser/web_applications/web_app_shortcuts_menu_win.cc b/chrome/browser/web_applications/web_app_shortcuts_menu_win.cc index 140e78d..13813baf 100644 --- a/chrome/browser/web_applications/web_app_shortcuts_menu_win.cc +++ b/chrome/browser/web_applications/web_app_shortcuts_menu_win.cc
@@ -126,8 +126,7 @@ const AppId& app_id, const base::FilePath& profile_path, const base::FilePath& shortcut_data_dir, - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos, + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps) { // Each entry in the ShortcutsMenu (JumpList on Windows) needs an icon in .ico // format. This helper writes these icon files to disk as a series of @@ -172,8 +171,7 @@ const AppId& app_id, const base::FilePath& profile_path, const base::FilePath& shortcut_data_dir, - const std::vector<WebApplicationShortcutsMenuItemInfo>& - shortcuts_menu_item_infos, + const std::vector<WebAppShortcutsMenuItemInfo>& shortcuts_menu_item_infos, const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps) { base::ThreadPool::PostTask( FROM_HERE, {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
diff --git a/chrome/browser/web_applications/web_application_info.cc b/chrome/browser/web_applications/web_application_info.cc index 9034aad9..1b56eb6f 100644 --- a/chrome/browser/web_applications/web_application_info.cc +++ b/chrome/browser/web_applications/web_application_info.cc
@@ -121,55 +121,49 @@ return any.empty() && maskable.empty() && monochrome.empty(); } -// WebApplicationShortcutsMenuItemInfo::Icon -WebApplicationShortcutsMenuItemInfo::Icon::Icon() = default; +// WebAppShortcutsMenuItemInfo::Icon +WebAppShortcutsMenuItemInfo::Icon::Icon() = default; -WebApplicationShortcutsMenuItemInfo::Icon::Icon( - const WebApplicationShortcutsMenuItemInfo::Icon&) = default; +WebAppShortcutsMenuItemInfo::Icon::Icon( + const WebAppShortcutsMenuItemInfo::Icon&) = default; -WebApplicationShortcutsMenuItemInfo::Icon::Icon( - WebApplicationShortcutsMenuItemInfo::Icon&&) = default; +WebAppShortcutsMenuItemInfo::Icon::Icon(WebAppShortcutsMenuItemInfo::Icon&&) = + default; -WebApplicationShortcutsMenuItemInfo::Icon::~Icon() = default; +WebAppShortcutsMenuItemInfo::Icon::~Icon() = default; -WebApplicationShortcutsMenuItemInfo::Icon& -WebApplicationShortcutsMenuItemInfo::Icon::operator=( - const WebApplicationShortcutsMenuItemInfo::Icon&) = default; +WebAppShortcutsMenuItemInfo::Icon& WebAppShortcutsMenuItemInfo::Icon::operator=( + const WebAppShortcutsMenuItemInfo::Icon&) = default; -WebApplicationShortcutsMenuItemInfo::Icon& -WebApplicationShortcutsMenuItemInfo::Icon::operator=( - WebApplicationShortcutsMenuItemInfo::Icon&&) = default; +WebAppShortcutsMenuItemInfo::Icon& WebAppShortcutsMenuItemInfo::Icon::operator=( + WebAppShortcutsMenuItemInfo::Icon&&) = default; -base::Value WebApplicationShortcutsMenuItemInfo::Icon::AsDebugValue() const { +base::Value WebAppShortcutsMenuItemInfo::Icon::AsDebugValue() const { base::Value root(base::Value::Type::DICTIONARY); root.SetStringKey("url", url.spec()); root.SetIntKey("square_size_px", square_size_px); return root; } -// WebApplicationShortcutsMenuItemInfo -WebApplicationShortcutsMenuItemInfo::WebApplicationShortcutsMenuItemInfo() = - default; +// WebAppShortcutsMenuItemInfo +WebAppShortcutsMenuItemInfo::WebAppShortcutsMenuItemInfo() = default; -WebApplicationShortcutsMenuItemInfo::WebApplicationShortcutsMenuItemInfo( - const WebApplicationShortcutsMenuItemInfo& other) = default; +WebAppShortcutsMenuItemInfo::WebAppShortcutsMenuItemInfo( + const WebAppShortcutsMenuItemInfo& other) = default; -WebApplicationShortcutsMenuItemInfo::WebApplicationShortcutsMenuItemInfo( - WebApplicationShortcutsMenuItemInfo&&) noexcept = default; +WebAppShortcutsMenuItemInfo::WebAppShortcutsMenuItemInfo( + WebAppShortcutsMenuItemInfo&&) noexcept = default; -WebApplicationShortcutsMenuItemInfo::~WebApplicationShortcutsMenuItemInfo() = - default; +WebAppShortcutsMenuItemInfo::~WebAppShortcutsMenuItemInfo() = default; -WebApplicationShortcutsMenuItemInfo& -WebApplicationShortcutsMenuItemInfo::operator=( - const WebApplicationShortcutsMenuItemInfo&) = default; +WebAppShortcutsMenuItemInfo& WebAppShortcutsMenuItemInfo::operator=( + const WebAppShortcutsMenuItemInfo&) = default; -WebApplicationShortcutsMenuItemInfo& -WebApplicationShortcutsMenuItemInfo::operator=( - WebApplicationShortcutsMenuItemInfo&&) noexcept = default; +WebAppShortcutsMenuItemInfo& WebAppShortcutsMenuItemInfo::operator=( + WebAppShortcutsMenuItemInfo&&) noexcept = default; -const std::vector<WebApplicationShortcutsMenuItemInfo::Icon>& -WebApplicationShortcutsMenuItemInfo::GetShortcutIconInfosForPurpose( +const std::vector<WebAppShortcutsMenuItemInfo::Icon>& +WebAppShortcutsMenuItemInfo::GetShortcutIconInfosForPurpose( IconPurpose purpose) const { switch (purpose) { case IconPurpose::MONOCHROME: @@ -181,10 +175,9 @@ } } -void WebApplicationShortcutsMenuItemInfo::SetShortcutIconInfosForPurpose( +void WebAppShortcutsMenuItemInfo::SetShortcutIconInfosForPurpose( IconPurpose purpose, - std::vector<WebApplicationShortcutsMenuItemInfo::Icon> - shortcut_manifest_icons) { + std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_manifest_icons) { switch (purpose) { case IconPurpose::ANY: any = std::move(shortcut_manifest_icons); @@ -198,7 +191,7 @@ } } -base::Value WebApplicationShortcutsMenuItemInfo::AsDebugValue() const { +base::Value WebAppShortcutsMenuItemInfo::AsDebugValue() const { base::Value root(base::Value::Type::DICTIONARY); root.SetStringKey("name", name); @@ -210,7 +203,7 @@ for (IconPurpose purpose : kIconPurposes) { base::Value& purpose_list = *icons.SetKey( ConvertToString(purpose), base::Value(base::Value::Type::LIST)); - for (const WebApplicationShortcutsMenuItemInfo::Icon& icon : + for (const WebAppShortcutsMenuItemInfo::Icon& icon : GetShortcutIconInfosForPurpose(purpose)) { purpose_list.Append(icon.AsDebugValue()); } @@ -259,14 +252,14 @@ icon_sizes2.monochrome); } -bool operator==(const WebApplicationShortcutsMenuItemInfo::Icon& icon1, - const WebApplicationShortcutsMenuItemInfo::Icon& icon2) { +bool operator==(const WebAppShortcutsMenuItemInfo::Icon& icon1, + const WebAppShortcutsMenuItemInfo::Icon& icon2) { return std::tie(icon1.url, icon1.square_size_px) == std::tie(icon2.url, icon2.square_size_px); } -bool operator==(const WebApplicationShortcutsMenuItemInfo& shortcut_info1, - const WebApplicationShortcutsMenuItemInfo& shortcut_info2) { +bool operator==(const WebAppShortcutsMenuItemInfo& shortcut_info1, + const WebAppShortcutsMenuItemInfo& shortcut_info2) { return std::tie(shortcut_info1.name, shortcut_info1.url, shortcut_info1.any, shortcut_info1.maskable, shortcut_info1.monochrome) == std::tie(shortcut_info2.name, shortcut_info2.url, shortcut_info2.any,
diff --git a/chrome/browser/web_applications/web_application_info.h b/chrome/browser/web_applications/web_application_info.h index 2e8ba207..2fbc940 100644 --- a/chrome/browser/web_applications/web_application_info.h +++ b/chrome/browser/web_applications/web_application_info.h
@@ -112,7 +112,7 @@ // Structure used when creating app icon shortcuts menu and for downloading // associated shortcut icons when supported by OS platform (eg. Windows). -struct WebApplicationShortcutsMenuItemInfo { +struct WebAppShortcutsMenuItemInfo { struct Icon { Icon(); Icon(const Icon&); @@ -126,16 +126,13 @@ SquareSizePx square_size_px = 0; }; - WebApplicationShortcutsMenuItemInfo(); - WebApplicationShortcutsMenuItemInfo( - const WebApplicationShortcutsMenuItemInfo&); - WebApplicationShortcutsMenuItemInfo( - WebApplicationShortcutsMenuItemInfo&&) noexcept; - ~WebApplicationShortcutsMenuItemInfo(); - WebApplicationShortcutsMenuItemInfo& operator=( - const WebApplicationShortcutsMenuItemInfo&); - WebApplicationShortcutsMenuItemInfo& operator=( - WebApplicationShortcutsMenuItemInfo&&) noexcept; + WebAppShortcutsMenuItemInfo(); + WebAppShortcutsMenuItemInfo(const WebAppShortcutsMenuItemInfo&); + WebAppShortcutsMenuItemInfo(WebAppShortcutsMenuItemInfo&&) noexcept; + ~WebAppShortcutsMenuItemInfo(); + WebAppShortcutsMenuItemInfo& operator=(const WebAppShortcutsMenuItemInfo&); + WebAppShortcutsMenuItemInfo& operator=( + WebAppShortcutsMenuItemInfo&&) noexcept; const std::vector<Icon>& GetShortcutIconInfosForPurpose( IconPurpose purpose) const; @@ -270,7 +267,7 @@ // Set of shortcuts menu item infos populated using shortcuts specified in the // manifest. - std::vector<WebApplicationShortcutsMenuItemInfo> shortcuts_menu_item_infos; + std::vector<WebAppShortcutsMenuItemInfo> shortcuts_menu_item_infos; // Vector of shortcut icon bitmaps keyed by their square size. The index of a // given |IconBitmaps| matches that of the shortcut in @@ -309,10 +306,10 @@ bool operator==(const IconSizes& icon_sizes1, const IconSizes& icon_sizes2); -bool operator==(const WebApplicationShortcutsMenuItemInfo::Icon& icon1, - const WebApplicationShortcutsMenuItemInfo::Icon& icon2); +bool operator==(const WebAppShortcutsMenuItemInfo::Icon& icon1, + const WebAppShortcutsMenuItemInfo::Icon& icon2); -bool operator==(const WebApplicationShortcutsMenuItemInfo& shortcut_info1, - const WebApplicationShortcutsMenuItemInfo& shortcut_info2); +bool operator==(const WebAppShortcutsMenuItemInfo& shortcut_info1, + const WebAppShortcutsMenuItemInfo& shortcut_info2); #endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APPLICATION_INFO_H_
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 8e99a6ee..eddd8abb 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1638964457-04459cc64f73d0079dd6eb3e07d73c7c110807a1.profdata +chrome-linux-main-1638986360-dcb686fe2f19a20ce5033972698466fe68264518.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 43c682a8..363ed1a 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1638964457-bd8a9b2ab15f95714c0b36e7d608ffdc3d061088.profdata +chrome-mac-main-1638986360-7d63757599394184ed9617721896f34e955250f0.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 6535bf2c..04122683 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1638943101-b07a4b7633ea48f17e03818723e23748e9ea70a0.profdata +chrome-win32-main-1638986360-007651e391bc80b4eefd0805c96788200d0402f5.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 52d20e49..0a1ed5e8 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1638975444-336691a69f954ff560514f94e1b6d15d096843b5.profdata +chrome-win64-main-1638997181-a0f2b7a8d601f1546ca540a6d84ebc0757124df4.profdata
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index 57ee233..b4f5e2b 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -711,7 +711,6 @@ "cache_stats_recorder.mojom", "chrome_render_frame.mojom", "draggable_regions.mojom", - "lite_video_service.mojom", "media/webrtc_logging.mojom", "metrics.mojom", "net/net_error_page_support.mojom", @@ -720,7 +719,6 @@ "network_easter_egg.mojom", "open_search_description_document_handler.mojom", "plugin.mojom", - "previews_resource_loading_hints.mojom", "renderer_configuration.mojom", "subresource_redirect_service.mojom", "sync_encryption_keys_extension.mojom",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 35768c430..451887d 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -679,11 +679,6 @@ &kLinuxLowMemoryMonitor, "critical_level", 255}; #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) -// Enables LiteVideos, a data-saving optimization that throttles media requests -// to reduce the bitrate of adaptive media streams. Only for Lite mode users -// (formerly DataSaver). -const base::Feature kLiteVideo{"LiteVideo", base::FEATURE_DISABLED_BY_DEFAULT}; - #if defined(OS_MAC) // Uses NSFullSizeContentViewWindowMask where available instead of adding our // own views to the window frame. This is a temporary kill switch, it can be
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 6986c2c0..28d0744 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -449,9 +449,6 @@ extern const base::FeatureParam<int> kLinuxLowMemoryMonitorCriticalLevel; #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) -COMPONENT_EXPORT(CHROME_FEATURES) -extern const base::Feature kLiteVideo; - #if defined(OS_MAC) COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kMacFullSizeContentView;
diff --git a/chrome/common/lite_video_service.mojom b/chrome/common/lite_video_service.mojom deleted file mode 100644 index 6fe57f5c..0000000 --- a/chrome/common/lite_video_service.mojom +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module lite_video.mojom; - -// This per-frame interface is implemented in the browser process and is used by the -// renderer to notify the state of litevideo. -interface LiteVideoService { - // Report the response size of a resource load that was throttled by - // LiteVideo. The stats will be aggregated per tab and used to estimate - // the amount of data saved. - NotifyThrottledDataUse(uint64 response_bytes); -}; -
diff --git a/chrome/common/previews_resource_loading_hints.mojom b/chrome/common/previews_resource_loading_hints.mojom deleted file mode 100644 index 6024746..0000000 --- a/chrome/common/previews_resource_loading_hints.mojom +++ /dev/null
@@ -1,36 +0,0 @@ -// 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 previews.mojom; - -import "mojo/public/mojom/base/time.mojom"; - -// LiteVideo hints passed by the browser to renderers. Send at most once -// per render frame from browser to renderer. The hints are provided to the -// renderer and aid in optimizing media data use. -struct LiteVideoHint { - // The number of kilobytes for media to be observed before starting to - // throttle requests. - int64 kilobytes_to_buffer_before_throttle; - // The network downlink bandwidth target in kilobytes per second used to - // calculate the throttling delay on media requests. - int64 target_downlink_bandwidth_kbps; - // The network downlink rtt target in milliseconds used to calculate the - // throttling delay on media requests. - mojo_base.mojom.TimeDelta target_downlink_rtt_latency; - // The maximum delay a throttle can introduce for a media request. - mojo_base.mojom.TimeDelta max_throttling_delay; -}; - -// Render process implemented interface that receives hints from the browser -// about how to load resources. -interface PreviewsResourceLoadingHintsReceiver { - // Sends the hints for reducing the data-costs of streaming - // media/videos from the browser to renderers. - SetLiteVideoHint(LiteVideoHint lite_video_hint); - - // Notifies the renderers that active media request throttles should be stopped - // and not allow any new throttles. - StopThrottlingMediaRequests(); -};
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn index ddcd1476..cb4edc6 100644 --- a/chrome/renderer/BUILD.gn +++ b/chrome/renderer/BUILD.gn
@@ -65,12 +65,6 @@ "chrome_render_thread_observer.h", "custom_menu_commands.h", "instant_restricted_id_cache.h", - "lite_video/lite_video_hint_agent.cc", - "lite_video/lite_video_hint_agent.h", - "lite_video/lite_video_url_loader_throttle.cc", - "lite_video/lite_video_url_loader_throttle.h", - "lite_video/lite_video_util.cc", - "lite_video/lite_video_util.h", "loadtimes_extension_bindings.cc", "loadtimes_extension_bindings.h", "media/chrome_key_systems.cc", @@ -97,8 +91,6 @@ "plugins/pdf_plugin_placeholder.h", "plugins/plugin_uma.cc", "plugins/plugin_uma.h", - "previews/resource_loading_hints_agent.cc", - "previews/resource_loading_hints_agent.h", "subresource_redirect/login_robots_compression_metrics.cc", "subresource_redirect/login_robots_compression_metrics.h", "subresource_redirect/login_robots_decider_agent.cc",
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index b8cd3aa29..bddf772 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -46,8 +46,6 @@ #include "chrome/renderer/chrome_content_settings_agent_delegate.h" #include "chrome/renderer/chrome_render_frame_observer.h" #include "chrome/renderer/chrome_render_thread_observer.h" -#include "chrome/renderer/lite_video/lite_video_hint_agent.h" -#include "chrome/renderer/lite_video/lite_video_util.h" #include "chrome/renderer/loadtimes_extension_bindings.h" #include "chrome/renderer/media/flash_embed_rewrite.h" #include "chrome/renderer/media/webrtc_logging_agent_impl.h" @@ -57,7 +55,6 @@ #include "chrome/renderer/plugins/non_loadable_plugin_placeholder.h" #include "chrome/renderer/plugins/pdf_plugin_placeholder.h" #include "chrome/renderer/plugins/plugin_uma.h" -#include "chrome/renderer/previews/resource_loading_hints_agent.h" #include "chrome/renderer/subresource_redirect/login_robots_decider_agent.h" #include "chrome/renderer/subresource_redirect/public_image_hints_decider_agent.h" #include "chrome/renderer/subresource_redirect/subresource_redirect_params.h" @@ -684,11 +681,6 @@ subresource_filter_agent->Initialize(); } - if (lite_video::IsLiteVideoEnabled()) - new lite_video::LiteVideoHintAgent(render_frame); - - new previews::ResourceLoadingHintsAgent(associated_interfaces, render_frame); - if (subresource_redirect::ShouldEnablePublicImageHintsBasedCompression()) { new subresource_redirect::PublicImageHintsDeciderAgent( associated_interfaces, render_frame);
diff --git a/chrome/renderer/lite_video/DEPS b/chrome/renderer/lite_video/DEPS deleted file mode 100644 index 6511c3d..0000000 --- a/chrome/renderer/lite_video/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ -"+services/network/test", -]
diff --git a/chrome/renderer/lite_video/DIR_METADATA b/chrome/renderer/lite_video/DIR_METADATA deleted file mode 100644 index 3c8435d..0000000 --- a/chrome/renderer/lite_video/DIR_METADATA +++ /dev/null
@@ -1,3 +0,0 @@ -monorail: { - component: "Internals>Network>DataUse" -}
diff --git a/chrome/renderer/lite_video/OWNERS b/chrome/renderer/lite_video/OWNERS deleted file mode 100644 index 2783dea..0000000 --- a/chrome/renderer/lite_video/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://components/data_reduction_proxy/OWNERS
diff --git a/chrome/renderer/lite_video/lite_video_hint_agent.cc b/chrome/renderer/lite_video/lite_video_hint_agent.cc deleted file mode 100644 index 998b601d..0000000 --- a/chrome/renderer/lite_video/lite_video_hint_agent.cc +++ /dev/null
@@ -1,117 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/renderer/lite_video/lite_video_hint_agent.h" - -#include "base/metrics/histogram_macros.h" -#include "chrome/renderer/lite_video/lite_video_util.h" -#include "content/public/renderer/render_frame.h" -#include "services/network/public/mojom/url_response_head.mojom.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" - -namespace lite_video { - -LiteVideoHintAgent::LiteVideoHintAgent(content::RenderFrame* render_frame) - : content::RenderFrameObserver(render_frame), - content::RenderFrameObserverTracker<LiteVideoHintAgent>(render_frame) { - DCHECK(render_frame); -} - -LiteVideoHintAgent::~LiteVideoHintAgent() = default; - -void LiteVideoHintAgent::OnDestruct() { - delete this; -} - -void LiteVideoHintAgent::AddThrottle(LiteVideoURLLoaderThrottle* throttle) { - DCHECK(HasLiteVideoHint()); - active_throttles_.insert(throttle); - UMA_HISTOGRAM_COUNTS("LiteVideo.HintAgent.ActiveThrottleSize", - active_throttles_.size()); -} - -void LiteVideoHintAgent::RemoveThrottle(LiteVideoURLLoaderThrottle* throttle) { - active_throttles_.erase(throttle); -} - -base::TimeDelta LiteVideoHintAgent::CalculateLatencyForResourceResponse( - const network::mojom::URLResponseHead& response_head) { - if (!HasLiteVideoHint()) - return base::TimeDelta(); - - if (active_throttles_.size() >= GetMaxActiveThrottles()) - return base::TimeDelta(); - - if (ShouldDisableLiteVideoForCacheControlNoTransform() && - response_head.headers && - response_head.headers->HasHeaderValue("cache-control", "no-transform")) { - return base::TimeDelta(); - } - - auto recv_bytes = GetContentLength(response_head); - if (!recv_bytes && !ShouldThrottleLiteVideoMissingContentLength()) { - return base::TimeDelta(); - } - - if (kilobytes_buffered_before_throttle_ < - *kilobytes_to_buffer_before_throttle_) { - kilobytes_buffered_before_throttle_ += recv_bytes.value_or(0) / 1024; - return base::TimeDelta(); - } - - // The total RTT for this media response should be based on how much time it - // took to transfer the packet in the target bandwidth, and the per RTT - // latency. For example, assuming 100KBPS target bandwidth and target RTT of - // 1 second, an 400KB response should have total delay of 5 seconds (400/100 - // + 1). - auto delay_for_throttled_response = - base::Seconds(recv_bytes.value_or(0) / - (*target_downlink_bandwidth_kbps_ * 1024.0)) + - *target_downlink_rtt_latency_; - auto response_delay = - response_head.response_time - response_head.request_time; - if (delay_for_throttled_response <= response_delay) - return base::TimeDelta(); - - return std::min(delay_for_throttled_response - response_delay, - *max_throttling_delay_); -} - -bool LiteVideoHintAgent::HasLiteVideoHint() const { - return target_downlink_bandwidth_kbps_ && target_downlink_rtt_latency_ && - kilobytes_to_buffer_before_throttle_ && max_throttling_delay_; -} - -void LiteVideoHintAgent::SetLiteVideoHint( - previews::mojom::LiteVideoHintPtr lite_video_hint) { - if (!lite_video_hint) - return; - target_downlink_bandwidth_kbps_ = - lite_video_hint->target_downlink_bandwidth_kbps; - kilobytes_to_buffer_before_throttle_ = - lite_video_hint->kilobytes_to_buffer_before_throttle; - target_downlink_rtt_latency_ = lite_video_hint->target_downlink_rtt_latency; - max_throttling_delay_ = lite_video_hint->max_throttling_delay; - LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.HintAgent.HasHint", true); -} - -void LiteVideoHintAgent::StopThrottlingAndClearHints() { - for (auto* throttle : active_throttles_) - throttle->ResumeIfThrottled(); - kilobytes_buffered_before_throttle_ = 0; - target_downlink_bandwidth_kbps_.reset(); - kilobytes_to_buffer_before_throttle_.reset(); - target_downlink_rtt_latency_.reset(); - max_throttling_delay_.reset(); -} - -void LiteVideoHintAgent::NotifyThrottledDataUse(uint64_t response_bytes) { - if (!lite_video_service_remote_) { - render_frame()->GetRemoteAssociatedInterfaces()->GetInterface( - &lite_video_service_remote_); - } - lite_video_service_remote_->NotifyThrottledDataUse(response_bytes); -} - -} // namespace lite_video
diff --git a/chrome/renderer/lite_video/lite_video_hint_agent.h b/chrome/renderer/lite_video/lite_video_hint_agent.h deleted file mode 100644 index 943cd27..0000000 --- a/chrome/renderer/lite_video/lite_video_hint_agent.h +++ /dev/null
@@ -1,101 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_HINT_AGENT_H_ -#define CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_HINT_AGENT_H_ - -#include "base/time/time.h" -#include "chrome/common/lite_video_service.mojom.h" -#include "chrome/common/previews_resource_loading_hints.mojom.h" -#include "chrome/renderer/lite_video/lite_video_url_loader_throttle.h" -#include "content/public/renderer/render_frame_observer.h" -#include "content/public/renderer/render_frame_observer_tracker.h" -#include "mojo/public/cpp/bindings/associated_remote.h" -#include "url/gurl.h" - -namespace lite_video { - -// The renderer-side agent for LiteVideos. There is one instance per frame (main -// frame and subframes), to receive LiteVideo throttling parameters from -// browser. -class LiteVideoHintAgent - : public content::RenderFrameObserver, - public content::RenderFrameObserverTracker<LiteVideoHintAgent> { - public: - explicit LiteVideoHintAgent(content::RenderFrame* render_frame); - ~LiteVideoHintAgent() override; - - LiteVideoHintAgent(const LiteVideoHintAgent&) = delete; - LiteVideoHintAgent& operator=(const LiteVideoHintAgent&) = delete; - - // Returns how much time the media response should get throttled. This is the - // difference between the target latency based on target bandwidth, RTT, and - // the latency the response has already spent. Empty duration is returned when - // the response should not be throttled. The first - // |kilobytes_buffered_before_throttle_| for this render frame should not be - // throttled. This function also updates - // |kilobytes_buffered_before_throttle_|. - base::TimeDelta CalculateLatencyForResourceResponse( - const network::mojom::URLResponseHead& response_head); - - // Updates the LiteVideo throttling parameters for calculating - // the latency to add to media requests. - void SetLiteVideoHint(previews::mojom::LiteVideoHintPtr lite_video_hint); - - // Returns whether |this| has been provided a LiteVideoHint and - // has the parameters needed for calculating the throttling latency. - bool HasLiteVideoHint() const; - - void AddThrottle(LiteVideoURLLoaderThrottle* throttle); - void RemoveThrottle(LiteVideoURLLoaderThrottle* throttle); - - const std::set<LiteVideoURLLoaderThrottle*>& GetActiveThrottlesForTesting() - const { - return active_throttles_; - } - - // Stop throttling permanently. Resumes the current throttled media requests - // immediately, and clears the hints so that throttling does not happen for - // new requests. - void StopThrottlingAndClearHints(); - - // Notifies the response bytes that were throttled by LiteVideo. - void NotifyThrottledDataUse(uint64_t response_bytes); - - private: - friend class LiteVideoHintAgentTest; - - // content::RenderFrameObserver overrides - void OnDestruct() override; - - // The network downlink bandwidth target in kilobytes per second used to - // calculate the throttling delay on media requests - absl::optional<int> target_downlink_bandwidth_kbps_; - - // The network downlink rtt target latency used to calculate the - // throttling delay on media requests - absl::optional<base::TimeDelta> target_downlink_rtt_latency_; - - // The number of kilobytes for media to be observed before starting to - // throttle requests. - absl::optional<int> kilobytes_to_buffer_before_throttle_; - - // The maximum delay a throttle can introduce for a media request in - // milliseconds. - absl::optional<base::TimeDelta> max_throttling_delay_; - - // The number of media KB that have been left unthrottled before starting - // to introduce a throttling delay. - int kilobytes_buffered_before_throttle_ = 0; - - // Set of media requests that are throttled currently. These are maintained - // here to resume them immediately upon StopThrottling() - std::set<LiteVideoURLLoaderThrottle*> active_throttles_; - - mojo::AssociatedRemote<mojom::LiteVideoService> lite_video_service_remote_; -}; - -} // namespace lite_video - -#endif // CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_HINT_AGENT_H_
diff --git a/chrome/renderer/lite_video/lite_video_hint_agent_browsertest.cc b/chrome/renderer/lite_video/lite_video_hint_agent_browsertest.cc deleted file mode 100644 index 8a0cb28..0000000 --- a/chrome/renderer/lite_video/lite_video_hint_agent_browsertest.cc +++ /dev/null
@@ -1,366 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/renderer/lite_video/lite_video_hint_agent.h" - -#include <memory> - -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "chrome/common/chrome_features.h" -#include "chrome/renderer/lite_video/lite_video_url_loader_throttle.h" -#include "chrome/test/base/chrome_render_view_test.h" -#include "chrome/test/base/ui_test_utils.h" -#include "content/public/renderer/render_frame.h" -#include "content/public/renderer/render_view.h" -#include "services/network/public/mojom/url_response_head.mojom.h" -#include "services/network/test/test_utils.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/platform/web_network_state_notifier.h" - -namespace lite_video { - -namespace { -constexpr char kTestURL[] = "https://litevideo.test.com"; - -} - -// Encapsulates the media URLLoader throttle, its delegate, and maintains the -// current throttling state. -class MediaLoaderThrottleInfo : public blink::URLLoaderThrottle::Delegate { - public: - explicit MediaLoaderThrottleInfo( - std::unique_ptr<LiteVideoURLLoaderThrottle> throttle) - : throttle_(std::move(throttle)) { - throttle_->set_delegate(this); - } - - void SendResponse(network::mojom::URLResponseHead* response_head) { - throttle_->WillProcessResponse(GURL(kTestURL), response_head, - &is_throttled_); - } - - // Implements blink::URLLoaderThrottle::Delegate. - void CancelWithError(int error_code, - base::StringPiece custom_reason) override { - NOTIMPLEMENTED(); - } - void Resume() override { - ASSERT_TRUE(is_throttled_); - is_throttled_ = false; - } - - bool is_throttled() { return is_throttled_; } - - private: - // Current throttling state. - bool is_throttled_ = false; - - std::unique_ptr<LiteVideoURLLoaderThrottle> throttle_; -}; - -class LiteVideoHintAgentTest : public ChromeRenderViewTest { - public: - void DisableLiteVideoFeature() { - scoped_feature_list_.Reset(); - scoped_feature_list_.InitAndDisableFeature(features::kLiteVideo); - } - - void SetDisableForNoTransform() { - scoped_feature_list_.Reset(); - scoped_feature_list_.InitWithFeaturesAndParameters( - {{features::kLiteVideo, - {{"disable_for_cache_control_no_transform", "true"}}}}, - {}); - } - - void SetDisableForMissingContentLength() { - scoped_feature_list_.Reset(); - scoped_feature_list_.InitWithFeaturesAndParameters( - {{features::kLiteVideo, {{"throttle_missing_content_length", "true"}}}}, - {}); - } - - std::unique_ptr<LiteVideoURLLoaderThrottle> CreateLiteVideoURLLoaderThrottle( - blink::mojom::RequestContextType request_context_type) { - blink::WebURLRequest request; - request.SetUrl(GURL(kTestURL)); - request.SetRequestContext(request_context_type); - return LiteVideoURLLoaderThrottle::MaybeCreateThrottle( - request, GetMainRenderFrame()->GetRoutingID()); - } - - std::unique_ptr<MediaLoaderThrottleInfo> CreateThrottleAndSendResponse( - net::HttpStatusCode response_code, - const std::string& mime_type, - int content_length, - bool set_cache_control_no_transform = false) { - auto throttle_info = std::make_unique<MediaLoaderThrottleInfo>( - CreateLiteVideoURLLoaderThrottle( - blink::mojom::RequestContextType::FETCH)); - network::mojom::URLResponseHeadPtr response_head = - network::CreateURLResponseHead(response_code); - response_head->mime_type = mime_type; - response_head->mime_type = mime_type; - response_head->content_length = content_length; - response_head->encoded_body_length = content_length; - response_head->network_accessed = true; - response_head->was_fetched_via_cache = false; - - if (set_cache_control_no_transform) - response_head->headers->SetHeader("Cache-Control", "no-transform"); - - throttle_info->SendResponse(response_head.get()); - return throttle_info; - } - - const std::set<LiteVideoURLLoaderThrottle*>& GetActiveThrottledResponses() - const { - return lite_video_hint_agent_->GetActiveThrottlesForTesting(); - } - - const base::HistogramTester& histogram_tester() { return histogram_tester_; } - - void StopThrottlingAndClearHints() { - lite_video_hint_agent_->StopThrottlingAndClearHints(); - } - - protected: - void SetUp() override { - ChromeRenderViewTest::SetUp(); - scoped_feature_list_.InitAndEnableFeature(features::kLiteVideo); - blink::WebNetworkStateNotifier::SetSaveDataEnabled(true); - lite_video_hint_agent_ = new LiteVideoHintAgent(GetMainRenderFrame()); - - // Set some default hints. - previews::mojom::LiteVideoHintPtr hint = - previews::mojom::LiteVideoHint::New(); - hint->kilobytes_to_buffer_before_throttle = 10; - hint->target_downlink_bandwidth_kbps = 60; - hint->target_downlink_rtt_latency = base::Milliseconds(500); - hint->max_throttling_delay = base::Seconds(5); - lite_video_hint_agent_->SetLiteVideoHint(std::move(hint)); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - - base::HistogramTester histogram_tester_; - - // Owned by the RenderFrame. - LiteVideoHintAgent* lite_video_hint_agent_; -}; - -TEST_F(LiteVideoHintAgentTest, LiteVideoDisabled) { - DisableLiteVideoFeature(); - EXPECT_FALSE(CreateLiteVideoURLLoaderThrottle( - blink::mojom::RequestContextType::FETCH)); -} - -TEST_F(LiteVideoHintAgentTest, SaveDataDisabled) { - blink::WebNetworkStateNotifier::SetSaveDataEnabled(false); - EXPECT_FALSE(CreateLiteVideoURLLoaderThrottle( - blink::mojom::RequestContextType::FETCH)); -} - -TEST_F(LiteVideoHintAgentTest, OnlyFetchAPIResponseThrottled) { - EXPECT_FALSE(CreateLiteVideoURLLoaderThrottle( - blink::mojom::RequestContextType::IMAGE)); -} - -TEST_F(LiteVideoHintAgentTest, OnlyMediaMimeTypeThrottled) { - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - auto throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "image/jpeg", 11000); - EXPECT_FALSE(throttle_info->is_throttled()); - - throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "image/jpeg", 11000); - EXPECT_FALSE(throttle_info->is_throttled()); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); -} - -TEST_F(LiteVideoHintAgentTest, CacheControlNoTransformNotThrottled) { - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Initial k media bytes will not be throttled. - auto throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - EXPECT_FALSE(throttle_info->is_throttled()); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); - EXPECT_TRUE(GetActiveThrottledResponses().empty()); - - // Without the finch param, no-transform will get throttled. - throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000, - true /* set_cache_control_no_transform */); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 1); - EXPECT_TRUE(throttle_info->is_throttled()); - task_environment_.FastForwardBy(base::Seconds(10)); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(throttle_info->is_throttled()); - - // With the finch param, no-transform should not get throttled. - SetDisableForNoTransform(); - throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000, - true /* set_cache_control_no_transform */); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 1); - EXPECT_FALSE(throttle_info->is_throttled()); -} - -TEST_F(LiteVideoHintAgentTest, MissingContentLengthResponseThrottled) { - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Initial k media bytes will not be throttled. - auto throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - EXPECT_FALSE(throttle_info->is_throttled()); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); - EXPECT_TRUE(GetActiveThrottledResponses().empty()); - - // Without the finch param, no-transform should not get throttled. - throttle_info = CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", -1); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); - EXPECT_FALSE(throttle_info->is_throttled()); - - // With the finch param, missing CL will get throttled. - SetDisableForMissingContentLength(); - throttle_info = CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", -1); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 1); - EXPECT_TRUE(throttle_info->is_throttled()); - task_environment_.FastForwardBy(base::Seconds(10)); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(throttle_info->is_throttled()); -} - -TEST_F(LiteVideoHintAgentTest, FailedMediaResponseNotThrottled) { - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - auto throttle_info = CreateThrottleAndSendResponse( - net::HTTP_INTERNAL_SERVER_ERROR, "video/mp4", 11000); - EXPECT_FALSE(throttle_info->is_throttled()); - - throttle_info = CreateThrottleAndSendResponse(net::HTTP_INTERNAL_SERVER_ERROR, - "video/mp4", 11000); - EXPECT_FALSE(throttle_info->is_throttled()); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); -} - -TEST_F(LiteVideoHintAgentTest, MediaResponseThrottled) { - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Initial k media bytes will not be throttled. - auto throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - EXPECT_FALSE(throttle_info->is_throttled()); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); - EXPECT_TRUE(GetActiveThrottledResponses().empty()); - - // Verify if a response gets throttled and eventually resumed. - throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 440000); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 1); - EXPECT_TRUE(throttle_info->is_throttled()); - task_environment_.FastForwardBy(base::Seconds(10)); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(throttle_info->is_throttled()); - - // Verify a response that wasn't yet resumed, gets cleared from hint agent - // when its destroyed. - throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 440000); - EXPECT_TRUE(throttle_info->is_throttled()); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 2); - - EXPECT_FALSE(GetActiveThrottledResponses().empty()); - throttle_info.reset(); - EXPECT_TRUE(GetActiveThrottledResponses().empty()); -} - -// Permanent stop throttling should resume the responses immediately and any not -// allow throttling for new requests. -TEST_F(LiteVideoHintAgentTest, StopThrottlingPermanently) { - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Initial response is not throttled, and the next two are throttled. - auto throttle_info1 = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - auto throttle_info2 = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - auto throttle_info3 = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - EXPECT_FALSE(throttle_info1->is_throttled()); - EXPECT_TRUE(throttle_info2->is_throttled()); - EXPECT_TRUE(throttle_info3->is_throttled()); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 2); - EXPECT_EQ(2U, GetActiveThrottledResponses().size()); - - // Stop throttling will immediately resume. - StopThrottlingAndClearHints(); - EXPECT_FALSE(throttle_info2->is_throttled()); - EXPECT_FALSE(throttle_info3->is_throttled()); - - // The new responses should not be throttled. - EXPECT_FALSE(CreateLiteVideoURLLoaderThrottle( - blink::mojom::RequestContextType::FETCH)); - EXPECT_FALSE(CreateLiteVideoURLLoaderThrottle( - blink::mojom::RequestContextType::FETCH)); - - // When the throttle destroys it should get removed from active throttles. - throttle_info2.reset(); - throttle_info3.reset(); - EXPECT_TRUE(GetActiveThrottledResponses().empty()); -} - -TEST_F(LiteVideoHintAgentTest, RespectsMaxActiveThrottlesLimit) { - histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); - - // Initial k media bytes will not be throttled. - auto throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - EXPECT_FALSE(throttle_info->is_throttled()); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0); - EXPECT_TRUE(GetActiveThrottledResponses().empty()); - - // First 50 responses will be throttled. - std::deque<std::unique_ptr<MediaLoaderThrottleInfo>> throttles; - for (int i = 0; i < 50; i++) { - throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", - i + 1); - EXPECT_TRUE(throttle_info->is_throttled()); - throttles.push_back(std::move(throttle_info)); - } - - // The next response hits the MaxActiveThrottles limit and won't be throttled. - throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", - 50); - EXPECT_FALSE(throttle_info->is_throttled()); - - // Release a response from throttling. - throttles.front().reset(); - throttles.pop_front(); - base::RunLoop().RunUntilIdle(); - - // The next response is below the MaxActiveThrottles limit and gets throttled. - throttle_info = - CreateThrottleAndSendResponse(net::HTTP_OK, "video/mp4", 11000); - histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", - 51); - EXPECT_TRUE(throttle_info->is_throttled()); - - task_environment_.FastForwardBy(base::Seconds(50)); - base::RunLoop().RunUntilIdle(); - for (const auto& throttle : throttles) { - EXPECT_FALSE(throttle->is_throttled()); - } - EXPECT_FALSE(throttle_info->is_throttled()); -} - -} // namespace lite_video
diff --git a/chrome/renderer/lite_video/lite_video_url_loader_throttle.cc b/chrome/renderer/lite_video/lite_video_url_loader_throttle.cc deleted file mode 100644 index 30f74da2..0000000 --- a/chrome/renderer/lite_video/lite_video_url_loader_throttle.cc +++ /dev/null
@@ -1,142 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/renderer/lite_video/lite_video_url_loader_throttle.h" - -#include "base/metrics/histogram_macros.h" -#include "chrome/renderer/lite_video/lite_video_hint_agent.h" -#include "chrome/renderer/lite_video/lite_video_util.h" -#include "content/public/renderer/render_frame.h" -#include "content/public/renderer/render_thread.h" -#include "services/network/public/mojom/url_response_head.mojom.h" -#include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/web/web_local_frame.h" - -namespace lite_video { - -namespace { - -LiteVideoHintAgent* GetLiteVideoHintAgent(int render_frame_id) { - DCHECK_NE(MSG_ROUTING_NONE, render_frame_id); - if (auto* render_frame = - content::RenderFrame::FromRoutingID(render_frame_id)) { - return LiteVideoHintAgent::Get(render_frame); - } - return nullptr; -} - -bool IsPrerendering(int render_frame_id) { - auto* render_frame = content::RenderFrame::FromRoutingID(render_frame_id); - if (blink::features::IsPrerender2Enabled() && render_frame && - render_frame->GetWebFrame()->GetDocument().IsPrerendering()) { - return true; - } - return false; -} - -} // namespace - -// static -std::unique_ptr<LiteVideoURLLoaderThrottle> -LiteVideoURLLoaderThrottle::MaybeCreateThrottle( - const blink::WebURLRequest& request, - int render_frame_id) { - auto request_context = request.GetRequestContext(); - if (request_context != blink::mojom::RequestContextType::FETCH && - request_context != blink::mojom::RequestContextType::XML_HTTP_REQUEST) { - return nullptr; - } - // TODO(rajendrant): Also allow the throttle to be stopped when LiteMode gets - // disabled or ECT worsens. This logic should probably be in the browser - // process. - if (!IsLiteVideoEnabled()) - return nullptr; - - if (IsPrerendering(render_frame_id)) - return nullptr; - - auto* lite_video_hint_agent = GetLiteVideoHintAgent(render_frame_id); - if (lite_video_hint_agent && lite_video_hint_agent->HasLiteVideoHint()) - return std::make_unique<LiteVideoURLLoaderThrottle>(render_frame_id); - - return nullptr; -} - -LiteVideoURLLoaderThrottle::LiteVideoURLLoaderThrottle(int render_frame_id) - : render_frame_id_(render_frame_id) { - DCHECK(IsLiteVideoEnabled()); -} - -LiteVideoURLLoaderThrottle::~LiteVideoURLLoaderThrottle() { - // Existence of |response_delay_timer_| indicates throttling has been - // attempted on this media response. Remove the throttle on this case. - if (response_delay_timer_) { - DCHECK(render_frame_id_); - auto* lite_video_hint_agent = GetLiteVideoHintAgent(render_frame_id_); - if (lite_video_hint_agent) - lite_video_hint_agent->RemoveThrottle(this); - } -} - -void LiteVideoURLLoaderThrottle::WillProcessResponse( - const GURL& response_url, - network::mojom::URLResponseHead* response_head, - bool* defer) { - if (!response_head || !response_head->headers) - return; - // Do not throttle on 4xx, 5xx failures. - if (response_head->headers->response_code() != 200) - return; - if (!response_head->network_accessed || - response_head->was_fetched_via_cache) { - return; - } - if (!base::StartsWith(response_head->mime_type, "video/", - base::CompareCase::SENSITIVE)) { - return; - } - - auto* lite_video_hint_agent = GetLiteVideoHintAgent(render_frame_id_); - if (!lite_video_hint_agent) - return; - - auto received_bytes = GetContentLength(*response_head); - if (received_bytes) - lite_video_hint_agent->NotifyThrottledDataUse(*received_bytes); - - auto latency = lite_video_hint_agent->CalculateLatencyForResourceResponse( - *response_head); - if (latency.is_zero()) - return; - - UMA_HISTOGRAM_TIMES("LiteVideo.URLLoader.ThrottleLatency", latency); - - *defer = true; - // The timer may have already started and running, and the below restart will - // lose that elapsed time. However the elapsed time will be small since this - // case happens if some other url loader throttle is restarting the request. - response_delay_timer_ = std::make_unique<base::OneShotTimer>(); - response_delay_timer_->Start( - FROM_HERE, latency, - base::BindOnce(&LiteVideoURLLoaderThrottle::ResumeThrottledMediaResponse, - base::Unretained(this))); - - lite_video_hint_agent->AddThrottle(this); -} - -void LiteVideoURLLoaderThrottle::ResumeIfThrottled() { - if (response_delay_timer_ && response_delay_timer_->IsRunning()) { - response_delay_timer_->Stop(); - ResumeThrottledMediaResponse(); - } -} - -void LiteVideoURLLoaderThrottle::ResumeThrottledMediaResponse() { - DCHECK(!response_delay_timer_->IsRunning()); - delegate_->Resume(); -} - -void LiteVideoURLLoaderThrottle::DetachFromCurrentSequence() {} - -} // namespace lite_video
diff --git a/chrome/renderer/lite_video/lite_video_url_loader_throttle.h b/chrome/renderer/lite_video/lite_video_url_loader_throttle.h deleted file mode 100644 index ec353aa..0000000 --- a/chrome/renderer/lite_video/lite_video_url_loader_throttle.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_URL_LOADER_THROTTLE_H_ -#define CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_URL_LOADER_THROTTLE_H_ - -#include "base/callback.h" -#include "base/timer/timer.h" -#include "third_party/blink/public/common/loader/url_loader_throttle.h" - -namespace blink { -class WebURLRequest; -} // namespace blink - -namespace lite_video { - -// This class throttles media url requests that have audio/video mime-type in -// response headers, to simulate low bandwidth conditions. This allows MSE video -// players to adapt and play the lower resolution videos. -class LiteVideoURLLoaderThrottle : public blink::URLLoaderThrottle { - public: - explicit LiteVideoURLLoaderThrottle(int render_frame_id); - ~LiteVideoURLLoaderThrottle() override; - - // Creates throttle for |request| if LiteVideo is enabled for LiteMode users, - // and LiteVideoHintAgent has received hints for the navigation. Throttle will - // be created only for Fetch/XHR requests. - static std::unique_ptr<LiteVideoURLLoaderThrottle> MaybeCreateThrottle( - const blink::WebURLRequest& request, - int render_frame_id); - - // Resumes the media response if it was currently throttled. Otherwise its a - // no-op. - void ResumeIfThrottled(); - - // blink::URLLoaderThrottle: - void WillProcessResponse(const GURL& response_url, - network::mojom::URLResponseHead* response_head, - bool* defer) override; - void DetachFromCurrentSequence() override; - - private: - // Resumes the media response immediately. - void ResumeThrottledMediaResponse(); - - // Render frame id to get the media throttle observer of the render frame. - const int render_frame_id_; - - // Timer to introduce latency for the response. - std::unique_ptr<base::OneShotTimer> response_delay_timer_; -}; - -} // namespace lite_video - -#endif // CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_URL_LOADER_THROTTLE_H_
diff --git a/chrome/renderer/lite_video/lite_video_util.cc b/chrome/renderer/lite_video/lite_video_util.cc deleted file mode 100644 index 572d9c4..0000000 --- a/chrome/renderer/lite_video/lite_video_util.cc +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/renderer/lite_video/lite_video_util.h" - -#include "chrome/common/chrome_features.h" -#include "third_party/blink/public/platform/web_network_state_notifier.h" - -namespace lite_video { - -bool IsLiteVideoEnabled() { - return base::FeatureList::IsEnabled(features::kLiteVideo) && - blink::WebNetworkStateNotifier::SaveDataEnabled(); -} - -bool ShouldDisableLiteVideoForCacheControlNoTransform() { - return base::GetFieldTrialParamByFeatureAsBool( - ::features::kLiteVideo, "disable_for_cache_control_no_transform", false); -} - -bool ShouldThrottleLiteVideoMissingContentLength() { - return base::GetFieldTrialParamByFeatureAsBool( - ::features::kLiteVideo, "throttle_missing_content_length", false); -} - -size_t GetMaxActiveThrottles() { - return base::GetFieldTrialParamByFeatureAsInt(::features::kLiteVideo, - "max_active_throttles", 50); -} - -absl::optional<uint64_t> GetContentLength( - const network::mojom::URLResponseHead& response_head) { - if (response_head.content_length > 0) - return static_cast<uint64_t>(response_head.content_length); - if (response_head.encoded_body_length > 0) - return static_cast<uint64_t>(response_head.encoded_body_length); - return absl::nullopt; -} - -} // namespace lite_video
diff --git a/chrome/renderer/lite_video/lite_video_util.h b/chrome/renderer/lite_video/lite_video_util.h deleted file mode 100644 index 86ff178..0000000 --- a/chrome/renderer/lite_video/lite_video_util.h +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_UTIL_H_ -#define CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_UTIL_H_ - -#include <stddef.h> - -#include "services/network/public/mojom/url_response_head.mojom.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace lite_video { - -// Returns whether LiteVideo is enabled. -bool IsLiteVideoEnabled(); - -// Returns whether LiteVideo should be disabled for cache-control: no-transform -// responses. -bool ShouldDisableLiteVideoForCacheControlNoTransform(); - -// Returns whether LiteVideo should throttle responses without content-length. -bool ShouldThrottleLiteVideoMissingContentLength(); - -// Returns the maximum active throttles size. -size_t GetMaxActiveThrottles(); - -// Returns the content length of the response received. absl::nullopt is -// returned when content length cannot be retrieved. -absl::optional<uint64_t> GetContentLength( - const network::mojom::URLResponseHead& response_head); - -} // namespace lite_video - -#endif // CHROME_RENDERER_LITE_VIDEO_LITE_VIDEO_UTIL_H_
diff --git a/chrome/renderer/previews/resource_loading_hints_agent.cc b/chrome/renderer/previews/resource_loading_hints_agent.cc deleted file mode 100644 index d7dd35d..0000000 --- a/chrome/renderer/previews/resource_loading_hints_agent.cc +++ /dev/null
@@ -1,69 +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 "chrome/renderer/previews/resource_loading_hints_agent.h" - -#include <vector> - -#include "base/metrics/histogram_macros.h" -#include "base/metrics/histogram_macros_local.h" -#include "content/public/renderer/render_frame.h" -#include "third_party/blink/public/platform/web_string.h" -#include "third_party/blink/public/platform/web_vector.h" -#include "third_party/blink/public/web/web_document.h" -#include "third_party/blink/public/web/web_document_loader.h" -#include "third_party/blink/public/web/web_local_frame.h" - -namespace previews { - - -ResourceLoadingHintsAgent::ResourceLoadingHintsAgent( - blink::AssociatedInterfaceRegistry* associated_interfaces, - content::RenderFrame* render_frame) - : content::RenderFrameObserver(render_frame) { - DCHECK(render_frame); - associated_interfaces->AddInterface(base::BindRepeating( - &ResourceLoadingHintsAgent::SetReceiver, base::Unretained(this))); -} - -GURL ResourceLoadingHintsAgent::GetDocumentURL() const { - return render_frame()->GetWebFrame()->GetDocument().Url(); -} - -void ResourceLoadingHintsAgent::OnDestruct() { - delete this; -} - -ResourceLoadingHintsAgent::~ResourceLoadingHintsAgent() = default; - -void ResourceLoadingHintsAgent::SetReceiver( - mojo::PendingAssociatedReceiver< - previews::mojom::PreviewsResourceLoadingHintsReceiver> receiver) { - receiver_.reset(); - receiver_.Bind(std::move(receiver)); -} - -bool ResourceLoadingHintsAgent::IsMainFrame() const { - return render_frame()->IsMainFrame(); -} - - -void ResourceLoadingHintsAgent::SetLiteVideoHint( - previews::mojom::LiteVideoHintPtr lite_video_hint) { - auto* lite_video_hint_agent = - lite_video::LiteVideoHintAgent::Get(render_frame()); - if (lite_video_hint_agent) - lite_video_hint_agent->SetLiteVideoHint(std::move(lite_video_hint)); -} - -void ResourceLoadingHintsAgent::StopThrottlingMediaRequests() { - auto* lite_video_hint_agent = - lite_video::LiteVideoHintAgent::Get(render_frame()); - if (lite_video_hint_agent) { - LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.HintsAgent.StopThrottling", true); - lite_video_hint_agent->StopThrottlingAndClearHints(); - } -} - -} // namespace previews
diff --git a/chrome/renderer/previews/resource_loading_hints_agent.h b/chrome/renderer/previews/resource_loading_hints_agent.h deleted file mode 100644 index 6f99ac5..0000000 --- a/chrome/renderer/previews/resource_loading_hints_agent.h +++ /dev/null
@@ -1,63 +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. - -#ifndef CHROME_RENDERER_PREVIEWS_RESOURCE_LOADING_HINTS_AGENT_H_ -#define CHROME_RENDERER_PREVIEWS_RESOURCE_LOADING_HINTS_AGENT_H_ - -#include "base/bind.h" -#include "chrome/common/previews_resource_loading_hints.mojom.h" -#include "chrome/renderer/lite_video/lite_video_hint_agent.h" -#include "content/public/renderer/render_frame_observer.h" -#include "mojo/public/cpp/bindings/associated_receiver.h" -#include "mojo/public/cpp/bindings/pending_associated_receiver.h" -#include "services/service_manager/public/cpp/interface_provider.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" -#include "url/gurl.h" - -namespace previews { - -// The renderer-side agent of ResourceLoadingHintsAgent. There is one instance -// per main frame, responsible for sending the loading hints from browser to -// the document loader. -class ResourceLoadingHintsAgent - : public content::RenderFrameObserver, - public previews::mojom::PreviewsResourceLoadingHintsReceiver, - public base::SupportsWeakPtr<ResourceLoadingHintsAgent> { - public: - ResourceLoadingHintsAgent( - blink::AssociatedInterfaceRegistry* associated_interfaces, - content::RenderFrame* render_frame); - - ResourceLoadingHintsAgent(const ResourceLoadingHintsAgent&) = delete; - ResourceLoadingHintsAgent& operator=(const ResourceLoadingHintsAgent&) = - delete; - - ~ResourceLoadingHintsAgent() override; - - private: - // content::RenderFrameObserver: - void OnDestruct() override; - - GURL GetDocumentURL() const; - - // previews::mojom::PreviewsResourceLoadingHintsReceiver: - void SetLiteVideoHint( - previews::mojom::LiteVideoHintPtr lite_video_hint) override; - void StopThrottlingMediaRequests() override; - - void SetReceiver( - mojo::PendingAssociatedReceiver< - previews::mojom::PreviewsResourceLoadingHintsReceiver> receiver); - - bool IsMainFrame() const; - - mojo::AssociatedReceiver< - previews::mojom::PreviewsResourceLoadingHintsReceiver> - receiver_{this}; -}; - -} // namespace previews - -#endif // CHROME_RENDERER_PREVIEWS_RESOURCE_LOADING_HINTS_AGENT_H_
diff --git a/chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.cc b/chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.cc index b5ed130e..153022f 100644 --- a/chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.cc +++ b/chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.cc
@@ -9,7 +9,6 @@ #include "base/metrics/histogram_macros.h" #include "base/stl_util.h" #include "base/time/time.h" -#include "chrome/renderer/previews/resource_loading_hints_agent.h" #include "chrome/renderer/subresource_redirect/login_robots_decider_agent.h" #include "chrome/renderer/subresource_redirect/subresource_redirect_params.h" #include "chrome/renderer/subresource_redirect/subresource_redirect_util.h"
diff --git a/chrome/renderer/url_loader_throttle_provider_impl.cc b/chrome/renderer/url_loader_throttle_provider_impl.cc index 6e45c1ae..01bf8be 100644 --- a/chrome/renderer/url_loader_throttle_provider_impl.cc +++ b/chrome/renderer/url_loader_throttle_provider_impl.cc
@@ -17,7 +17,6 @@ #include "chrome/renderer/chrome_content_renderer_client.h" #include "chrome/renderer/chrome_render_frame_observer.h" #include "chrome/renderer/chrome_render_thread_observer.h" -#include "chrome/renderer/lite_video/lite_video_url_loader_throttle.h" #include "chrome/renderer/subresource_redirect/src_video_redirect_url_loader_throttle.h" #include "chrome/renderer/subresource_redirect/subresource_redirect_params.h" #include "chrome/renderer/subresource_redirect/subresource_redirect_url_loader_throttle.h" @@ -207,14 +206,6 @@ if (src_video_redirect_throttle) throttles.emplace_back(std::move(src_video_redirect_throttle)); - if (render_frame_id != MSG_ROUTING_NONE) { - auto lite_video_throttle = - lite_video::LiteVideoURLLoaderThrottle::MaybeCreateThrottle( - request, render_frame_id); - if (lite_video_throttle) - throttles.emplace_back(std::move(lite_video_throttle)); - } - return throttles; }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index a8f2ca7..ca93132 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1505,7 +1505,6 @@ "../browser/data_saver/data_saver_browsertest.cc", "../browser/data_saver/data_saver_holdback_browsertest.cc", "../browser/data_saver/data_saver_webapis_browsertest.cc", - "../browser/data_saver/lite_video_browsertest.cc", "../browser/data_saver/login_robots_src_video_browsertest.cc", "../browser/data_saver/subresource_redirect_browsertest.cc", "../browser/data_saver/subresource_redirect_login_robots_browsertest.cc", @@ -1574,7 +1573,6 @@ "../browser/lazyload/lazyload_browsertest.cc", "../browser/lifetime/browser_close_manager_browsertest.cc", "../browser/lifetime/browser_shutdown_browsertest.cc", - "../browser/lite_video/lite_video_keyed_service_browsertest.cc", "../browser/loader/signed_exchange_policy_browsertest.cc", "../browser/loadtimes_extension_bindings_browsertest.cc", "../browser/locale_tests_browsertest.cc", @@ -2083,7 +2081,6 @@ "../renderer/chrome_content_renderer_client_browsertest.cc", "../renderer/chrome_content_settings_agent_delegate_browsertest.cc", "../renderer/chrome_render_frame_observer_browsertest.cc", - "../renderer/lite_video/lite_video_hint_agent_browsertest.cc", "../renderer/subresource_redirect/login_robots_decider_agent_browsertest.cc", "../renderer/subresource_redirect/login_robots_url_loader_throttle_browsertest.cc", "../renderer/subresource_redirect/public_image_hints_decider_agent_browsertest.cc", @@ -4565,12 +4562,6 @@ "../browser/internal_auth_unittest.cc", "../browser/language/language_model_manager_factory_unittest.cc", "../browser/language/url_language_histogram_factory_unittest.cc", - "../browser/lite_video/lite_video_decider_unittest.cc", - "../browser/lite_video/lite_video_features_unittest.cc", - "../browser/lite_video/lite_video_hint_cache_unittest.cc", - "../browser/lite_video/lite_video_hint_unittest.cc", - "../browser/lite_video/lite_video_navigation_metrics_unittest.cc", - "../browser/lite_video/lite_video_user_blocklist_unittest.cc", "../browser/logging_chrome_unittest.cc", "../browser/login_detection/login_detection_prefs_unittest.cc", "../browser/login_detection/login_detection_tab_helper_unittest.cc",
diff --git a/chrome/test/data/updater/setup_test_envcheck/.install b/chrome/test/data/updater/setup_test_envcheck/.install index d2817196..07ac75c 100755 --- a/chrome/test/data/updater/setup_test_envcheck/.install +++ b/chrome/test/data/updater/setup_test_envcheck/.install
@@ -1,7 +1,6 @@ #!/bin/sh if [ "$2" != "xc_path" ]; then exit 1; fi; -if [ "$3" != "arg1" ]; then exit 2; fi; -if [ "$4" != "arg2" ]; then exit 3; fi; +if [ "$SERVER_ARGS" != "arg1 arg2" ]; then exit 3; fi; if [ "$KS_TICKET_AP" != "ap" ]; then exit 4; fi; if [ "$KS_TICKET_XC_PATH" != "xc_path" ]; then exit 5; fi; if [ "$PATH" != "/bin:/usr/bin" ]; then exit 6; fi;
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_ui_test.js b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_ui_test.js index 070e919..de7eaec 100644 --- a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_ui_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_ui_test.js
@@ -548,19 +548,19 @@ // Try pairing to first device. await selectDevice(device.deviceProperties); - await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); // Try pairing to second device, before first device has completed pairing. await selectDevice(device1.deviceProperties); - await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); // Try pairing to third device, before first device has completed pairing. await selectDevice(device2.deviceProperties); - await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); // Simulate device pairing cancellation. deviceHandler.completePairDevice(/*success=*/ false); - await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); assertEquals(deviceHandler.getPairDeviceCalledCount(), 2);
diff --git a/chrome/test/data/webui/tab_search/BUILD.gn b/chrome/test/data/webui/tab_search/BUILD.gn index 2c338a8..0401591 100644 --- a/chrome/test/data/webui/tab_search/BUILD.gn +++ b/chrome/test/data/webui/tab_search/BUILD.gn
@@ -27,15 +27,15 @@ target_gen_dir), ] in_files = [ - "bimap_test.js", - "fuzzy_search_test.js", + "bimap_test.ts", + "fuzzy_search_test.ts", "infinite_list_test.js", "tab_search_app_focus_test.js", "tab_search_app_test.js", "tab_search_item_test.js", - "tab_search_test_data.js", - "tab_search_test_helper.js", - "test_tab_search_api_proxy.js", + "tab_search_test_data.ts", + "tab_search_test_helper.ts", + "test_tab_search_api_proxy.ts", ] deps = [ "//chrome/browser/resources/tab_search:build_ts" ] extra_deps = [ "..:generate_definitions" ]
diff --git a/chrome/test/data/webui/tab_search/bimap_test.js b/chrome/test/data/webui/tab_search/bimap_test.ts similarity index 100% rename from chrome/test/data/webui/tab_search/bimap_test.js rename to chrome/test/data/webui/tab_search/bimap_test.ts
diff --git a/chrome/test/data/webui/tab_search/fuzzy_search_test.js b/chrome/test/data/webui/tab_search/fuzzy_search_test.js deleted file mode 100644 index 63c68cb..0000000 --- a/chrome/test/data/webui/tab_search/fuzzy_search_test.js +++ /dev/null
@@ -1,442 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'chrome://webui-test/mojo_webui_test_support.js'; - -import {fuzzySearch, TabData} from 'chrome://tab-search.top-chrome/tab_search.js'; -import {assertDeepEquals, assertEquals} from 'chrome://webui-test/chai_assert.js'; - -/** - * Assert search results return in specific order. - * @param {string} input - * @param {!Array<!TabData>} items - * @param {!Object} options - * @param {!Array<number>} expectedIndices - */ -function assertSearchOrders(input, items, options, expectedIndices) { - const results = fuzzySearch(input, items, options); - assertEquals(results.length, expectedIndices.length); - for (let i = 0; i < results.length; ++i) { - const expectedItem = items[expectedIndices[i]]; - const actualItem = results[i]; - assertEquals(expectedItem.tab.title, actualItem.tab.title); - assertEquals(expectedItem.hostname, actualItem.hostname); - } -} - -suite('FuzzySearchTest', () => { - test('fuzzySearch', () => { - const records = [ - { - tab: { - title: 'OpenGL', - }, - hostname: 'www.opengl.org', - }, - { - tab: { - title: 'Google', - }, - hostname: 'www.google.com', - }, - ]; - - const matchedRecords = [ - { - tab: { - title: 'Google', - }, - hostname: 'www.google.com', - highlightRanges: { - 'tab.title': [{start: 0, length: 1}, {start: 3, length: 3}], - hostname: [{start: 4, length: 1}, {start: 7, length: 3}], - }, - }, - { - tab: { - title: 'OpenGL', - }, - hostname: 'www.opengl.org', - highlightRanges: { - 'tab.title': [{start: 2, length: 1}, {start: 4, length: 2}], - hostname: [ - {start: 6, length: 1}, {start: 8, length: 2}, {start: 13, length: 1} - ], - }, - }, - ]; - - const options = { - useFuzzySearch: true, - includeScore: true, - includeMatches: true, - keys: [ - { - name: 'tab.title', - weight: 2, - }, - { - name: 'hostname', - weight: 1, - }, - ], - }; - - assertDeepEquals(matchedRecords, fuzzySearch('gle', records, options)); - assertDeepEquals(records, fuzzySearch('', records, options)); - assertDeepEquals([], fuzzySearch('z', records, options)); - }); - - test('fuzzy search title, hostname, and tab group title keys.', () => { - const records = [ - { - tab: { - title: 'OpenGL', - }, - hostname: 'www.opengl.org', - }, - { - tab: { - title: 'Google', - }, - hostname: 'www.google.com', - }, - { - tab: { - title: 'Meet the cast', - }, - tabGroup: { - title: 'Glee TV show', - } - } - ]; - - const matchedRecords = [ - { - tab: { - title: 'Meet the cast', - }, - tabGroup: {title: 'Glee TV show'}, - highlightRanges: { - 'tabGroup.title': [{start: 0, length: 3}], - }, - }, - { - tab: { - title: 'Google', - }, - hostname: 'www.google.com', - highlightRanges: { - 'tab.title': [{start: 0, length: 1}, {start: 3, length: 3}], - hostname: [{start: 4, length: 1}, {start: 7, length: 3}], - }, - }, - { - tab: { - title: 'OpenGL', - }, - hostname: 'www.opengl.org', - highlightRanges: { - 'tab.title': [{start: 2, length: 1}, {start: 4, length: 2}], - hostname: [ - {start: 6, length: 1}, {start: 8, length: 2}, {start: 13, length: 1} - ], - }, - }, - ]; - - const options = { - useFuzzySearch: true, - includeScore: true, - includeMatches: true, - keys: [ - { - name: 'tab.title', - weight: 2, - }, - { - name: 'hostname', - weight: 1, - }, - {name: 'tabGroup.title', weight: 1.5}, - ], - }; - - assertDeepEquals(matchedRecords, fuzzySearch('gle', records, options)); - assertDeepEquals(records, fuzzySearch('', records, options)); - assertDeepEquals([], fuzzySearch('z', records, options)); - }); - - test( - 'Test fuzzy search prioritize string start over word start over others', - () => { - const records = [ - {tab: {title: 'Asear'}}, - {tab: {title: 'Tab Search'}}, - {tab: {title: 'Search engine'}}, - ]; - - const options = { - useFuzzySearch: true, - includeScore: true, - includeMatches: true, - keys: [ - { - name: 'tab.title', - }, - ] - }; - assertSearchOrders('sear', records, options, [2, 1, 0]); - }); - - test('Test the exact match ranking order.', () => { - const options = { - keys: [ - { - name: 'tab.title', - weight: 1, - }, - { - name: 'hostname', - weight: 1, - }, - ], - }; - - // Initial pre-search item list. - const records = [ - { - tab: { - title: 'Code Search', - }, - hostname: 'search.chromium.search', - }, - { - tab: {title: 'Marching band'}, - hostname: 'en.marching.band.com', - }, - { - tab: {title: 'Chrome Desktop Architecture'}, - hostname: 'drive.google.com', - }, - { - tab: {title: 'Arch Linux'}, - hostname: 'www.archlinux.org', - }, - { - tab: {title: 'Arches National Park'}, - hostname: 'www.nps.gov', - }, - { - tab: {title: 'Search Engine Land - Search Engines'}, - hostname: 'searchengineland.com', - }, - ]; - - // Results for 'arch'. - const archMatchedRecords = [ - { - tab: {title: 'Arch Linux'}, - hostname: 'www.archlinux.org', - highlightRanges: { - 'tab.title': [{start: 0, length: 4}], - hostname: [{start: 4, length: 4}], - }, - }, - { - tab: {title: 'Arches National Park'}, - hostname: 'www.nps.gov', - highlightRanges: { - 'tab.title': [{start: 0, length: 4}], - }, - }, - { - tab: {title: 'Chrome Desktop Architecture'}, - hostname: 'drive.google.com', - highlightRanges: { - 'tab.title': [{start: 15, length: 4}], - }, - }, - { - tab: {title: 'Code Search'}, - hostname: 'search.chromium.search', - highlightRanges: { - 'tab.title': [{start: 7, length: 4}], - hostname: [{start: 2, length: 4}, {start: 18, length: 4}], - }, - }, - { - tab: {title: 'Search Engine Land - Search Engines'}, - hostname: 'searchengineland.com', - highlightRanges: { - 'tab.title': [{start: 2, length: 4}, {start: 23, length: 4}], - hostname: [{start: 2, length: 4}] - }, - }, - { - tab: {title: 'Marching band'}, - hostname: 'en.marching.band.com', - highlightRanges: { - 'tab.title': [{start: 1, length: 4}], - hostname: [{start: 4, length: 4}], - }, - }, - ]; - - // Results for 'search'. - const searchMatchedRecords = [ - { - tab: {title: 'Code Search'}, - hostname: 'search.chromium.search', - highlightRanges: { - 'tab.title': [{start: 5, length: 6}], - hostname: [{start: 0, length: 6}, {start: 16, length: 6}], - }, - }, - { - tab: {title: 'Search Engine Land - Search Engines'}, - hostname: 'searchengineland.com', - highlightRanges: { - 'tab.title': [{start: 0, length: 6}, {start: 21, length: 6}], - hostname: [{start: 0, length: 6}], - }, - }, - ]; - - // Empty search should return the full list. - assertDeepEquals(records, fuzzySearch('', records, options)); - assertDeepEquals(archMatchedRecords, fuzzySearch('arch', records, options)); - assertDeepEquals( - searchMatchedRecords, fuzzySearch('search', records, options)); - - // No matches should return an empty list. - assertDeepEquals([], fuzzySearch('archh', records, options)); - }); - - test('Test exact search with escaped characters.', () => { - const options = { - keys: [ - { - name: 'tab.title', - weight: 1, - }, - { - name: 'hostname', - weight: 1, - }, - ], - }; - - // Initial pre-search item list. - const records = [{ - tab: {title: '\'beginning\\test\\end'}, - hostname: 'beginning\\test\"end', - }]; - - // Expected results for '\test'. - const backslashMatchedRecords = [ - { - tab: {title: '\'beginning\\test\\end'}, - hostname: 'beginning\\test\"end', - highlightRanges: { - 'tab.title': [{start: 10, length: 5}], - hostname: [{start: 9, length: 5}], - }, - }, - ]; - - // Expected results for '"end'. - const quoteMatchedRecords = [ - { - tab: {title: '\'beginning\\test\\end'}, - hostname: 'beginning\\test\"end', - highlightRanges: { - hostname: [{start: 14, length: 4}], - }, - }, - ]; - - assertDeepEquals( - backslashMatchedRecords, fuzzySearch('\\test', records, options)); - assertDeepEquals( - quoteMatchedRecords, fuzzySearch('\"end', records, options)); - }); - - test('Test exact match result scoring accounts for match position.', () => { - const options = { - keys: [ - { - name: 'tab.title', - weight: 1, - }, - { - name: 'hostname', - weight: 1, - }, - ], - }; - - assertSearchOrders( - 'two', - [ - {tab: {title: 'three one two'}}, - {tab: {title: 'three two one'}}, - {tab: {title: 'one two three'}}, - ], - options, [2, 1, 0]); - }); - - test( - 'Test exact match result scoring takes into account the number of matches per item.', - () => { - const options = { - keys: [ - { - name: 'tab.title', - weight: 1, - }, - { - name: 'hostname', - weight: 1, - }, - ], - }; - - assertSearchOrders( - 'one', - [ - {tab: {title: 'one two three'}}, - {tab: {title: 'one one three'}}, - {tab: {title: 'one one one'}}, - ], - options, [2, 1, 0]); - }); - - test('Test exact match result scoring abides by the key weights.', () => { - const options = { - keys: [ - { - name: 'tab.title', - weight: 2, - }, - { - name: 'hostname', - weight: 1, - } - ] - }; - - assertSearchOrders( - 'search', - [ - {tab: {title: 'New tab'}, hostname: 'chrome://tab-search'}, - {tab: {title: 'chrome://tab-search'}}, - { - tab: {title: 'chrome://tab-search'}, - hostname: 'chrome://tab-search' - }, - ], - options, [2, 1, 0]); - }); -});
diff --git a/chrome/test/data/webui/tab_search/fuzzy_search_test.ts b/chrome/test/data/webui/tab_search/fuzzy_search_test.ts new file mode 100644 index 0000000..18e3a3b --- /dev/null +++ b/chrome/test/data/webui/tab_search/fuzzy_search_test.ts
@@ -0,0 +1,475 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://webui-test/mojo_webui_test_support.js'; + +import {fuzzySearch, FuzzySearchOptions, Tab, TabData, TabGroup, TabItemType} from 'chrome://tab-search.top-chrome/tab_search.js'; +import {assertDeepEquals, assertEquals} from 'chrome://webui-test/chai_assert.js'; + +/** + * Assert search results return in specific order. + */ +function assertSearchOrders( + input: string, items: TabData[], options: FuzzySearchOptions<TabData>, + expectedIndices: number[]) { + const results = fuzzySearch(input, items, options); + assertEquals(results.length, expectedIndices.length); + for (let i = 0; i < results.length; ++i) { + const expectedItem = items[expectedIndices[i]!]!; + const actualItem = results[i]!; + assertEquals(expectedItem.tab.title, actualItem.tab.title); + assertEquals(expectedItem.hostname, actualItem.hostname); + } +} + +function assertResults(expectedRecords: Array<any>, actualRecords: TabData[]) { + assertEquals(expectedRecords.length, actualRecords.length); + expectedRecords.forEach((expected, i) => { + const actual = actualRecords[i]!; + assertEquals(expected.tab.title, actual.tab.title); + if (expected.tabGroup !== undefined) { + assertEquals(expected.tabGroup.title, actual.tabGroup!.title); + } + assertEquals(expected.hostname, actual.hostname); + assertDeepEquals(expected.highlightRanges, actual.highlightRanges); + }); +} + +function createTab(overrides: Partial<Tab>): Tab { + return Object.assign( + { + active: false, + alertStates: [], + faviconUrl: undefined, + groupId: undefined, + index: 0, + isDefaultFavicon: false, + lastActiveElapsedText: '', + lastActiveTimeTicks: {internalValue: BigInt(5)}, + pinned: false, + showIcon: false, + tabId: 1, + title: 'Google', + url: {url: 'https://www.google.com'}, + + }, + overrides); +} + +suite('FuzzySearchTest', () => { + test('fuzzySearch', () => { + const records: TabData[] = [ + new TabData( + createTab({title: 'OpenGL'}), TabItemType.OPEN_TAB, 'www.opengl.org'), + new TabData( + createTab({title: 'Google'}), TabItemType.OPEN_TAB, 'www.google.com'), + ]; + + const matchedRecords = [ + { + tab: { + title: 'Google', + }, + hostname: 'www.google.com', + highlightRanges: { + 'tab.title': [{start: 0, length: 1}, {start: 3, length: 3}], + hostname: [{start: 4, length: 1}, {start: 7, length: 3}], + }, + }, + { + tab: { + title: 'OpenGL', + }, + hostname: 'www.opengl.org', + highlightRanges: { + 'tab.title': [{start: 2, length: 1}, {start: 4, length: 2}], + hostname: [ + {start: 6, length: 1}, {start: 8, length: 2}, {start: 13, length: 1} + ], + }, + }, + ]; + + const options = { + useFuzzySearch: true, + includeScore: true, + includeMatches: true, + keys: [ + { + name: 'tab.title', + weight: 2, + }, + { + name: 'hostname', + weight: 1, + }, + ], + }; + + assertResults(matchedRecords, fuzzySearch('gle', records, options)); + assertResults(records, fuzzySearch('', records, options)); + assertResults([], fuzzySearch('z', records, options)); + }); + + test('fuzzy search title, hostname, and tab group title keys.', () => { + const tabDataWithGroup = new TabData( + createTab({title: 'Meet the cast'}), TabItemType.OPEN_TAB, + 'meet the cast'); + tabDataWithGroup.tabGroup = {title: 'Glee TV show'} as TabGroup; + + const records = [ + new TabData( + createTab({title: 'OpenGL'}), TabItemType.OPEN_TAB, 'www.opengl.org'), + new TabData( + createTab({title: 'Google'}), TabItemType.OPEN_TAB, 'www.google.com'), + tabDataWithGroup, + ]; + + const matchedRecords = [ + { + tab: { + title: 'Meet the cast', + }, + hostname: 'meet the cast', + tabGroup: {title: 'Glee TV show'}, + highlightRanges: { + 'tabGroup.title': [{start: 0, length: 3}], + }, + }, + { + tab: { + title: 'Google', + }, + hostname: 'www.google.com', + highlightRanges: { + 'tab.title': [{start: 0, length: 1}, {start: 3, length: 3}], + hostname: [{start: 4, length: 1}, {start: 7, length: 3}], + }, + }, + { + tab: { + title: 'OpenGL', + }, + hostname: 'www.opengl.org', + highlightRanges: { + 'tab.title': [{start: 2, length: 1}, {start: 4, length: 2}], + hostname: [ + {start: 6, length: 1}, {start: 8, length: 2}, {start: 13, length: 1} + ], + }, + }, + ]; + + const options = { + useFuzzySearch: true, + includeScore: true, + includeMatches: true, + keys: [ + { + name: 'tab.title', + weight: 2, + }, + { + name: 'hostname', + weight: 1, + }, + {name: 'tabGroup.title', weight: 1.5}, + ], + }; + + assertResults(matchedRecords, fuzzySearch('gle', records, options)); + assertResults(records, fuzzySearch('', records, options)); + assertResults([], fuzzySearch('z', records, options)); + }); + + test( + 'Test fuzzy search prioritize string start over word start over others', + () => { + const records = [ + new TabData( + createTab({title: 'Asear'}), TabItemType.OPEN_TAB, 'asear'), + new TabData( + createTab({title: 'Tab Search'}), TabItemType.OPEN_TAB, + 'tab search'), + new TabData( + createTab({title: 'Search Engine'}), TabItemType.OPEN_TAB, + 'search engine'), + ]; + + const options = { + useFuzzySearch: true, + includeScore: true, + includeMatches: true, + keys: [ + { + name: 'tab.title', + weight: 1, + }, + ] + }; + assertSearchOrders('sear', records, options, [2, 1, 0]); + }); + + test('Test the exact match ranking order.', () => { + const options = { + useFuzzySearch: false, + keys: [ + { + name: 'tab.title', + weight: 1, + }, + { + name: 'hostname', + weight: 1, + }, + ], + }; + + // Initial pre-search item list. + const records = [ + new TabData( + createTab({title: 'Code Search'}), TabItemType.OPEN_TAB, + 'search.chromium.search'), + new TabData( + createTab({title: 'Marching band'}), TabItemType.OPEN_TAB, + 'en.marching.band.com'), + new TabData( + createTab({title: 'Chrome Desktop Architecture'}), + TabItemType.OPEN_TAB, 'drive.google.com'), + new TabData( + createTab({title: 'Arch Linux'}), TabItemType.OPEN_TAB, + 'www.archlinux.org'), + new TabData( + createTab({title: 'Arches National Park'}), TabItemType.OPEN_TAB, + 'www.nps.gov'), + new TabData( + createTab({title: 'Search Engine Land - Search Engines'}), + TabItemType.OPEN_TAB, 'searchengineland.com'), + ]; + + // Results for 'arch'. + const archMatchedRecords = [ + { + tab: {title: 'Arch Linux'}, + hostname: 'www.archlinux.org', + highlightRanges: { + 'tab.title': [{start: 0, length: 4}], + hostname: [{start: 4, length: 4}], + }, + }, + { + tab: {title: 'Arches National Park'}, + hostname: 'www.nps.gov', + highlightRanges: { + 'tab.title': [{start: 0, length: 4}], + }, + }, + { + tab: {title: 'Chrome Desktop Architecture'}, + hostname: 'drive.google.com', + highlightRanges: { + 'tab.title': [{start: 15, length: 4}], + }, + }, + { + tab: {title: 'Code Search'}, + hostname: 'search.chromium.search', + highlightRanges: { + 'tab.title': [{start: 7, length: 4}], + hostname: [{start: 2, length: 4}, {start: 18, length: 4}], + }, + }, + { + tab: {title: 'Search Engine Land - Search Engines'}, + hostname: 'searchengineland.com', + highlightRanges: { + 'tab.title': [{start: 2, length: 4}, {start: 23, length: 4}], + hostname: [{start: 2, length: 4}] + }, + }, + { + tab: {title: 'Marching band'}, + hostname: 'en.marching.band.com', + highlightRanges: { + 'tab.title': [{start: 1, length: 4}], + hostname: [{start: 4, length: 4}], + }, + }, + ]; + + // Results for 'search'. + const searchMatchedRecords = [ + { + tab: {title: 'Code Search'}, + hostname: 'search.chromium.search', + highlightRanges: { + 'tab.title': [{start: 5, length: 6}], + hostname: [{start: 0, length: 6}, {start: 16, length: 6}], + }, + }, + { + tab: {title: 'Search Engine Land - Search Engines'}, + hostname: 'searchengineland.com', + highlightRanges: { + 'tab.title': [{start: 0, length: 6}, {start: 21, length: 6}], + hostname: [{start: 0, length: 6}], + }, + }, + ]; + + // Empty search should return the full list. + assertResults(records, fuzzySearch('', records, options)); + assertResults(archMatchedRecords, fuzzySearch('arch', records, options)); + assertResults( + searchMatchedRecords, fuzzySearch('search', records, options)); + + // No matches should return an empty list. + assertResults([], fuzzySearch('archh', records, options)); + }); + + test('Test exact search with escaped characters.', () => { + const options = { + useFuzzySearch: false, + keys: [ + { + name: 'tab.title', + weight: 1, + }, + { + name: 'hostname', + weight: 1, + }, + ], + }; + + // Initial pre-search item list. + const records = [ + new TabData( + createTab({title: '\'beginning\\test\\end'}), TabItemType.OPEN_TAB, + 'beginning\\test\"end'), + ]; + + // Expected results for '\test'. + const backslashMatchedRecords = [ + { + tab: {title: '\'beginning\\test\\end'}, + hostname: 'beginning\\test\"end', + highlightRanges: { + 'tab.title': [{start: 10, length: 5}], + hostname: [{start: 9, length: 5}], + }, + }, + ]; + + // Expected results for '"end'. + const quoteMatchedRecords = [ + { + tab: {title: '\'beginning\\test\\end'}, + hostname: 'beginning\\test\"end', + highlightRanges: { + hostname: [{start: 14, length: 4}], + }, + }, + ]; + + assertResults( + backslashMatchedRecords, fuzzySearch('\\test', records, options)); + assertResults(quoteMatchedRecords, fuzzySearch('\"end', records, options)); + }); + + test('Test exact match result scoring accounts for match position.', () => { + const options = { + useFuzzySearch: false, + keys: [ + { + name: 'tab.title', + weight: 1, + }, + { + name: 'hostname', + weight: 1, + }, + ], + }; + + assertSearchOrders( + 'two', + [ + new TabData( + createTab({title: 'three one two'}), TabItemType.OPEN_TAB, + 'three one two'), + new TabData( + createTab({title: 'three two one'}), TabItemType.OPEN_TAB, + 'three two one'), + new TabData( + createTab({title: 'one two three'}), TabItemType.OPEN_TAB, + 'one two three'), + ], + options, [2, 1, 0]); + }); + + test( + 'Test exact match result scoring takes into account the number of matches per item.', + () => { + const options = { + useFuzzySearch: false, + keys: [ + { + name: 'tab.title', + weight: 1, + }, + { + name: 'hostname', + weight: 1, + }, + ], + }; + + assertSearchOrders( + 'one', + [ + new TabData( + createTab({title: 'one two three'}), TabItemType.OPEN_TAB, + 'one two three'), + new TabData( + createTab({title: 'one one three'}), TabItemType.OPEN_TAB, + 'one one three'), + new TabData( + createTab({title: 'one one one'}), TabItemType.OPEN_TAB, + 'one one one'), + ], + options, [2, 1, 0]); + }); + + test('Test exact match result scoring abides by the key weights.', () => { + const options = { + useFuzzySearch: false, + keys: [ + { + name: 'tab.title', + weight: 2, + }, + { + name: 'hostname', + weight: 1, + } + ] + }; + + assertSearchOrders( + 'search', + [ + new TabData( + createTab({title: 'New tab'}), TabItemType.OPEN_TAB, + 'chrome://tab-search'), + new TabData( + createTab({title: 'chrome://tab-search'}), TabItemType.OPEN_TAB, + 'chrome://tab-search'), + new TabData( + createTab({title: 'chrome://tab-search'}), TabItemType.OPEN_TAB, + 'chrome://tab-search'), + ], + options, [2, 1, 0]); + }); +});
diff --git a/chrome/test/data/webui/tab_search/tab_search_test_data.js b/chrome/test/data/webui/tab_search/tab_search_test_data.ts similarity index 62% rename from chrome/test/data/webui/tab_search/tab_search_test_data.js rename to chrome/test/data/webui/tab_search/tab_search_test_data.ts index d3d1f12..c101cde2 100644 --- a/chrome/test/data/webui/tab_search/tab_search_test_data.js +++ b/chrome/test/data/webui/tab_search/tab_search_test_data.ts
@@ -3,13 +3,11 @@ // found in the LICENSE file. import {Token} from 'chrome://resources/mojo/mojo/public/mojom/base/token.mojom-webui.js'; -import {RecentlyClosedTab, Tab} from 'chrome://tab-search.top-chrome/tab_search.js'; +import {ProfileData, RecentlyClosedTab, Tab, Window} from 'chrome://tab-search.top-chrome/tab_search.js'; -/** @type {number} */ -export const SAMPLE_WINDOW_HEIGHT = 448; +export const SAMPLE_WINDOW_HEIGHT: number = 448; -/** @type {!Array} */ -export const SAMPLE_WINDOW_DATA = [ +export const SAMPLE_WINDOW_DATA: Window[] = [ { active: true, height: SAMPLE_WINDOW_HEIGHT, @@ -22,6 +20,12 @@ url: {url: 'https://www.google.com'}, lastActiveTimeTicks: {internalValue: BigInt(5)}, lastActiveElapsedText: '', + active: false, + faviconUrl: undefined, + groupId: undefined, + isDefaultFavicon: false, + pinned: false, + showIcon: false, }, { alertStates: [], @@ -31,6 +35,12 @@ url: {url: 'https://www.amazon.com'}, lastActiveTimeTicks: {internalValue: BigInt(4)}, lastActiveElapsedText: '', + active: false, + faviconUrl: undefined, + groupId: undefined, + isDefaultFavicon: false, + pinned: false, + showIcon: false, }, { alertStates: [], @@ -40,6 +50,12 @@ url: {url: 'https://www.apple.com'}, lastActiveTimeTicks: {internalValue: BigInt(3)}, lastActiveElapsedText: '', + active: false, + faviconUrl: undefined, + groupId: undefined, + isDefaultFavicon: false, + pinned: false, + showIcon: false, }, ], }, @@ -55,6 +71,12 @@ url: {url: 'https://www.bing.com/'}, lastActiveTimeTicks: {internalValue: BigInt(2)}, lastActiveElapsedText: '', + active: false, + faviconUrl: undefined, + groupId: undefined, + isDefaultFavicon: false, + pinned: false, + showIcon: false, }, { alertStates: [], @@ -64,6 +86,12 @@ url: {url: 'https://www.yahoo.com'}, lastActiveTimeTicks: {internalValue: BigInt(1)}, lastActiveElapsedText: '', + active: false, + faviconUrl: undefined, + groupId: undefined, + isDefaultFavicon: false, + pinned: false, + showIcon: false, }, { alertStates: [], @@ -73,19 +101,25 @@ url: {url: 'https://www.apple.com/'}, lastActiveTimeTicks: {internalValue: BigInt(0)}, lastActiveElapsedText: '', + active: false, + faviconUrl: undefined, + groupId: undefined, + isDefaultFavicon: false, + pinned: false, + showIcon: false, }, ], } ]; -/** @type {!Array<RecentlyClosedTab>} */ -export const SAMPLE_RECENTLY_CLOSED_DATA = [ +export const SAMPLE_RECENTLY_CLOSED_DATA: RecentlyClosedTab[] = [ { tabId: 100, title: 'PayPal', url: {url: 'https://www.paypal.com'}, lastActiveTime: {internalValue: BigInt(11)}, lastActiveElapsedText: '', + groupId: undefined, }, { tabId: 101, @@ -93,69 +127,64 @@ url: {url: 'https://www.stripe.com'}, lastActiveTime: {internalValue: BigInt(12)}, lastActiveElapsedText: '', + groupId: undefined, }, ]; -/** @return {!Array} */ -export function sampleData() { +export function sampleData(): ProfileData { return { windows: SAMPLE_WINDOW_DATA, recentlyClosedTabs: [], tabGroups: [], recentlyClosedTabGroups: [], + recentlyClosedSectionExpanded: false, }; } -/** - * @param count - * @return {!Array<string>} - */ -export function sampleSiteNames(count) { +export function sampleSiteNames(count: number): string[] { return Array.from({length: count}, (_, i) => (i + 1).toString()); } /** * Generates sample tabs based on some given site names. - * @param {!Array<string>} siteNames - * @param {boolean} hasIndex Whether the items have an index property. - * @return {!Array<!Tab>} + * @param hasIndex Whether the items have an index property. */ -export function generateSampleTabsFromSiteNames(siteNames, hasIndex = true) { +export function generateSampleTabsFromSiteNames( + siteNames: string[], hasIndex: boolean = true): Tab[] { return siteNames.map((siteName, i) => { - const tab = /** @type {!Tab} */ ({ + const tab: Tab = { alertStates: [], tabId: i + 1, title: siteName, url: {url: 'https://www.' + siteName.toLowerCase() + '.com'}, lastActiveTimeTicks: {internalValue: BigInt(siteNames.length - i)}, lastActiveElapsedText: '', - }); - if (hasIndex) { - tab.index = i; - } + active: false, + faviconUrl: undefined, + groupId: undefined, + index: hasIndex ? i : 0, + isDefaultFavicon: false, + pinned: false, + showIcon: false, + }; return tab; }); } -/** - * @param {string} titlePrefix - * @param {number} count - * @param {Token} groupId - * @return {!Array<!RecentlyClosedTab>} - */ export function generateSampleRecentlyClosedTabs( - titlePrefix, count, groupId = undefined) { + titlePrefix: string, count: number, groupId?: Token): RecentlyClosedTab[] { return Array.from({length: count}, (_, i) => { const tabId = i + 1; - const tab = /** @type {RecentlyClosedTab} */ ({ + const tab: RecentlyClosedTab = { tabId, title: `${titlePrefix} ${tabId}`, url: {url: `https://www.sampletab.com?q=${tabId}`}, lastActiveTime: {internalValue: BigInt(count - i)}, lastActiveElapsedText: '', - }); + groupId: undefined, + }; if (groupId !== undefined) { tab.groupId = groupId; @@ -167,10 +196,9 @@ /** * Generates profile data for a window with a series of tabs. - * @param {!Array<string>} siteNames - * @return {!Object} */ -export function generateSampleDataFromSiteNames(siteNames) { +export function generateSampleDataFromSiteNames(siteNames: string[]): + ProfileData { return { windows: [{ active: true, @@ -180,15 +208,11 @@ recentlyClosedTabs: [], tabGroups: [], recentlyClosedTabGroups: [], + recentlyClosedSectionExpanded: false, }; } -/** - * @param {!bigint} high - * @param {!bigint} low - * @return {!Token} - */ -export function sampleToken(high, low) { +export function sampleToken(high: bigint, low: bigint): Token { const token = new Token(); token.high = high; token.low = low;
diff --git a/chrome/test/data/webui/tab_search/tab_search_test_helper.js b/chrome/test/data/webui/tab_search/tab_search_test_helper.js deleted file mode 100644 index 4051298..0000000 --- a/chrome/test/data/webui/tab_search/tab_search_test_helper.js +++ /dev/null
@@ -1,96 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {assertGE, assertLE} from 'chrome://webui-test/chai_assert.js'; - -/** - * Override the specified function and parameters for the given class to avoid - * scroll animations that delay the scrollTop property updates. - * @param {!Object} klass - * @param {string} functionName - */ -export function disableAnimationBehavior(klass, functionName) { - const originalFunction = klass.prototype[functionName]; - klass.prototype[functionName] = function(options) { - const args = []; - if (typeof options === 'object' && options !== null) { - let noAnimationOptions = Object.assign({}, options); - delete noAnimationOptions.behavior; - - args.push(noAnimationOptions); - } - originalFunction.apply(this, args); - }; -} - -/** - * Assert that the tabItem HTML element is fully visible within the current - * scroll view. - * @param {!HTMLElement} tabsDiv - * @param {!HTMLElement} tabItem - */ -export function assertTabItemInViewBounds(tabsDiv, tabItem) { - assertGE(tabItem.offsetTop, tabsDiv.scrollTop); - - assertLE( - tabItem.offsetTop + tabItem.offsetHeight, - tabsDiv.scrollTop + tabsDiv.offsetHeight); -} - -/** - * @param {!HTMLElement} tabsDiv The HTML element containing a list of tab - * items. - * @param {!NodeList<!HTMLElement>} tabItems A list of tab items. - * @param {number} index The tab item's index in the list of tab items. - */ -export function assertTabItemAndNeighborsInViewBounds( - tabsDiv, tabItems, index) { - if (index > 0) { - assertTabItemInViewBounds(tabsDiv, tabItems[index - 1]); - } - - assertTabItemInViewBounds(tabsDiv, tabItems[index]); - - if (index < tabItems.length - 1) { - assertTabItemInViewBounds(tabsDiv, tabItems[index + 1]); - } -} - -/** - * Initialize a mock ProfileData object with defaults that would be set - * by the Mojo IPC logic. - * @param {!ProfileData} profileData - */ -export function initProfileDataWithDefaults(profileData) { - // Initialize undefined array properties - ['tabGroups', 'recentlyClosedTabs', 'recentlyClosedTabGroups'].forEach( - (arrayProp) => { - if (!profileData.hasOwnProperty(arrayProp)) { - profileData[arrayProp] = []; - } - }); - if (!profileData.hasOwnProperty('recentlyClosedSectionExpanded')) { - profileData.recentlyClosedSectionExpanded = false; - } -} - -/** - * Initialize the loadTimeData with the provided data and defaults. - * @param {Object=} loadTimeOverriddenData - */ -export function initLoadTimeDataWithDefaults(loadTimeOverriddenData) { - if (!loadTimeOverriddenData) { - loadTimeOverriddenData = {}; - } - if (!loadTimeOverriddenData.hasOwnProperty('shortcutText')) { - loadTimeOverriddenData.shortcutText = ''; - } - if (!loadTimeOverriddenData.hasOwnProperty( - 'recentlyClosedDefaultItemDisplayCount')) { - loadTimeOverriddenData.recentlyClosedDefaultItemDisplayCount = 5; - } - - loadTimeData.overrideValues(loadTimeOverriddenData); -}
diff --git a/chrome/test/data/webui/tab_search/tab_search_test_helper.ts b/chrome/test/data/webui/tab_search/tab_search_test_helper.ts new file mode 100644 index 0000000..88be0b4 --- /dev/null +++ b/chrome/test/data/webui/tab_search/tab_search_test_helper.ts
@@ -0,0 +1,86 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {ProfileData} from 'chrome://tab-search.top-chrome/tab_search.js'; +import {assertGE, assertLE} from 'chrome://webui-test/chai_assert.js'; + +/** + * Override the specified function and parameters for the given class to avoid + * scroll animations that delay the scrollTop property updates. + * @param {!Object} klass + */ +export function disableAnimationBehavior(klass: any, functionName: string) { + const originalFunction = klass.prototype[functionName]; + klass.prototype[functionName] = function(options: any) { + const args = []; + if (typeof options === 'object' && options !== null) { + let noAnimationOptions = Object.assign({}, options); + delete noAnimationOptions.behavior; + + args.push(noAnimationOptions); + } + originalFunction.apply(this, args); + }; +} + +/** + * Assert that the tabItem HTML element is fully visible within the current + * scroll view. + */ +export function assertTabItemInViewBounds( + tabsDiv: HTMLElement, tabItem: HTMLElement) { + assertGE(tabItem.offsetTop, tabsDiv.scrollTop); + + assertLE( + tabItem.offsetTop + tabItem.offsetHeight, + tabsDiv.scrollTop + tabsDiv.offsetHeight); +} + +/** + * @param tabsDiv The HTML element containing a list of tab items. + * @param tabItems A list of tab items. + * @param index The tab item's index in the list of tab items. + */ +export function assertTabItemAndNeighborsInViewBounds( + tabsDiv: HTMLElement, tabItems: NodeListOf<HTMLElement>, index: number) { + if (index > 0) { + assertTabItemInViewBounds(tabsDiv, tabItems[index - 1]!); + } + + assertTabItemInViewBounds(tabsDiv, tabItems[index]!); + + if (index < tabItems.length - 1) { + assertTabItemInViewBounds(tabsDiv, tabItems[index + 1]!); + } +} + +/** + * Initialize a mock ProfileData object with defaults that would be set + * by the Mojo IPC logic. + */ +export function initProfileDataWithDefaults(profileData: ProfileData) { + ['tabGroups', 'recentlyClosedTabs', 'recentlyClosedTabGroups'].forEach( + (arrayProp) => { + if (!profileData.hasOwnProperty(arrayProp)) { + (profileData as {[key: string]: any})[arrayProp] = []; + } + }); + if (!profileData.hasOwnProperty('recentlyClosedSectionExpanded')) { + profileData.recentlyClosedSectionExpanded = false; + } +} + +/** + * Initialize the loadTimeData with the provided data and defaults. + */ +export function initLoadTimeDataWithDefaults( + loadTimeOverriddenData: {[key: string]: string} = {}) { + loadTimeData.overrideValues(Object.assign( + { + shortcutText: '', + recentlyClosedDefaultItemDisplayCount: 5, + }, + loadTimeOverriddenData)); +}
diff --git a/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.js b/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.js deleted file mode 100644 index 7db2225..0000000 --- a/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.js +++ /dev/null
@@ -1,78 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {PageCallbackRouter, PageRemote, ProfileData} from 'chrome://tab-search.top-chrome/tab_search.js'; - -import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; - -/** @implements {TabSearchApiProxy} */ -export class TestTabSearchApiProxy extends TestBrowserProxy { - constructor() { - super([ - 'closeTab', - 'getProfileData', - 'openRecentlyClosedEntry', - 'switchToTab', - 'saveRecentlyClosedExpandedPref', - 'showUI', - ]); - - /** @type {!PageCallbackRouter} */ - this.callbackRouter = new PageCallbackRouter(); - - /** @type {!PageRemote} */ - this.callbackRouterRemote = - this.callbackRouter.$.bindNewPipeAndPassRemote(); - - /** @private {ProfileData} */ - this.profileData_; - } - - /** @override */ - closeTab(tabId, withSearch, closedTabIndex) { - this.methodCalled('closeTab', [tabId, withSearch, closedTabIndex]); - } - - /** @override */ - getProfileData() { - this.methodCalled('getProfileData'); - return Promise.resolve({profileData: this.profileData_}); - } - - /** @override */ - openRecentlyClosedEntry(id, withSearch, isTab, index) { - this.methodCalled( - 'openRecentlyClosedEntry', [id, withSearch, isTab, index]); - } - - /** @override */ - switchToTab(tabInfo, withSearch, switchedTabIndex) { - this.methodCalled('switchToTab', [tabInfo, withSearch, switchedTabIndex]); - } - - /** @override */ - saveRecentlyClosedExpandedPref(expanded) { - this.methodCalled('saveRecentlyClosedExpandedPref', [expanded]); - } - - /** @override */ - showUI() { - this.methodCalled('showUI'); - } - - /** @override */ - getCallbackRouter() { - return this.callbackRouter; - } - - /** return {!PageRemote} */ - getCallbackRouterRemote() { - return this.callbackRouterRemote; - } - - /** @param {ProfileData} profileData */ - setProfileData(profileData) { - this.profileData_ = profileData; - } -}
diff --git a/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.ts b/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.ts new file mode 100644 index 0000000..f1f675e --- /dev/null +++ b/chrome/test/data/webui/tab_search/test_tab_search_api_proxy.ts
@@ -0,0 +1,69 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {PageCallbackRouter, PageRemote, ProfileData, SwitchToTabInfo, TabSearchApiProxy} from 'chrome://tab-search.top-chrome/tab_search.js'; +import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; + +export class TestTabSearchApiProxy extends TestBrowserProxy implements + TabSearchApiProxy { + callbackRouter: PageCallbackRouter; + callbackRouterRemote: PageRemote; + private profileData_?: ProfileData; + + constructor() { + super([ + 'closeTab', + 'getProfileData', + 'openRecentlyClosedEntry', + 'switchToTab', + 'saveRecentlyClosedExpandedPref', + 'showUI', + ]); + + this.callbackRouter = new PageCallbackRouter(); + + this.callbackRouterRemote = + this.callbackRouter.$.bindNewPipeAndPassRemote(); + } + + closeTab(tabId: number, withSearch: boolean, closedTabIndex: number) { + this.methodCalled('closeTab', [tabId, withSearch, closedTabIndex]); + } + + getProfileData() { + this.methodCalled('getProfileData'); + return Promise.resolve({profileData: this.profileData_!}); + } + + openRecentlyClosedEntry( + id: number, withSearch: boolean, isTab: boolean, index: number) { + this.methodCalled( + 'openRecentlyClosedEntry', [id, withSearch, isTab, index]); + } + + switchToTab( + info: SwitchToTabInfo, withSearch: boolean, switchedTabIndex: number) { + this.methodCalled('switchToTab', [info, withSearch, switchedTabIndex]); + } + + saveRecentlyClosedExpandedPref(expanded: boolean) { + this.methodCalled('saveRecentlyClosedExpandedPref', [expanded]); + } + + showUI() { + this.methodCalled('showUI'); + } + + getCallbackRouter() { + return this.callbackRouter; + } + + getCallbackRouterRemote() { + return this.callbackRouterRemote; + } + + setProfileData(profileData: ProfileData) { + this.profileData_ = profileData; + } +}
diff --git a/chrome/updater/installer_mac.cc b/chrome/updater/installer_mac.cc index 6ea4e66c..9f0a029 100644 --- a/chrome/updater/installer_mac.cc +++ b/chrome/updater/installer_mac.cc
@@ -17,13 +17,11 @@ const base::FilePath& app_installer, const std::string& arguments, ProgressCallback /*progress_callback*/) { - DVLOG(1) << "Running application install from DMG"; + DVLOG(1) << "Running application install from DMG at " << app_installer; // InstallFromArchive() returns the exit code of the script. 0 is success and // anything else should be an error. - const int exit_code = - InstallFromArchive(app_installer, checker_path_, ap_, updater_scope_, - base::StrCat({pv_.GetString(), " ", arguments})); - + const int exit_code = InstallFromArchive(app_installer, checker_path_, ap_, + updater_scope_, pv_, arguments); return exit_code == 0 ? Result() : Result(kErrorApplicationInstallerFailed, exit_code); }
diff --git a/chrome/updater/mac/install_from_archive.h b/chrome/updater/mac/install_from_archive.h index e0eb664..15d8889 100644 --- a/chrome/updater/mac/install_from_archive.h +++ b/chrome/updater/mac/install_from_archive.h
@@ -9,6 +9,7 @@ namespace base { class FilePath; +class Version; } namespace updater { @@ -52,6 +53,7 @@ const base::FilePath& existence_checker_path, const std::string& ap, const UpdaterScope& scope, + const base::Version& pv, const std::string& arguments); } // namespace updater
diff --git a/chrome/updater/mac/install_from_archive.mm b/chrome/updater/mac/install_from_archive.mm index 0b4bfe5..c1e348c 100644 --- a/chrome/updater/mac/install_from_archive.mm +++ b/chrome/updater/mac/install_from_archive.mm
@@ -25,6 +25,7 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" +#include "base/version.h" #include "chrome/updater/mac/mac_util.h" #include "chrome/updater/updater_scope.h" #include "chrome/updater/util.h" @@ -121,6 +122,7 @@ const std::string& ap, const std::string& arguments, const UpdaterScope& scope, + const base::Version& pv, const base::FilePath& unpacked_path) { if (!base::PathExists(unpacked_path)) { VLOG(1) << "File path (" << unpacked_path << ") does not exist."; @@ -129,9 +131,11 @@ int run_executables = 0; for (const char* executable : { ".preinstall", + ".keystone_preinstall", ".install", ".keystone_install", ".postinstall", + ".keystone_postinstall", }) { base::FilePath executable_file_path = unpacked_path.Append(executable); if (!base::PathExists(executable_file_path)) @@ -143,19 +147,10 @@ return static_cast<int>(InstallErrors::kExecutablePathNotExecutable); } - // TODO(crbug.com/1056818): Improve the way we parse args for CommandLine - // object. base::CommandLine command(executable_file_path); command.AppendArgPath(unpacked_path); - if (!arguments.empty()) { - base::CommandLine::StringVector argv = - base::SplitString(arguments, base::kWhitespaceASCII, - base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - argv.insert(argv.begin(), existence_checker_path.value()); - argv.insert(argv.begin(), unpacked_path.value()); - argv.insert(argv.begin(), executable_file_path.value()); - command = base::CommandLine(argv); - } + command.AppendArgPath(existence_checker_path); + command.AppendArg(pv.GetString()); std::string env_path = "/bin:/usr/bin"; absl::optional<base::FilePath> ksadmin_path = @@ -168,12 +163,16 @@ options.current_directory = unpacked_path; options.clear_environment = true; options.environment = { - {"PATH", env_path}, - {"KS_TICKET_XC_PATH", existence_checker_path.value()}, {"KS_TICKET_AP", ap}, + {"KS_TICKET_XC_PATH", existence_checker_path.value()}, + {"PATH", env_path}, + {"PREVIOUS_VERSION", pv.GetString()}, + {"SERVER_ARGS", arguments}, {"UPDATE_IS_MACHINE", scope == UpdaterScope::kSystem ? "1" : "0"}, + {"UNPACK_DIR", unpacked_path.value()}, }; int exit_code = 0; + VLOG(1) << "Running " << command.GetCommandLineString(); if (!base::LaunchProcess(command, options).WaitForExit(&exit_code)) return static_cast<int>(InstallErrors::kExecutableWaitForExitFailed); if (exit_code != 0) @@ -309,6 +308,7 @@ const base::FilePath& existence_checker_path, const std::string& ap, const UpdaterScope& scope, + const base::Version& pv, const std::string& arguments) { const std::map<std::string, int (*)(const base::FilePath&, @@ -323,7 +323,7 @@ if (base::PathExists(new_path)) { return entry.second( new_path, base::BindOnce(&RunExecutable, existence_checker_path, ap, - arguments, scope)); + arguments, scope, pv)); } }
diff --git a/chrome/updater/mac/setup/.install.sh b/chrome/updater/mac/setup/.install.sh index bb7d29a1..443fd894 100755 --- a/chrome/updater/mac/setup/.install.sh +++ b/chrome/updater/mac/setup/.install.sh
@@ -3,40 +3,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# usage: install.sh update_dmg_mount_point -# -# Exit codes: -# 0 Success! -# 99 This will return a usage message. -# * Other exit codes come from the updater --install exit codes. +# Exit codes come from the updater exit codes. PRODUCT_NAME= readonly PRODUCT_NAME -usage() { - echo "usage: ${ME} update_dmg_mount_point" >& 2 -} - -main() { - local update_dmg_mount_point="${1}" - local path_to_executable=\ -"${update_dmg_mount_point}/${PRODUCT_NAME}.app/Contents/MacOS/${PRODUCT_NAME}" - - # Run the executable with --install - if [[ $UPDATE_IS_MACHINE -eq 1 ]]; then - "${path_to_executable}" --install --system - else - "${path_to_executable}" --install - fi -} - -# Check "less than" instead of "not equal to" in case there are changes to pass -# more arguments. -if [[ ${#} -lt 1 ]]; then - usage - echo ${#} >& 1 - exit 99 -fi - -main "${@}" -exit ${?} +local exe="${UNPACK_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${PRODUCT_NAME}" +"${exe}" ${SERVER_ARGS}
diff --git a/chrome/updater/mac/setup/setup_unittest.mm b/chrome/updater/mac/setup/setup_unittest.mm index 6163f56..5f01cd1 100644 --- a/chrome/updater/mac/setup/setup_unittest.mm +++ b/chrome/updater/mac/setup/setup_unittest.mm
@@ -12,6 +12,7 @@ #include "base/strings/strcat.h" #include "base/strings/sys_string_conversions.h" #include "base/test/task_environment.h" +#include "base/version.h" #include "chrome/common/chrome_paths.h" #include "chrome/updater/mac/install_from_archive.h" #include "chrome/updater/updater_scope.h" @@ -161,7 +162,8 @@ GetTestDir().Append(FILE_PATH_LITERAL(kUpdaterTestDMGName)); ASSERT_TRUE(base::PathExists(dmg_file_path)); ASSERT_NE(updater::InstallFromArchive(dmg_file_path, {}, {}, - updater::UpdaterScope::kUser, {}), + updater::UpdaterScope::kUser, + base::Version("0"), {}), 0); } @@ -172,7 +174,8 @@ GetTestDir().Append(FILE_PATH_LITERAL(kUpdaterTestDMGName)); ASSERT_TRUE(base::PathExists(dmg_file_path)); ASSERT_NE(updater::InstallFromArchive(dmg_file_path, {}, {}, - updater::UpdaterScope::kUser, "arg2"), + updater::UpdaterScope::kUser, + base::Version("0"), "arg2"), 0); } @@ -189,7 +192,7 @@ ASSERT_EQ(updater::InstallFromArchive(dmg_file_path, installed_app_path, {}, updater::UpdaterScope::kUser, - kTestAppVersion), + base::Version(kTestAppVersion), {}), 0); } @@ -207,7 +210,8 @@ std::string args = base::StrCat({kTestAppVersion, " arg1 arg2"}); ASSERT_EQ(updater::InstallFromArchive(dmg_file_path, installed_app_path, {}, - updater::UpdaterScope::kUser, args), + updater::UpdaterScope::kUser, + base::Version("0"), args), 0); } @@ -219,25 +223,25 @@ ASSERT_EQ(updater::InstallFromArchive( test_dir.Append("setup_test_envcheck").Append("marker.app"), base::FilePath::FromASCII("xc_path"), "ap", - updater::UpdaterScope::kUser, "arg1 arg2"), + updater::UpdaterScope::kUser, base::Version("0"), "arg1 arg2"), 0); ASSERT_EQ( updater::InstallFromArchive( test_dir.Append("setup_test_preinstallfailure").Append("marker.app"), - {}, {}, updater::UpdaterScope::kUser, {}), + {}, {}, updater::UpdaterScope::kUser, base::Version("0"), {}), 1); ASSERT_EQ( updater::InstallFromArchive( test_dir.Append("setup_test_installfailure").Append("marker.app"), {}, - {}, updater::UpdaterScope::kUser, {}), + {}, updater::UpdaterScope::kUser, base::Version("0"), {}), 2); ASSERT_EQ( updater::InstallFromArchive( test_dir.Append("setup_test_postinstallfailure").Append("marker.app"), - {}, {}, updater::UpdaterScope::kUser, {}), + {}, {}, updater::UpdaterScope::kUser, base::Version("0"), {}), 3); }
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index 123fc680..7ea5131 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -2473,13 +2473,13 @@ </message> <!-- Critical error page --> <message name="IDS_SHIMLESS_RMA_CRITICAL_ERROR_TITLE" translateable="false" desc="The title for the critical error page. Critical errors cause the RMA process to attempt to exit to login or reboot the device at users discretion. It will try to cancel RMA, but if that fails the next boot may also trigger an RMA critical error."> - Critical Error + Error </message> <message name="IDS_SHIMLESS_RMA_CRITICAL_ERROR_MESSAGE" translateable="false" desc="The message for the critical error when Shimless RMA app is launched when not in RMA. This should never happen."> - Repair finalization is in an unexpected state. You can exit to the login screen to investigate or backup data or reboot the device to attempt to resolve the issue. If you continue to see this message you should use the recovery shim. + We're running into errors. Try rebooting or recover the firmware using a USB thumbdrive. </message> - <message name="IDS_SHIMLESS_RMA_CRITICAL_EXIT_TO_LOGIN_BUTTON" translateable="false" desc="Label for the button that attempts to cancel RMA and exit to the login screen."> - Exit to login + <message name="IDS_SHIMLESS_RMA_CRITICAL_RECOVER_FIRMWARE_BUTTON" translateable="false" desc="Label for the button that attempts to recover firmware."> + Recover firmware image </message> <message name="IDS_SHIMLESS_RMA_CRITICAL_REBOOT_BUTTON" translateable="false" desc="Label for the button that attempts to cancel RMA and reboot the device."> Reboot
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.cc b/chromeos/dbus/session_manager/fake_session_manager_client.cc index c6c8ded..dad17e5 100644 --- a/chromeos/dbus/session_manager/fake_session_manager_client.cc +++ b/chromeos/dbus/session_manager/fake_session_manager_client.cc
@@ -8,6 +8,7 @@ #include "base/base64.h" #include "base/bind.h" +#include "base/check.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_file.h" @@ -624,10 +625,15 @@ void FakeSessionManagerClient::GetServerBackedStateKeys( StateKeysCallback callback) { - if (force_state_keys_missing_) { + if (state_keys_handling_ == ServerBackedStateKeysHandling::kNoResponse) { + return; + } + if (state_keys_handling_ == + ServerBackedStateKeysHandling::kForceNotAvailable) { PostReply(FROM_HERE, std::move(callback), std::vector<std::string>()); return; } + DCHECK_EQ(state_keys_handling_, ServerBackedStateKeysHandling::kRegular); if (policy_storage_ == PolicyStorageType::kOnDisk) { base::FilePath owner_key_path;
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.h b/chromeos/dbus/session_manager/fake_session_manager_client.h index a68b5e8..98fcd3c 100644 --- a/chromeos/dbus/session_manager/fake_session_manager_client.h +++ b/chromeos/dbus/session_manager/fake_session_manager_client.h
@@ -32,6 +32,15 @@ kInMemory, // Store policy in memory only. Usually used for tests. }; + enum class ServerBackedStateKeysHandling { + // session_manager responds with configured state keys. + kRegular, + // session_manager responds with no state keys being available. + kForceNotAvailable, + // session_manager does not respond on GetServerBackedStateKeys. + kNoResponse, + }; + // A callback tht FakeSessionManagerClient can use to inform the test that // LoadShillProfile has been called. using OnLoadShillProfileCallback = base::RepeatingCallback<void( @@ -280,8 +289,9 @@ arc_start_time_ = arc_start_time; } - void set_force_state_keys_missing(bool force_state_keys_missing) { - force_state_keys_missing_ = force_state_keys_missing; + void set_state_keys_handling( + ServerBackedStateKeysHandling state_keys_handling) { + state_keys_handling_ = state_keys_handling; } void set_adb_sideload_enabled(bool adb_sideload_enabled) { @@ -362,7 +372,8 @@ int start_tpm_firmware_update_call_count_ = 0; std::string last_tpm_firmware_update_mode_; bool screen_is_locked_ = false; - bool force_state_keys_missing_ = false; + ServerBackedStateKeysHandling state_keys_handling_ = + ServerBackedStateKeysHandling::kRegular; OnLoadShillProfileCallback on_load_shill_profile_callback_; bool arc_available_ = false;
diff --git a/chromeos/services/bluetooth_config/device_operation_handler.cc b/chromeos/services/bluetooth_config/device_operation_handler.cc index f41f006e..c76f3f4 100644 --- a/chromeos/services/bluetooth_config/device_operation_handler.cc +++ b/chromeos/services/bluetooth_config/device_operation_handler.cc
@@ -78,6 +78,11 @@ // operation occurring if Bluetooth disables. If we don't, we can remove this // observer. void DeviceOperationHandler::OnAdapterStateChanged() { + if (current_operation_) { + BLUETOOTH_LOG(DEBUG) << "Device with id: " << current_operation_->device_id + << " adapter state changed during operation: " + << current_operation_->operation; + } if (IsBluetoothEnabled()) return; } @@ -85,16 +90,25 @@ void DeviceOperationHandler::EnqueueOperation(Operation operation, const std::string& device_id, OperationCallback callback) { + BLUETOOTH_LOG(DEBUG) << "Device with id: " << device_id + << " enqueueing operation: " << operation << " (" + << (queue_.size() + 1) << " operations already queued)"; queue_.emplace(operation, device_id, std::move(callback)); ProcessQueue(); } void DeviceOperationHandler::ProcessQueue() { - if (current_operation_) + if (current_operation_) { + BLUETOOTH_LOG(DEBUG) << "Device with id: " << current_operation_->device_id + << " continuing operation: " + << current_operation_->operation; return; + } - if (queue_.empty()) + if (queue_.empty()) { + BLUETOOTH_LOG(DEBUG) << "No operations queued"; return; + } PerformNextOperation(); } @@ -114,6 +128,7 @@ BLUETOOTH_LOG(EVENT) << "Device with id: " << current_operation_->device_id << " starting operation: " << current_operation_->operation; + switch (current_operation_->operation) { case Operation::kConnect: PerformConnect(current_operation_->device_id);
diff --git a/chromeos/services/bluetooth_config/device_operation_handler_impl.cc b/chromeos/services/bluetooth_config/device_operation_handler_impl.cc index b66d47c..082fedfb 100644 --- a/chromeos/services/bluetooth_config/device_operation_handler_impl.cc +++ b/chromeos/services/bluetooth_config/device_operation_handler_impl.cc
@@ -61,11 +61,17 @@ return; } - device->Forget( - base::BindOnce(&DeviceOperationHandlerImpl::OnOperationFinished, - weak_ptr_factory_.GetWeakPtr(), /*success=*/true), - base::BindOnce(&DeviceOperationHandlerImpl::OnOperationFinished, - weak_ptr_factory_.GetWeakPtr(), /*success=*/false)); + // We do not expect "Forget" operations to ever fail, so don't bother passing + // success and failure callbacks here. + device->Forget(base::DoNothing(), base::BindOnce( + [](const std::string device_id) { + BLUETOOTH_LOG(ERROR) + << "Forget failed, device id: " + << device_id; + }, + device_id)); + + HandleFinishedOperation(/*success=*/true); } void DeviceOperationHandlerImpl::OnDeviceConnect(
diff --git a/chromeos/services/bluetooth_config/device_operation_handler_impl_unittest.cc b/chromeos/services/bluetooth_config/device_operation_handler_impl_unittest.cc index f4f851e..3e2a8218 100644 --- a/chromeos/services/bluetooth_config/device_operation_handler_impl_unittest.cc +++ b/chromeos/services/bluetooth_config/device_operation_handler_impl_unittest.cc
@@ -257,19 +257,14 @@ EXPECT_EQ(results()[0], std::make_tuple(device_id, Operation::kForget, false)); - // Add the device and simulate BluetoothDevice::Forget() failing. + // Add and forget the device. AddDevice(&device_id); ForgetDevice(device_id); - EXPECT_TRUE(HasPendingForgetCallback()); - InvokePendingForgetCallback(/*success=*/false); - EXPECT_EQ(results()[1], - std::make_tuple(device_id, Operation::kForget, false)); - // Simulate BluetoothDevice::Forget() succeeding. - ForgetDevice(device_id); - EXPECT_TRUE(HasPendingForgetCallback()); - InvokePendingForgetCallback(/*success=*/true); - EXPECT_EQ(results()[2], std::make_tuple(device_id, Operation::kForget, true)); + // Forgetting a device will never fail, and the handler will immediately + // notify that the operation finished successfully, so don't bother checking + // for pending callbacks. + EXPECT_EQ(results()[1], std::make_tuple(device_id, Operation::kForget, true)); } TEST_F(DeviceOperationHandlerImplTest, SimultaneousOperationsAreQueued) {
diff --git a/components/android_autofill/DEPS b/components/android_autofill/DEPS index a0d14e6b..730952a 100644 --- a/components/android_autofill/DEPS +++ b/components/android_autofill/DEPS
@@ -4,3 +4,9 @@ "+content/public/browser", "+ui", ] + +specific_include_rules = { + "autofill_provider_unittest.cc" : [ + "+content/public/test", + ], +}
diff --git a/components/android_autofill/browser/BUILD.gn b/components/android_autofill/browser/BUILD.gn index d80b56f..7812257 100644 --- a/components/android_autofill/browser/BUILD.gn +++ b/components/android_autofill/browser/BUILD.gn
@@ -83,6 +83,7 @@ sources = [ "autofill_provider_unittest.cc" ] deps = [ ":test_support", + "//content/test:test_support", "//testing/gmock", "//testing/gtest", ]
diff --git a/components/android_autofill/browser/autofill_provider.h b/components/android_autofill/browser/autofill_provider.h index 174e109..dca4a6b 100644 --- a/components/android_autofill/browser/autofill_provider.h +++ b/components/android_autofill/browser/autofill_provider.h
@@ -102,11 +102,6 @@ explicit AutofillProvider(content::WebContents* web_contents); friend class content::WebContentsUserData<AutofillProvider>; -#ifdef UNIT_TEST - // For the unit tests where WebContents isn't available. - AutofillProvider() = default; -#endif // UNIT_TEST - content::WebContents* web_contents() { return &GetWebContents(); } private:
diff --git a/components/android_autofill/browser/autofill_provider_unittest.cc b/components/android_autofill/browser/autofill_provider_unittest.cc index 898e15a3..0568558 100644 --- a/components/android_autofill/browser/autofill_provider_unittest.cc +++ b/components/android_autofill/browser/autofill_provider_unittest.cc
@@ -5,6 +5,9 @@ #include "base/memory/raw_ptr.h" #include "components/android_autofill/browser/android_autofill_manager.h" #include "components/android_autofill/browser/test_autofill_provider.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_browser_context.h" +#include "content/public/test/web_contents_tester.h" #include "testing/gtest/include/gtest/gtest.h" namespace autofill { @@ -30,6 +33,9 @@ class AutofillProviderTestHelper : public TestAutofillProvider { public: + explicit AutofillProviderTestHelper(content::WebContents* web_contents) + : TestAutofillProvider(web_contents) {} + bool HasServerPrediction() const { return manager_->has_server_prediction(); } private: @@ -51,8 +57,11 @@ class AutofillProviderTest : public testing::Test { public: void SetUp() override { + web_contents_ = content::WebContentsTester::CreateTestWebContents( + &browser_context_, nullptr); + // Owned by WebContents. autofill_provider_test_helper_ = - std::make_unique<AutofillProviderTestHelper>(); + new AutofillProviderTestHelper(web_contents_.get()); android_autofill_manager_test_helper_ = std::make_unique<AndroidAutofillManagerTestHelper>( autofill_provider_test_helper_.get()); @@ -67,7 +76,11 @@ } private: - std::unique_ptr<AutofillProviderTestHelper> autofill_provider_test_helper_; + content::BrowserTaskEnvironment task_environment_; + content::TestBrowserContext browser_context_; + std::unique_ptr<content::WebContents> web_contents_; + // Owned by WebContents. + raw_ptr<AutofillProviderTestHelper> autofill_provider_test_helper_; std::unique_ptr<AndroidAutofillManagerTestHelper> android_autofill_manager_test_helper_; };
diff --git a/components/android_autofill/browser/test_autofill_provider.h b/components/android_autofill/browser/test_autofill_provider.h index 807ac43..dcb28fa 100644 --- a/components/android_autofill/browser/test_autofill_provider.h +++ b/components/android_autofill/browser/test_autofill_provider.h
@@ -13,11 +13,6 @@ class TestAutofillProvider : public AutofillProvider { public: -#ifdef UNIT_TEST - // For unit testing only. - TestAutofillProvider() = default; -#endif // UNIT_TEST - // Create a instance owned by |web_contents|. explicit TestAutofillProvider(content::WebContents* web_contents) : AutofillProvider(web_contents) {}
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc index 1467a01..a6e66c8 100644 --- a/components/autofill/core/browser/autofill_external_delegate.cc +++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -110,8 +110,8 @@ // Only include "Autofill Options" special menu item if we have Autofill // suggestions. has_autofill_suggestions_ = false; - for (size_t i = 0; i < suggestions.size(); ++i) { - if (suggestions[i].frontend_id > 0) { + for (auto& suggestion : suggestions) { + if (suggestion.frontend_id > 0) { has_autofill_suggestions_ = true; break; } @@ -141,8 +141,8 @@ (GetPopupType() == PopupType::kAddresses || GetPopupType() == PopupType::kUnspecified) && suggestions[0].frontend_id != POPUP_ITEM_ID_MIXED_FORM_MESSAGE) { - suggestions.push_back(Suggestion( - l10n_util::GetStringUTF16(IDS_AUTOFILL_HIDE_SUGGESTIONS))); + suggestions.emplace_back( + l10n_util::GetStringUTF16(IDS_AUTOFILL_HIDE_SUGGESTIONS)); suggestions.back().frontend_id = POPUP_ITEM_ID_HIDE_AUTOFILL_SUGGESTIONS; } @@ -405,6 +405,16 @@ void AutofillExternalDelegate::ApplyAutofillOptions( std::vector<Suggestion>* suggestions, bool is_all_server_suggestions) { + // Add a separator before the Autofill options unless there are no suggestions + // yet. + // TODO(crbug.com/1274134): Clean up once improvements are launched. + if (base::FeatureList::IsEnabled( + autofill::features::kAutofillVisualImprovementsForSuggestionUi) && + !suggestions->empty()) { + suggestions->push_back(Suggestion()); + suggestions->back().frontend_id = POPUP_ITEM_ID_SEPARATOR; + } + // The form has been auto-filled, so give the user the chance to clear the // form. Append the 'Clear form' menu item. if (query_field_.is_autofilled) {
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 437762ca..a09a113 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -84,14 +84,15 @@ const base::Feature kAutofillAllowNonHttpActivation{ "AutofillAllowNonHttpActivation", base::FEATURE_DISABLED_BY_DEFAULT}; +// If enabled, three address profiles are created for testing. const base::Feature kAutofillCreateDataForTest{ "AutofillCreateDataForTest", base::FEATURE_DISABLED_BY_DEFAULT}; -// Controls if the heuristic field parsing utilizes shared labels. -// TODO(crbug/1165780): Remove once shared labels are launched. -const base::Feature kAutofillEnableSupportForParsingWithSharedLabels{ - "AutofillEnableSupportForParsingWithSharedLabels", - base::FEATURE_DISABLED_BY_DEFAULT}; +// If enabled, AutofillPopupControllerImpl is destructed not immediately in its +// HideViewAndDie() function, but as a delayed task. +// TODO(crbug.com/1277218): Cleanup when launched. +const base::Feature kAutofillDelayPopupControllerDeletion{ + "AutofillDelayPopupControllerDeletion", base::FEATURE_DISABLED_BY_DEFAULT}; // Kill switch for Autofill filling. const base::Feature kAutofillDisableFilling{"AutofillDisableFilling", @@ -107,6 +108,12 @@ const base::Feature kAutofillDisableAddressImport{ "AutofillDisableAddressImport", base::FEATURE_DISABLED_BY_DEFAULT}; +// Controls if the heuristic field parsing utilizes shared labels. +// TODO(crbug/1165780): Remove once shared labels are launched. +const base::Feature kAutofillEnableSupportForParsingWithSharedLabels{ + "AutofillEnableSupportForParsingWithSharedLabels", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Controls if Chrome support filling and importing apartment numbers. // TODO(crbug.com/1153715): Remove once launched. const base::Feature kAutofillEnableSupportForApartmentNumbers{
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index 595d0d3..43da370 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -45,6 +45,8 @@ extern const base::Feature kAutofillAllowNonHttpActivation; COMPONENT_EXPORT(AUTOFILL) extern const base::Feature kAutofillCreateDataForTest; +COMPONENT_EXPORT(AUTOFILL) +extern const base::Feature kAutofillDelayPopupControllerDeletion; COMPONENT_EXPORT(AUTOFILL) extern const base::Feature kAutofillDisableFilling; COMPONENT_EXPORT(AUTOFILL) extern const base::Feature kAutofillDisableAddressImport;
diff --git a/components/browser_ui/photo_picker/android/java/res/layout/photo_picker_dialog.xml b/components/browser_ui/photo_picker/android/java/res/layout/photo_picker_dialog.xml index 8dd7b5d4..28d9036a 100644 --- a/components/browser_ui/photo_picker/android/java/res/layout/photo_picker_dialog.xml +++ b/components/browser_ui/photo_picker/android/java/res/layout/photo_picker_dialog.xml
@@ -9,7 +9,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/default_bg_color_elev_0" > + android:background="@macro/default_bg_color" > <org.chromium.components.browser_ui.widget.selectable_list.SelectableListLayout android:id="@+id/selectable_list"
diff --git a/components/browser_ui/styles/android/java/res/values/themes.xml b/components/browser_ui/styles/android/java/res/values/themes.xml index cd9d979..53b0292 100644 --- a/components/browser_ui/styles/android/java/res/values/themes.xml +++ b/components/browser_ui/styles/android/java/res/values/themes.xml
@@ -52,8 +52,6 @@ <item name="colorSwitchTrackNormalNonDynamic">@color/baseline_neutral_variant_100</item> <!-- Custom semantic names --> - <!-- Will support dynamic colors in the future. --> - <item name="default_bg_color">@color/default_bg_color</item> <!-- Supports dynamic colors now. --> <item name="default_bg_color_dynamic">?attr/colorSurface</item> <item name="divider_line_bg_color_dynamic">?attr/colorSurfaceVariant</item> @@ -148,8 +146,6 @@ <item name="android:textColorSecondary">@color/default_text_color_secondary_list</item> <item name="colorOnPrimaryContainer">@color/baseline_primary_900</item> <item name="colorPrimaryContainer">@color/baseline_primary_100</item> - <!-- Will support dynamic colors in the future. --> - <item name="default_bg_color">@color/default_bg_color</item> <!-- Supports dynamic colors now. --> <item name="default_bg_color_dynamic">?attr/colorSurface</item> <item name="divider_line_bg_color_dynamic">?attr/colorSurfaceVariant</item>
diff --git a/components/browser_ui/widget/android/BUILD.gn b/components/browser_ui/widget/android/BUILD.gn index f708865e..4169af2 100644 --- a/components/browser_ui/widget/android/BUILD.gn +++ b/components/browser_ui/widget/android/BUILD.gn
@@ -345,6 +345,7 @@ testonly = true sources = [ "java/src/org/chromium/components/browser_ui/widget/CompositeTouchDelegateUnitTest.java", + "java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java", "java/src/org/chromium/components/browser_ui/widget/InsetObserverViewTest.java", "java/src/org/chromium/components/browser_ui/widget/RoundedCornerOutlineProviderUnitTest.java", "java/src/org/chromium/components/browser_ui/widget/gesture/SwipeGestureListenerTest.java",
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java index f061376b..8a87564 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java
@@ -8,12 +8,14 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.provider.Settings; import android.view.MotionEvent; import android.view.View; import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup.LayoutParams; import android.view.Window; +import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.ScaleAnimation; @@ -21,8 +23,11 @@ import androidx.annotation.Nullable; +import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.ContextUtils; import org.chromium.components.browser_ui.widget.animation.Interpolators; +import org.chromium.ui.UiUtils; +import org.chromium.ui.util.ColorUtils; import org.chromium.ui.widget.AnchoredPopupWindow; import org.chromium.ui.widget.RectProvider; @@ -42,6 +47,7 @@ private final float mTouchPointYPx; private final float mTopContentOffsetPx; private final boolean mIsPopup; + private final boolean mShouldRemoveScrim; private float mContextMenuSourceXPx; private float mContextMenuSourceYPx; @@ -70,13 +76,15 @@ * @param layout The context menu layout that will house the menu. * @param contentView The context menu view to display on the dialog. * @param isPopup Whether the context menu is being shown in a {@link AnchoredPopupWindow}. + * @param shouldRemoveScrim Whether the context menu should removes the scrim behind the dialog + * visually. * @param popupMargin The margin for the context menu. * @param desiredPopupContentWidth The desired width for the content of the context menu. */ public ContextMenuDialog(Activity ownerActivity, int theme, float touchPointXPx, float touchPointYPx, float topContentOffsetPx, int topMarginPx, int bottomMarginPx, - View layout, View contentView, boolean isPopup, @Nullable Integer popupMargin, - @Nullable Integer desiredPopupContentWidth) { + View layout, View contentView, boolean isPopup, boolean shouldRemoveScrim, + @Nullable Integer popupMargin, @Nullable Integer desiredPopupContentWidth) { super(ownerActivity, theme); mActivity = ownerActivity; mTouchPointXPx = touchPointXPx; @@ -87,6 +95,7 @@ mContentView = contentView; mLayout = layout; mIsPopup = isPopup; + mShouldRemoveScrim = shouldRemoveScrim; mPopupMargin = popupMargin; mDesiredPopupContentWidth = desiredPopupContentWidth; } @@ -97,6 +106,25 @@ Window dialogWindow = getWindow(); dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); dialogWindow.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + if (mShouldRemoveScrim) { + dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); + dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + + // Set the navigation bar when API level >= 27 to match android:navigationBarColor + // reference in styles.xml. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + dialogWindow.setNavigationBarColor(mActivity.getWindow().getNavigationBarColor()); + UiUtils.setNavigationBarIconColor(dialogWindow.getDecorView(), + mActivity.getResources().getBoolean(R.bool.window_light_navigation_bar)); + } + // Apply the status bar color in case the website had override them. + ApiCompatibilityUtils.setStatusBarColor( + dialogWindow, mActivity.getWindow().getStatusBarColor()); + ApiCompatibilityUtils.setStatusBarIconColor(dialogWindow.getDecorView().getRootView(), + !ColorUtils.shouldUseLightForegroundOnBackground( + mActivity.getWindow().getStatusBarColor())); + } // Both bottom margin and top margin must be set together to ensure default // values are not relied upon for custom behavior.
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java new file mode 100644 index 0000000..3055a0d0 --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java
@@ -0,0 +1,81 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.browser_ui.widget; + +import android.app.ActionBar.LayoutParams; +import android.app.Activity; +import android.view.View; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.TextView; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.Shadows; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowPhoneWindow; + +import org.chromium.base.test.BaseRobolectricTestRunner; + +/** Unit test for {@link ContextMenuDialog}. */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE, shadows = {ShadowPhoneWindow.class}) +public class ContextMenuDialogUnitTest { + ContextMenuDialog mDialog; + + Activity mActivity; + View mMenuContentView; + View mRootView; + + @Before + public void setup() { + mActivity = Robolectric.buildActivity(Activity.class).setup().get(); + mRootView = new FrameLayout(mActivity); + TextView textView = new TextView(mActivity); + textView.setText("Test String"); + mMenuContentView = textView; + mActivity.setContentView( + mRootView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + } + + @Test + public void testCreate_usePopupStyle() { + mDialog = new ContextMenuDialog(mActivity, 0, 0, 0, 0, 0, 0, mRootView, mMenuContentView, + /*isPopup=*/false, /*shouldRemoveScrim=*/true, 0, 0); + mDialog.show(); + + ShadowPhoneWindow window = (ShadowPhoneWindow) Shadows.shadowOf(mDialog.getWindow()); + Assert.assertTrue("FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS not in window flags.", + window.getFlag(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)); + Assert.assertTrue("FLAG_NOT_TOUCH_MODAL not in window flags.", + window.getFlag(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)); + Assert.assertFalse("FLAG_DIM_BEHIND is in flags.", + window.getFlag(WindowManager.LayoutParams.FLAG_DIM_BEHIND)); + + Assert.assertEquals("Dialog status bar color should match activity status bar color.", + mActivity.getWindow().getStatusBarColor(), mDialog.getWindow().getStatusBarColor()); + Assert.assertEquals( + "Dialog navigation bar color should match activity navigation bar color.", + mActivity.getWindow().getNavigationBarColor(), + mDialog.getWindow().getNavigationBarColor()); + } + + @Test + public void testCreateDialog_useRegularStyle() { + mDialog = new ContextMenuDialog(mActivity, 0, 0, 0, 0, 0, 0, mRootView, mMenuContentView, + /*isPopup=*/false, /*shouldRemoveScrim=*/false, 0, 0); + mDialog.show(); + + // Only checks the flag is unset to make sure the setup for |shouldRemoveScrim| is not ran. + ShadowPhoneWindow window = (ShadowPhoneWindow) Shadows.shadowOf(mDialog.getWindow()); + Assert.assertFalse("FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS is in window flags.", + window.getFlag(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)); + Assert.assertFalse("FLAG_NOT_TOUCH_MODAL is in window flags.", + window.getFlag(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)); + } +}
diff --git a/components/download/database/download_db_conversions.cc b/components/download/database/download_db_conversions.cc index 2f7b317..2f81a75 100644 --- a/components/download/database/download_db_conversions.cc +++ b/components/download/database/download_db_conversions.cc
@@ -226,6 +226,8 @@ } proto.set_credentials_mode( static_cast<int32_t>(in_progress_info.credentials_mode)); + proto.set_range_request_from(in_progress_info.range_request_from); + proto.set_range_request_to(in_progress_info.range_request_to); return proto; } @@ -289,6 +291,10 @@ info.credentials_mode = static_cast<::network::mojom::CredentialsMode>( proto.credentials_mode()); } + if (proto.has_range_request_from()) + info.range_request_from = proto.range_request_from(); + if (proto.has_range_request_to()) + info.range_request_to = proto.range_request_to(); return info; }
diff --git a/components/download/database/download_db_conversions_unittest.cc b/components/download/database/download_db_conversions_unittest.cc index 805c6d1..8bc2e74 100644 --- a/components/download/database/download_db_conversions_unittest.cc +++ b/components/download/database/download_db_conversions_unittest.cc
@@ -167,6 +167,10 @@ // InProgressInfo with valid fields. info = CreateInProgressInfo(); EXPECT_EQ(info, InProgressInfoFromProto(InProgressInfoToProto(info))); + + info.range_request_from = 5; + info.range_request_from = 10; + EXPECT_EQ(info, InProgressInfoFromProto(InProgressInfoToProto(info))); } TEST_F(DownloadDBConversionsTest, RerouteInfo) {
diff --git a/components/download/database/in_progress/in_progress_info.cc b/components/download/database/in_progress/in_progress_info.cc index 608c691..2114b3c 100644 --- a/components/download/database/in_progress/in_progress_info.cc +++ b/components/download/database/in_progress/in_progress_info.cc
@@ -33,7 +33,9 @@ auto_resume_count == other.auto_resume_count && download_schedule == other.download_schedule && RerouteInfosEqual(reroute_info, other.reroute_info) && - credentials_mode == other.credentials_mode; + credentials_mode == other.credentials_mode && + range_request_from == other.range_request_from && + range_request_to == other.range_request_to; } } // namespace download
diff --git a/components/download/database/in_progress/in_progress_info.h b/components/download/database/in_progress/in_progress_info.h index ae83d07..36c5524 100644 --- a/components/download/database/in_progress/in_progress_info.h +++ b/components/download/database/in_progress/in_progress_info.h
@@ -135,6 +135,9 @@ // The credentials mode of the request. ::network::mojom::CredentialsMode credentials_mode = ::network::mojom::CredentialsMode::kInclude; + + int64_t range_request_from = kInvalidRange; + int64_t range_request_to = kInvalidRange; }; } // namespace download
diff --git a/components/download/database/proto/download_entry.proto b/components/download/database/proto/download_entry.proto index 819e8ae1..3897f04 100644 --- a/components/download/database/proto/download_entry.proto +++ b/components/download/database/proto/download_entry.proto
@@ -84,6 +84,8 @@ optional DownloadSchedule download_schedule = 28; optional enterprise_connectors.DownloadItemRerouteInfo reroute_info = 29; optional int32 credentials_mode = 30; // network::mojom::CredentialsMode + optional int64 range_request_from = 31; + optional int64 range_request_to = 32; } // Stores various metadata related to a download.
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc index 7520708..9761fe9 100644 --- a/components/download/internal/common/download_item_impl.cc +++ b/components/download/internal/common/download_item_impl.cc
@@ -331,6 +331,8 @@ const std::vector<DownloadItem::ReceivedSlice>& received_slices, const DownloadItemRerouteInfo& reroute_info, absl::optional<DownloadSchedule> download_schedule, + int64_t range_request_from, + int64_t range_request_to, std::unique_ptr<DownloadEntry> download_entry) : request_info_(url_chain, referrer_url, @@ -346,8 +348,8 @@ start_time, ::network::mojom::CredentialsMode::kInclude, absl::nullopt, - kInvalidRange, - kInvalidRange), + range_request_from, + range_request_to), guid_(guid), download_id_(download_id), mime_type_(mime_type), @@ -2939,4 +2941,9 @@ return size; } +std::pair<int64_t, int64_t> DownloadItemImpl::GetRangeRequestOffset() const { + return std::make_pair(request_info_.range_request_from, + request_info_.range_request_to); +} + } // namespace download
diff --git a/components/download/internal/common/download_item_impl_unittest.cc b/components/download/internal/common/download_item_impl_unittest.cc index d6e355d..d0c1ab4 100644 --- a/components/download/internal/common/download_item_impl_unittest.cc +++ b/components/download/internal/common/download_item_impl_unittest.cc
@@ -299,7 +299,8 @@ download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, reason, false, false, false, base::Time::Now(), true, std::vector<download::DownloadItem::ReceivedSlice>(), reroute_info, - absl::nullopt /*download_schedule*/, nullptr /* download_entry */); + absl::nullopt /*download_schedule*/, kInvalidRange, kInvalidRange, + nullptr /* download_entry */); return item; }
diff --git a/components/download/internal/common/download_utils.cc b/components/download/internal/common/download_utils.cc index 9a2312a..b2d7bc26 100644 --- a/components/download/internal/common/download_utils.cc +++ b/components/download/internal/common/download_utils.cc
@@ -509,6 +509,9 @@ in_progress_info.auto_resume_count = item.GetAutoResumeCount(); in_progress_info.download_schedule = item.GetDownloadSchedule(); in_progress_info.credentials_mode = item.GetCredentialsMode(); + auto range_request_offset = item.GetRangeRequestOffset(); + in_progress_info.range_request_from = range_request_offset.first; + in_progress_info.range_request_to = range_request_offset.second; download_info.in_progress_info = in_progress_info;
diff --git a/components/download/internal/common/in_progress_download_manager.cc b/components/download/internal/common/in_progress_download_manager.cc index a9a101c..7127c63 100644 --- a/components/download/internal/common/in_progress_download_manager.cc +++ b/components/download/internal/common/in_progress_download_manager.cc
@@ -56,8 +56,6 @@ if (!in_progress_info) return nullptr; - // TODO(xingliu): Persists |range_request_from| and |range_request_to| into - // databases. return std::make_unique<DownloadItemImpl>( delegate, entry.download_info->guid, entry.download_info->id, in_progress_info->current_path, in_progress_info->target_path, @@ -74,6 +72,7 @@ in_progress_info->metered, false, base::Time(), in_progress_info->transient, in_progress_info->received_slices, in_progress_info->reroute_info, in_progress_info->download_schedule, + in_progress_info->range_request_from, in_progress_info->range_request_to, std::move(download_entry)); }
diff --git a/components/download/public/common/download_item_impl.h b/components/download/public/common/download_item_impl.h index 0bb2938..8b9118a 100644 --- a/components/download/public/common/download_item_impl.h +++ b/components/download/public/common/download_item_impl.h
@@ -216,6 +216,8 @@ const std::vector<DownloadItem::ReceivedSlice>& received_slices, const DownloadItemRerouteInfo& reroute_info, absl::optional<DownloadSchedule> download_schedule, + int64_t range_request_from, + int64_t range_request_to, std::unique_ptr<DownloadEntry> download_entry); // Constructing for a regular download. @@ -412,6 +414,8 @@ // Gets the approximate memory usage of this item. size_t GetApproximateMemoryUsage() const; + std::pair<int64_t, int64_t> GetRangeRequestOffset() const; + private: // Fine grained states of a download. //
diff --git a/components/download/public/common/mock_download_item_impl.cc b/components/download/public/common/mock_download_item_impl.cc index ef565da7..08aaf11 100644 --- a/components/download/public/common/mock_download_item_impl.cc +++ b/components/download/public/common/mock_download_item_impl.cc
@@ -39,6 +39,8 @@ DownloadItem::ReceivedSlices(), DownloadItemRerouteInfo(), absl::nullopt /*download_schedule*/, + kInvalidRange, + kInvalidRange, nullptr /* download_entry */) {} MockDownloadItemImpl::~MockDownloadItemImpl() = default;
diff --git a/components/enterprise/common/proto/extensions_workflow_events.proto b/components/enterprise/common/proto/extensions_workflow_events.proto index 0e8d545e..a18519d 100644 --- a/components/enterprise/common/proto/extensions_workflow_events.proto +++ b/components/enterprise/common/proto/extensions_workflow_events.proto
@@ -12,7 +12,7 @@ // user requests an extension or cancels one. // This proto must be synced with the server side proto with same name. // -// Next ID: 5. +// Next ID: 7. message ExtensionsWorkflowEvent { // ID of the installed app/extension for a Chrome app or extension. optional string id = 1; @@ -36,4 +36,7 @@ // User justification describing why the extension is being requested. optional string justification = 5; + + // Device name (aka machine name) of a browser device, used for the audit log. + optional string device_name = 6; }
diff --git a/components/invalidation/impl/per_user_topic_subscription_request.cc b/components/invalidation/impl/per_user_topic_subscription_request.cc index 5d2692dd..42f28c2 100644 --- a/components/invalidation/impl/per_user_topic_subscription_request.cc +++ b/components/invalidation/impl/per_user_topic_subscription_request.cc
@@ -342,12 +342,11 @@ } std::string PerUserTopicSubscriptionRequest::Builder::BuildBody() const { - base::DictionaryValue request; + base::Value request(base::Value::Type::DICTIONARY); - request.SetString("public_topic_name", topic_); - if (topic_is_public_) { - request.SetBoolean("is_public", true); - } + request.SetStringKey("public_topic_name", topic_); + if (topic_is_public_) + request.SetBoolKey("is_public", true); std::string request_json; bool success = base::JSONWriter::Write(request, &request_json);
diff --git a/components/messages/android/message_enums.h b/components/messages/android/message_enums.h index 377e7e747..3f3f724 100644 --- a/components/messages/android/message_enums.h +++ b/components/messages/android/message_enums.h
@@ -97,6 +97,7 @@ TEST_MESSAGE = 22, TAILORED_SECURITY_ENABLED = 23, VR_SERVICES_UPGRADE = 24, + TAILORED_SECURITY_DISABLED = 25, // Insert new values before this line. COUNT
diff --git a/components/nacl/browser/nacl_browser_delegate.h b/components/nacl/browser/nacl_browser_delegate.h index d8abebb..b3c5a8e8 100644 --- a/components/nacl/browser/nacl_browser_delegate.h +++ b/components/nacl/browser/nacl_browser_delegate.h
@@ -75,11 +75,6 @@ // Returns whether NaCl application with this manifest URL should be debugged. virtual bool URLMatchesDebugPatterns(const GURL& manifest_url) = 0; - - // Returns whether Non-SFI mode is allowed for a given manifest URL. Must be - // called on the UI thread. - virtual bool IsNonSfiModeAllowed(const base::FilePath& profile_directory, - const GURL& manifest_url) = 0; }; #endif // COMPONENTS_NACL_BROWSER_NACL_BROWSER_DELEGATE_H_
diff --git a/components/nacl/browser/nacl_host_message_filter.cc b/components/nacl/browser/nacl_host_message_filter.cc index c9da1efd..177b5fc 100644 --- a/components/nacl/browser/nacl_host_message_filter.cc +++ b/components/nacl/browser/nacl_host_message_filter.cc
@@ -142,12 +142,8 @@ IPC::Message* reply_msg) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + // TODO(crbug.com/1273132): Remove. bool nonsfi_mode_allowed = false; -#if BUILDFLAG(IS_CHROMEOS_ASH) && \ - (defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)) - nonsfi_mode_allowed = NaClBrowser::GetDelegate()->IsNonSfiModeAllowed( - profile_directory_, GURL(launch_params.manifest_url)); -#endif auto map_url_callback = nacl::NaClBrowser::GetDelegate()->GetMapUrlToLocalFilePathCallback(
diff --git a/components/nacl/browser/test_nacl_browser_delegate.cc b/components/nacl/browser/test_nacl_browser_delegate.cc index 7c07998..84c678a 100644 --- a/components/nacl/browser/test_nacl_browser_delegate.cc +++ b/components/nacl/browser/test_nacl_browser_delegate.cc
@@ -55,9 +55,3 @@ const GURL& manifest_url) { return false; } - -bool TestNaClBrowserDelegate::IsNonSfiModeAllowed( - const base::FilePath& profile_directory, - const GURL& manifest_url) { - return false; -}
diff --git a/components/nacl/browser/test_nacl_browser_delegate.h b/components/nacl/browser/test_nacl_browser_delegate.h index d0fb6a27..eb74b6f 100644 --- a/components/nacl/browser/test_nacl_browser_delegate.h +++ b/components/nacl/browser/test_nacl_browser_delegate.h
@@ -39,8 +39,6 @@ const base::FilePath& profile_directory) override; void SetDebugPatterns(const std::string& debug_patterns) override; bool URLMatchesDebugPatterns(const GURL& manifest_url) override; - bool IsNonSfiModeAllowed(const base::FilePath& profile_directory, - const GURL& manifest_url) override; }; #endif // COMPONENTS_NACL_BROWSER_TEST_NACL_BROWSER_DELEGATE_H_
diff --git a/components/offline_pages/core/background/test_util.cc b/components/offline_pages/core/background/test_util.cc index 0a7e263..9a781bb7 100644 --- a/components/offline_pages/core/background/test_util.cc +++ b/components/offline_pages/core/background/test_util.cc
@@ -21,24 +21,24 @@ } // namespace std::string SavePageRequest::ToString() const { - base::DictionaryValue result; - result.SetInteger("request_id", request_id_); - result.SetString("url", url_.spec()); - result.SetString("client_id", client_id_.ToString()); - result.SetInteger("creation_time", - creation_time_.ToDeltaSinceWindowsEpoch().InSeconds()); - result.SetInteger("started_attempt_count", started_attempt_count_); - result.SetInteger("completed_attempt_count", completed_attempt_count_); - result.SetInteger("last_attempt_time", - last_attempt_time_.ToDeltaSinceWindowsEpoch().InSeconds()); - result.SetBoolean("user_requested", user_requested_); - result.SetInteger("state", static_cast<int>(state_)); - result.SetInteger("fail_state", static_cast<int>(fail_state_)); - result.SetInteger("pending_state", static_cast<int>(pending_state_)); - result.SetString("original_url", original_url_.spec()); - result.SetString("request_origin", request_origin_); - result.SetString("auto_fetch_notification_state", - EnumString(auto_fetch_notification_state_)); + base::Value result(base::Value::Type::DICTIONARY); + result.SetIntKey("request_id", request_id_); + result.SetStringKey("url", url_.spec()); + result.SetStringKey("client_id", client_id_.ToString()); + result.SetIntKey("creation_time", + creation_time_.ToDeltaSinceWindowsEpoch().InSeconds()); + result.SetIntKey("started_attempt_count", started_attempt_count_); + result.SetIntKey("completed_attempt_count", completed_attempt_count_); + result.SetIntKey("last_attempt_time", + last_attempt_time_.ToDeltaSinceWindowsEpoch().InSeconds()); + result.SetBoolKey("user_requested", user_requested_); + result.SetIntKey("state", static_cast<int>(state_)); + result.SetIntKey("fail_state", static_cast<int>(fail_state_)); + result.SetIntKey("pending_state", static_cast<int>(pending_state_)); + result.SetStringKey("original_url", original_url_.spec()); + result.SetStringKey("request_origin", request_origin_); + result.SetStringKey("auto_fetch_notification_state", + EnumString(auto_fetch_notification_state_)); std::string result_string; base::JSONWriter::Write(result, &result_string);
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index 38bf159..b576c40 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -261,6 +261,10 @@ const base::Feature kNtpRealboxSuggestionAnswers{ "NtpRealboxSuggestionAnswers", base::FEATURE_DISABLED_BY_DEFAULT}; +// Feature used to enable Tail Suggest Formatting in the NTP Realbox. +const base::Feature kNtpRealboxTailSuggest{"NtpRealboxTailSuggest", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Feature used to enable the first batch of Pedals on Android. The Pedals, // which will be enabled on Android, should be already enabled on desktop. const base::Feature kOmniboxPedalsAndroidBatch1{
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index c7669a4e..1a79392 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -72,6 +72,7 @@ extern const base::Feature kRichAutocompletion; extern const base::Feature kNtpRealboxPedals; extern const base::Feature kNtpRealboxSuggestionAnswers; +extern const base::Feature kNtpRealboxTailSuggest; extern const base::Feature kOmniboxPedalsAndroidBatch1; extern const base::Feature kOmniboxPedalsBatch2NonEnglish; extern const base::Feature kOmniboxPedalsBatch3;
diff --git a/components/optimization_guide/proto/BUILD.gn b/components/optimization_guide/proto/BUILD.gn index 61af3e2..05d0cc0f 100644 --- a/components/optimization_guide/proto/BUILD.gn +++ b/components/optimization_guide/proto/BUILD.gn
@@ -14,7 +14,6 @@ "common_types.proto", "hint_cache.proto", "hints.proto", - "lite_video_metadata.proto", "loading_predictor_metadata.proto", "models.proto", "page_topics_model_metadata.proto", @@ -30,7 +29,6 @@ sources = [ "common_types.proto", "hints.proto", - "lite_video_metadata.proto", "loading_predictor_metadata.proto", "models.proto", "performance_hints_metadata.proto",
diff --git a/components/optimization_guide/proto/lite_video_metadata.proto b/components/optimization_guide/proto/lite_video_metadata.proto deleted file mode 100644 index b914496..0000000 --- a/components/optimization_guide/proto/lite_video_metadata.proto +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -syntax = "proto2"; - -option optimize_for = LITE_RUNTIME; -option java_package = "org.chromium.components.optimization_guide.proto"; -option java_outer_classname = "LiteVideoMetadataProto"; - -package optimization_guide.proto; - -import "components/optimization_guide/proto/common_types.proto"; - -message LiteVideoHint { - // The target video resolution for throttling. Initially unused. - optional int64 target_video_resolution = 1; - // The network downlink bandwidth target in kilobits per second used to - // calculate the throttling delay on media requests. - optional int64 target_downlink_bandwidth_kbps = 2; - // The network downlink rtt target latency used to calculate the - // throttling delay on media requests. - optional Duration target_downlink_rtt_latency = 3; - // The number of kilobytes for media to be observed before starting to - // throttle requests. - optional int64 kilobytes_to_buffer_before_throttle = 4; - // The maximum delay a throttle can introduce for a media request in - // milliseconds. - optional Duration max_throttling_delay = 5; -} - -// Optimization metadata associated with LiteVideos. -// -// This is only populated for the LITE_VIDEO optimization type. -message LiteVideoMetadata { - // A LiteVideo hint. - optional LiteVideoHint lite_video_hint = 1; -} \ No newline at end of file
diff --git a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc index 5cadb2bb..303a43c 100644 --- a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc +++ b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
@@ -225,6 +225,7 @@ WebFeature::kWebCodecsVideoFrameFromImage, WebFeature::kWebCodecsVideoFrameFromBuffer, WebFeature::kOpenWebDatabaseInsecureContext, + WebFeature::kPrivateNetworkAccessIgnoredPreflightError, })); return *opt_in_features; }
diff --git a/components/password_manager/core/browser/password_autofill_manager.cc b/components/password_manager/core/browser/password_autofill_manager.cc index 7f7fecb..76bf735 100644 --- a/components/password_manager/core/browser/password_autofill_manager.cc +++ b/components/password_manager/core/browser/password_autofill_manager.cc
@@ -207,6 +207,17 @@ &autofill::Suggestion::frontend_id); if (has_no_fillable_suggestions) return; + + // Add a separator before the manage option unless there are no suggestions + // yet. + // TODO(crbug.com/1274134): Clean up once improvements are launched. + if (base::FeatureList::IsEnabled( + autofill::features::kAutofillVisualImprovementsForSuggestionUi) && + !suggestions->empty()) { + suggestions->push_back(autofill::Suggestion()); + suggestions->back().frontend_id = autofill::POPUP_ITEM_ID_SEPARATOR; + } + autofill::Suggestion suggestion( l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_MANAGE_PASSWORDS)); suggestion.frontend_id = autofill::POPUP_ITEM_ID_ALL_SAVED_PASSWORDS_ENTRY;
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.cc b/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.cc index 9e68b4c..b8feb2a5 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.cc
@@ -196,7 +196,9 @@ base::BindOnce(&ApplyVisualTfLiteModelHelper, bitmap, flatbuffer_model_->tflite_metadata()->input_width(), flatbuffer_model_->tflite_metadata()->input_height(), - GetWeakPtr()), + std::string(reinterpret_cast<const char*>( + visual_tflite_model_.data()), + visual_tflite_model_.length())), std::move(callback)); base::UmaHistogramTimes( "SBClientPhishing.TfLiteModelLoadTime.FlatbufferScorer",
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.cc b/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.cc index 371ee73..3a93e73 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.cc
@@ -161,7 +161,10 @@ {base::TaskPriority::BEST_EFFORT, base::WithBaseSyncPrimitives()}, base::BindOnce(&ApplyVisualTfLiteModelHelper, bitmap, model_.tflite_metadata().input_width(), - model_.tflite_metadata().input_height(), GetWeakPtr()), + model_.tflite_metadata().input_height(), + std::string(reinterpret_cast<const char*>( + visual_tflite_model_.data()), + visual_tflite_model_.length())), std::move(callback)); base::UmaHistogramTimes( "SBClientPhishing.TfLiteModelLoadTime.ProtobufScorer",
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc b/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc index b1134224..f133431 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc
@@ -113,16 +113,10 @@ const SkBitmap& bitmap, int input_width, int input_height, - base::WeakPtr<Scorer> scorer) { - if (!scorer) - return std::vector<double>(); - + const std::string& model_data) { TRACE_EVENT0("safe_browsing", "ApplyVisualTfLiteModel"); - std::string model_data = std::string( - reinterpret_cast<const char*>(scorer->visual_tflite_model().data()), - scorer->visual_tflite_model().length()); std::unique_ptr<tflite::task::vision::ImageClassifier> classifier = - CreateClassifier(std::move(model_data)); + CreateClassifier(model_data); if (!classifier) return std::vector<double>(); @@ -167,8 +161,4 @@ Scorer::Scorer() = default; Scorer::~Scorer() = default; -base::WeakPtr<Scorer> Scorer::GetWeakPtr() const { - return weak_ptr_factory_.GetWeakPtr(); -} - } // namespace safe_browsing
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/scorer.h b/components/safe_browsing/content/renderer/phishing_classifier/scorer.h index abeb7b210..9713478 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/scorer.h +++ b/components/safe_browsing/content/renderer/phishing_classifier/scorer.h
@@ -84,11 +84,6 @@ virtual void ApplyVisualTfLiteModel( const SkBitmap& bitmap, base::OnceCallback<void(std::vector<double>)> callback) const = 0; - - const base::MemoryMappedFile& visual_tflite_model() const { - return visual_tflite_model_; - } - #endif // Returns the version number of the loaded client model. @@ -133,8 +128,6 @@ Scorer(const Scorer&) = delete; Scorer& operator=(const Scorer&) = delete; - base::WeakPtr<Scorer> GetWeakPtr() const; - protected: // Helper function which converts log odds to a probability in the range // [0.0,1.0]. @@ -145,7 +138,7 @@ const SkBitmap& bitmap, int input_width, int input_height, - base::WeakPtr<Scorer> scorer); + const std::string& model_data); base::MemoryMappedFile visual_tflite_model_; base::WeakPtrFactory<Scorer> weak_ptr_factory_{this};
diff --git a/components/search_provider_logos/logo_service_impl_unittest.cc b/components/search_provider_logos/logo_service_impl_unittest.cc index 63a3c7cc..3e079f6b 100644 --- a/components/search_provider_logos/logo_service_impl_unittest.cc +++ b/components/search_provider_logos/logo_service_impl_unittest.cc
@@ -186,7 +186,7 @@ const std::string& dark_mime_type, const std::string& fingerprint, base::TimeDelta time_to_live) { - base::DictionaryValue dict; + base::Value dict(base::Value::Type::DICTIONARY); std::string data_uri = "data:"; data_uri += mime_type; @@ -198,27 +198,27 @@ dark_data_uri += ";base64,"; dark_data_uri += EncodeBitmapAsPNGBase64(dark_image); - dict.SetString("ddljson.target_url", on_click_url); - dict.SetString("ddljson.alt_text", alt_text); + dict.SetStringPath("ddljson.target_url", on_click_url); + dict.SetStringPath("ddljson.alt_text", alt_text); if (animated_url.empty()) { - dict.SetString("ddljson.doodle_type", "SIMPLE"); + dict.SetStringPath("ddljson.doodle_type", "SIMPLE"); if (!image.isNull()) - dict.SetString("ddljson.data_uri", data_uri); + dict.SetStringPath("ddljson.data_uri", data_uri); if (!dark_image.isNull()) - dict.SetString("ddljson.dark_data_uri", dark_data_uri); + dict.SetStringPath("ddljson.dark_data_uri", dark_data_uri); } else { - dict.SetString("ddljson.doodle_type", "ANIMATED"); - dict.SetBoolean("ddljson.large_image.is_animated_gif", true); - dict.SetString("ddljson.large_image.url", animated_url); - dict.SetString("ddljson.dark_large_image.url", dark_animated_url); + dict.SetStringPath("ddljson.doodle_type", "ANIMATED"); + dict.SetBoolPath("ddljson.large_image.is_animated_gif", true); + dict.SetStringPath("ddljson.large_image.url", animated_url); + dict.SetStringPath("ddljson.dark_large_image.url", dark_animated_url); if (!image.isNull()) - dict.SetString("ddljson.cta_data_uri", data_uri); + dict.SetStringPath("ddljson.cta_data_uri", data_uri); if (!dark_image.isNull()) - dict.SetString("ddljson.dark_cta_data_uri", dark_data_uri); + dict.SetStringPath("ddljson.dark_cta_data_uri", dark_data_uri); } - dict.SetString("ddljson.fingerprint", fingerprint); + dict.SetStringPath("ddljson.fingerprint", fingerprint); if (time_to_live != base::TimeDelta()) - dict.SetInteger("ddljson.time_to_live_ms", + dict.SetIntPath("ddljson.time_to_live_ms", static_cast<int>(time_to_live.InMilliseconds())); std::string output;
diff --git a/components/services/app_service/public/cpp/icon_types.cc b/components/services/app_service/public/cpp/icon_types.cc index c857d15..292232e1 100644 --- a/components/services/app_service/public/cpp/icon_types.cc +++ b/components/services/app_service/public/cpp/icon_types.cc
@@ -21,7 +21,7 @@ } constexpr uint64_t IconKey::kDoesNotChangeOverTime = 0; -constexpr int32_t IconKey::kInvalidResourceId = 0; +const int32_t IconKey::kInvalidResourceId = 0; IconValue::IconValue() = default; IconValue::~IconValue() = default;
diff --git a/components/sessions/core/tab_restore_service_helper.cc b/components/sessions/core/tab_restore_service_helper.cc index a136bb6..62ac841 100644 --- a/components/sessions/core/tab_restore_service_helper.cc +++ b/components/sessions/core/tab_restore_service_helper.cc
@@ -111,7 +111,7 @@ return absl::nullopt; } - // Save the Window as well as the Tab if this is the last tab of an appp + // Save the Window as well as the Tab if this is the last tab of an app // browser to ensure the tab will reopen in the correct app window. if (context && context->GetTabCount() == 1 && !context->GetAppName().empty()) {
diff --git a/components/shared_highlighting/core/common/disabled_sites.cc b/components/shared_highlighting/core/common/disabled_sites.cc index dcc278656..80c66bd1 100644 --- a/components/shared_highlighting/core/common/disabled_sites.cc +++ b/components/shared_highlighting/core/common/disabled_sites.cc
@@ -12,42 +12,40 @@ namespace shared_highlighting { bool ShouldOfferLinkToText(const GURL& url) { - if (base::FeatureList::IsEnabled(kSharedHighlightingUseBlocklist)) { - // If a URL's host matches a key in this map, then the path will be tested - // against the RE stored in the value. For example, {"foo.com", ".*"} means - // any page on the foo.com domain. - static constexpr auto kBlocklist = - base::MakeFixedFlatMap<base::StringPiece, base::StringPiece>( - {{"facebook.com", ".*"}, - // TODO(crbug.com/1157981): special case this to cover other Google - // TLDs - {"google.com", "^\\/amp\\/.*"}, - {"instagram.com", ".*"}, - {"mail.google.com", ".*"}, - {"outlook.live.com", ".*"}, - {"reddit.com", ".*"}, - {"twitter.com", ".*"}, - {"web.whatsapp.com", ".*"}, - {"youtube.com", ".*"}}); + // If a URL's host matches a key in this map, then the path will be tested + // against the RE stored in the value. For example, {"foo.com", ".*"} means + // any page on the foo.com domain. + static constexpr auto kBlocklist = + base::MakeFixedFlatMap<base::StringPiece, base::StringPiece>( + {{"facebook.com", ".*"}, + // TODO(crbug.com/1157981): special case this to cover other Google + // TLDs + {"google.com", "^\\/amp\\/.*"}, + {"instagram.com", ".*"}, + {"mail.google.com", ".*"}, + {"outlook.live.com", ".*"}, + {"reddit.com", ".*"}, + {"twitter.com", ".*"}, + {"web.whatsapp.com", ".*"}, + {"youtube.com", ".*"}}); - std::string domain = url.host(); - if (domain.compare(0, 4, "www.") == 0) { - domain = domain.substr(4); - } else if (domain.compare(0, 2, "m.") == 0) { - domain = domain.substr(2); - } else if (domain.compare(0, 7, "mobile.") == 0) { - domain = domain.substr(7); - } + std::string domain = url.host(); + if (domain.compare(0, 4, "www.") == 0) { + domain = domain.substr(4); + } else if (domain.compare(0, 2, "m.") == 0) { + domain = domain.substr(2); + } else if (domain.compare(0, 7, "mobile.") == 0) { + domain = domain.substr(7); + } - if (base::FeatureList::IsEnabled(kSharedHighlightingAmp) && - domain.compare("google.com") == 0) { - return true; - } + if (base::FeatureList::IsEnabled(kSharedHighlightingAmp) && + domain.compare("google.com") == 0) { + return true; + } - auto* it = kBlocklist.find(domain); - if (it != kBlocklist.end()) { - return !re2::RE2::FullMatch(url.path(), it->second.data()); - } + auto* it = kBlocklist.find(domain); + if (it != kBlocklist.end()) { + return !re2::RE2::FullMatch(url.path(), it->second.data()); } return true; }
diff --git a/components/shared_highlighting/core/common/disabled_sites_unittest.cc b/components/shared_highlighting/core/common/disabled_sites_unittest.cc index 8833025..5fbcd27 100644 --- a/components/shared_highlighting/core/common/disabled_sites_unittest.cc +++ b/components/shared_highlighting/core/common/disabled_sites_unittest.cc
@@ -46,19 +46,9 @@ EXPECT_TRUE(ShouldOfferLinkToText(GURL("https://www.example.com"))); } -TEST(DisabledSitesTest, FeatureDisabled) { - base::test::ScopedFeatureList feature; - feature.InitAndDisableFeature(kSharedHighlightingUseBlocklist); - - EXPECT_TRUE(ShouldOfferLinkToText(GURL("https://www.google.com/amp/"))); - EXPECT_TRUE(ShouldOfferLinkToText(GURL("https://www.youtube.com"))); - EXPECT_TRUE(ShouldOfferLinkToText(GURL("https://www.example.com"))); -} - TEST(DisabledSitesTest, AmpFeatureEnabled) { base::test::ScopedFeatureList feature; - feature.InitWithFeatures( - {kSharedHighlightingUseBlocklist, kSharedHighlightingAmp}, {}); + feature.InitWithFeatures({kSharedHighlightingAmp}, {}); EXPECT_TRUE(ShouldOfferLinkToText(GURL("https://www.google.com/amp/"))); EXPECT_TRUE(ShouldOfferLinkToText(GURL("https://www.google.com/amp/foo")));
diff --git a/components/shared_highlighting/core/common/shared_highlighting_features.cc b/components/shared_highlighting/core/common/shared_highlighting_features.cc index 5d7d731f..f2ae62b 100644 --- a/components/shared_highlighting/core/common/shared_highlighting_features.cc +++ b/components/shared_highlighting/core/common/shared_highlighting_features.cc
@@ -13,9 +13,6 @@ constexpr base::FeatureParam<int> kPreemptiveLinkGenTimeoutLengthMs{ &kPreemptiveLinkToTextGeneration, "TimeoutLengthMs", 500}; -const base::Feature kSharedHighlightingUseBlocklist{ - "SharedHighlightingUseBlocklist", base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kSharedHighlightingV2{"SharedHighlightingV2", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/shared_highlighting/core/common/shared_highlighting_features.h b/components/shared_highlighting/core/common/shared_highlighting_features.h index 4beaed25..56b737b 100644 --- a/components/shared_highlighting/core/common/shared_highlighting_features.h +++ b/components/shared_highlighting/core/common/shared_highlighting_features.h
@@ -18,10 +18,6 @@ // Sets the timeout length for pre-emptive link generation. extern const base::FeatureParam<int> kPreemptiveLinkGenTimeoutLengthMs; -// If enabled, a blocklist will disable link generation on certain pages where -// the feature is unlikely to work correctly. -extern const base::Feature kSharedHighlightingUseBlocklist; - // Enables the new UI features for highlighted text. extern const base::Feature kSharedHighlightingV2;
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index e1a3b3bd..fae4aae8 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -90,6 +90,8 @@ "display/overlay_processor_on_gpu.h", "display/overlay_processor_stub.cc", "display/overlay_processor_stub.h", + "display/pending_swap_params.cc", + "display/pending_swap_params.h", "display/program_binding.cc", "display/program_binding.h", "display/renderer_utils.cc",
diff --git a/components/viz/service/display/display_perftest.cc b/components/viz/service/display/display_perftest.cc index ee829a1..5327ee59 100644 --- a/components/viz/service/display/display_perftest.cc +++ b/components/viz/service/display/display_perftest.cc
@@ -66,7 +66,7 @@ FrameSinkId frame_sink_id(3, 3); auto scheduler = std::make_unique<DisplayScheduler>( - &begin_frame_source_, task_runner_.get(), 1, 1); + &begin_frame_source_, task_runner_.get(), PendingSwapParams(1)); std::unique_ptr<FakeOutputSurface> output_surface = FakeOutputSurface::Create3d();
diff --git a/components/viz/service/display/display_scheduler.cc b/components/viz/service/display/display_scheduler.cc index 11fffb3..ea11b040 100644 --- a/components/viz/service/display/display_scheduler.cc +++ b/components/viz/service/display/display_scheduler.cc
@@ -46,8 +46,7 @@ DisplayScheduler::DisplayScheduler(BeginFrameSource* begin_frame_source, base::SingleThreadTaskRunner* task_runner, - int max_pending_swaps, - absl::optional<int> max_pending_swaps_120hz, + PendingSwapParams pending_swap_params, HintSessionFactory* hint_session_factory, bool wait_for_all_surfaces_before_draw) : begin_frame_observer_(std::make_unique<BeginFrameObserver>(this)), @@ -61,8 +60,7 @@ has_pending_surfaces_(false), next_swap_id_(1), pending_swaps_(0), - max_pending_swaps_(max_pending_swaps), - max_pending_swaps_120hz_(max_pending_swaps_120hz), + pending_swap_params_(std::move(pending_swap_params)), wait_for_all_surfaces_before_draw_(wait_for_all_surfaces_before_draw), observing_begin_frame_source_(false), hint_session_factory_(hint_session_factory), @@ -183,7 +181,8 @@ bool DisplayScheduler::DrawAndSwap() { TRACE_EVENT0("viz", "DisplayScheduler::DrawAndSwap"); DCHECK_LT(pending_swaps_, - std::max(max_pending_swaps_, max_pending_swaps_120hz_.value_or(0))); + std::max(pending_swap_params_.max_pending_swaps, + pending_swap_params_.max_pending_swaps_120hz.value_or(0))); DCHECK(!output_surface_lost_); bool success = @@ -253,13 +252,17 @@ } int DisplayScheduler::MaxPendingSwaps() const { - // Interval for 120hz with some delta for margin of error. + // Interval for 90hz and 120hz with some delta for margin of error. + constexpr base::TimeDelta k90HzInterval = base::Microseconds(11500); constexpr base::TimeDelta k120HzInterval = base::Microseconds(8500); - if (current_begin_frame_args_.interval > k120HzInterval || - !max_pending_swaps_120hz_) { - return max_pending_swaps_; + if (current_begin_frame_args_.interval < k120HzInterval && + pending_swap_params_.max_pending_swaps_120hz) { + return pending_swap_params_.max_pending_swaps_120hz.value(); + } else if (current_begin_frame_args_.interval < k90HzInterval && + pending_swap_params_.max_pending_swaps_90hz) { + return pending_swap_params_.max_pending_swaps_90hz.value(); } else { - return max_pending_swaps_120hz_.value(); + return pending_swap_params_.max_pending_swaps; } }
diff --git a/components/viz/service/display/display_scheduler.h b/components/viz/service/display/display_scheduler.h index 759aa2b..24bb0c4 100644 --- a/components/viz/service/display/display_scheduler.h +++ b/components/viz/service/display/display_scheduler.h
@@ -15,6 +15,7 @@ #include "components/viz/common/frame_sinks/begin_frame_source.h" #include "components/viz/common/surfaces/surface_id.h" #include "components/viz/service/display/display_scheduler_base.h" +#include "components/viz/service/display/pending_swap_params.h" #include "components/viz/service/viz_service_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -32,8 +33,7 @@ // `max_pending_swaps`. DisplayScheduler(BeginFrameSource* begin_frame_source, base::SingleThreadTaskRunner* task_runner, - int max_pending_swaps, - absl::optional<int> max_pending_swaps_120hz, + PendingSwapParams pending_swap_params, HintSessionFactory* hint_session_factory = nullptr, bool wait_for_all_surfaces_before_draw = false); @@ -134,8 +134,7 @@ int next_swap_id_; int pending_swaps_; - const int max_pending_swaps_; - absl::optional<int> max_pending_swaps_120hz_; + const PendingSwapParams pending_swap_params_; bool wait_for_all_surfaces_before_draw_; bool observing_begin_frame_source_;
diff --git a/components/viz/service/display/display_scheduler_unittest.cc b/components/viz/service/display/display_scheduler_unittest.cc index d6c2d87a..d0fd5d5 100644 --- a/components/viz/service/display/display_scheduler_unittest.cc +++ b/components/viz/service/display/display_scheduler_unittest.cc
@@ -129,8 +129,7 @@ bool wait_for_all_surfaces_before_draw) : DisplayScheduler(begin_frame_source, task_runner, - max_pending_swaps, - max_pending_swaps, + PendingSwapParams(max_pending_swaps), /*hint_session_factory=*/nullptr, wait_for_all_surfaces_before_draw), scheduler_begin_frame_deadline_count_(0) { @@ -169,7 +168,7 @@ bool has_pending_surfaces() { return has_pending_surfaces_; } bool is_swap_throttled() const { - return pending_swaps_ >= max_pending_swaps_; + return pending_swaps_ >= pending_swap_params_.max_pending_swaps; } protected:
diff --git a/components/viz/service/display/display_unittest.cc b/components/viz/service/display/display_unittest.cc index 9723af42..5926800 100644 --- a/components/viz/service/display/display_unittest.cc +++ b/components/viz/service/display/display_unittest.cc
@@ -87,7 +87,9 @@ public: explicit TestDisplayScheduler(BeginFrameSource* begin_frame_source, base::SingleThreadTaskRunner* task_runner) - : DisplayScheduler(begin_frame_source, task_runner, 1, 1) {} + : DisplayScheduler(begin_frame_source, + task_runner, + PendingSwapParams(1)) {} ~TestDisplayScheduler() override = default;
diff --git a/components/viz/service/display/output_surface.h b/components/viz/service/display/output_surface.h index 37ed775..d6e93c7 100644 --- a/components/viz/service/display/output_surface.h +++ b/components/viz/service/display/output_surface.h
@@ -16,6 +16,7 @@ #include "components/viz/common/gpu/gpu_vsync_callback.h" #include "components/viz/common/resources/resource_format.h" #include "components/viz/common/resources/returned_resource.h" +#include "components/viz/service/display/pending_swap_params.h" #include "components/viz/service/display/software_output_device.h" #include "components/viz/service/viz_service_export.h" #include "gpu/command_buffer/common/mailbox.h" @@ -66,10 +67,7 @@ Capabilities(const Capabilities& capabilities); Capabilities& operator=(const Capabilities& capabilities); - int max_frames_pending = 1; - // If set, should be the max number of pending frames when running at or - // above 120hz. Otherwise, fallback to `max_frames_pending`. - absl::optional<int> max_frames_pending_120hz; + PendingSwapParams pending_swap_params{1}; // The number of buffers for the SkiaOutputDevice. If the // |supports_post_sub_buffer| true, SkiaOutputSurfaceImpl will track target // damaged area based on this number.
diff --git a/components/viz/service/display/pending_swap_params.cc b/components/viz/service/display/pending_swap_params.cc new file mode 100644 index 0000000..fb5f359 --- /dev/null +++ b/components/viz/service/display/pending_swap_params.cc
@@ -0,0 +1,30 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/viz/service/display/pending_swap_params.h" + +#include <algorithm> + +namespace viz { + +PendingSwapParams::PendingSwapParams(int max_pending_swaps) + : max_pending_swaps(max_pending_swaps) {} + +PendingSwapParams::PendingSwapParams(const PendingSwapParams&) = default; +PendingSwapParams& PendingSwapParams::operator=(const PendingSwapParams&) = + default; + +PendingSwapParams::PendingSwapParams(PendingSwapParams&&) = default; +PendingSwapParams& PendingSwapParams::operator=(PendingSwapParams&&) = default; + +int PendingSwapParams::GetMax() { + int ret = max_pending_swaps; + if (max_pending_swaps_90hz) + ret = std::max(ret, max_pending_swaps_90hz.value()); + if (max_pending_swaps_120hz) + ret = std::max(ret, max_pending_swaps_120hz.value()); + return ret; +} + +} // namespace viz
diff --git a/components/viz/service/display/pending_swap_params.h b/components/viz/service/display/pending_swap_params.h new file mode 100644 index 0000000..2a9807d --- /dev/null +++ b/components/viz/service/display/pending_swap_params.h
@@ -0,0 +1,34 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_PENDING_SWAP_PARAMS_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_PENDING_SWAP_PARAMS_H_ + +#include "components/viz/service/viz_service_export.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace viz { + +struct VIZ_SERVICE_EXPORT PendingSwapParams { + explicit PendingSwapParams(int max_pending_swaps); + + PendingSwapParams(const PendingSwapParams&); + PendingSwapParams& operator=(const PendingSwapParams&); + PendingSwapParams(PendingSwapParams&&); + PendingSwapParams& operator=(PendingSwapParams&&); + + int max_pending_swaps; + // If set, should be the max number of pending frames when running at 90hz + // Otherwise, fallback to `max_pending_swaps`. + absl::optional<int> max_pending_swaps_90hz; + // If set, should be the max number of pending frames when running at or + // above 120hz. Otherwise, fallback to `max_pending_swaps`. + absl::optional<int> max_pending_swaps_120hz; + + int GetMax(); +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_PENDING_SWAP_PARAMS_H_
diff --git a/components/viz/service/display_embedder/gl_output_surface.cc b/components/viz/service/display_embedder/gl_output_surface.cc index e18d3092..182bfc70 100644 --- a/components/viz/service/display_embedder/gl_output_surface.cc +++ b/components/viz/service/display_embedder/gl_output_surface.cc
@@ -41,7 +41,7 @@ // Since one of the buffers is used by the surface for presentation, there can // be at most |num_surface_buffers - 1| pending buffers that the compositor // can use. - capabilities_.max_frames_pending = + capabilities_.pending_swap_params.max_pending_swaps = context_capabilities.num_surface_buffers - 1; capabilities_.supports_gpu_vsync = context_capabilities.gpu_vsync; capabilities_.supports_dc_layers = context_capabilities.dc_layers;
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc index 4126d74..c3b3fdd 100644 --- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc +++ b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
@@ -36,14 +36,14 @@ capabilities_.only_invalidates_damage_rect = false; capabilities_.uses_default_gl_framebuffer = false; capabilities_.output_surface_origin = gfx::SurfaceOrigin::kTopLeft; - // Set |max_frames_pending| to 2 for buffer_queue, which aligns scheduling + // Set |max_pending_swaps| to 2 for buffer_queue, which aligns scheduling // more closely with the previous surfaced behavior. // With a surface, swap buffer ack used to return early, before actually // presenting the back buffer, enabling the browser compositor to run ahead. // BufferQueue implementation acks at the time of actual buffer swap, which // shifts the start of the new frame forward relative to the old // implementation. - capabilities_.max_frames_pending = 2; + capabilities_.pending_swap_params.max_pending_swaps = 2; // GetCurrentFramebufferDamage will return an upper bound of the part of the // buffer that needs to be recomposited. #if defined(OS_APPLE) @@ -57,7 +57,7 @@ // allocates at most one additional buffer. base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kDoubleBufferCompositing)) { - capabilities_.max_frames_pending = 1; + capabilities_.pending_swap_params.max_pending_swaps = 1; buffer_queue_->SetMaxBuffers(2); }
diff --git a/components/viz/service/display_embedder/skia_output_device.cc b/components/viz/service/display_embedder/skia_output_device.cc index 391d2b7..7c51f11 100644 --- a/components/viz/service/display_embedder/skia_output_device.cc +++ b/components/viz/service/display_embedder/skia_output_device.cc
@@ -186,8 +186,7 @@ void SkiaOutputDevice::StartSwapBuffers(BufferPresentedCallback feedback) { DCHECK_LT(static_cast<int>(pending_swaps_.size()), - std::max(capabilities_.max_frames_pending, - capabilities_.max_frames_pending_120hz.value_or(0))); + capabilities_.pending_swap_params.GetMax()); pending_swaps_.emplace(++swap_id_, std::move(feedback), viz_scheduled_draw_, gpu_started_draw_, gpu_task_ready_);
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc index e9ba1061..b264c674 100644 --- a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc +++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
@@ -158,17 +158,24 @@ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kDoubleBufferCompositing)) capabilities_.number_of_buffers = 2; - capabilities_.max_frames_pending = capabilities_.number_of_buffers - 1; + capabilities_.pending_swap_params.max_pending_swaps = + capabilities_.number_of_buffers - 1; #if defined(OS_ANDROID) if (::features::IncreaseBufferCountForHighFrameRate() && capabilities_.number_of_buffers == 5) { - capabilities_.max_frames_pending = 2; - capabilities_.max_frames_pending_120hz = 4; + capabilities_.pending_swap_params.max_pending_swaps = 2; + capabilities_.pending_swap_params.max_pending_swaps_90hz = 3; + capabilities_.pending_swap_params.max_pending_swaps_120hz = 4; } #endif - DCHECK_LT(capabilities_.max_frames_pending, capabilities_.number_of_buffers); - DCHECK_LT(capabilities_.max_frames_pending_120hz.value_or(0), + DCHECK_LT(capabilities_.pending_swap_params.max_pending_swaps, capabilities_.number_of_buffers); + DCHECK_LT( + capabilities_.pending_swap_params.max_pending_swaps_90hz.value_or(0), + capabilities_.number_of_buffers); + DCHECK_LT( + capabilities_.pending_swap_params.max_pending_swaps_120hz.value_or(0), + capabilities_.number_of_buffers); presenter_->InitializeCapabilities(&capabilities_);
diff --git a/components/viz/service/display_embedder/skia_output_device_gl.cc b/components/viz/service/display_embedder/skia_output_device_gl.cc index fb24a7b..7e0bf33 100644 --- a/components/viz/service/display_embedder/skia_output_device_gl.cc +++ b/components/viz/service/display_embedder/skia_output_device_gl.cc
@@ -134,7 +134,8 @@ if (feature_info->workarounds().supports_two_yuv_hardware_overlays) { capabilities_.supports_two_yuv_hardware_overlays = true; } - capabilities_.max_frames_pending = gl_surface_->GetBufferCount() - 1; + capabilities_.pending_swap_params.max_pending_swaps = + gl_surface_->GetBufferCount() - 1; capabilities_.supports_commit_overlay_planes = gl_surface_->SupportsCommitOverlayPlanes(); capabilities_.supports_gpu_vsync = gl_surface_->SupportsGpuVSync();
diff --git a/components/viz/service/display_embedder/skia_output_device_vulkan.cc b/components/viz/service/display_embedder/skia_output_device_vulkan.cc index 757a2d1..75415347 100644 --- a/components/viz/service/display_embedder/skia_output_device_vulkan.cc +++ b/components/viz/service/display_embedder/skia_output_device_vulkan.cc
@@ -289,7 +289,7 @@ vulkan_surface_ = std::move(vulkan_surface); capabilities_.uses_default_gl_framebuffer = false; - capabilities_.max_frames_pending = 1; + capabilities_.pending_swap_params.max_pending_swaps = 1; // Vulkan FIFO swap chain should return vk images in presenting order, so set // preserve_buffer_content & supports_post_sub_buffer to true to let // SkiaOutputBufferImpl to manager damages.
diff --git a/components/viz/service/display_embedder/skia_output_device_vulkan_secondary_cb.cc b/components/viz/service/display_embedder/skia_output_device_vulkan_secondary_cb.cc index d1f3572..ad73c13 100644 --- a/components/viz/service/display_embedder/skia_output_device_vulkan_secondary_cb.cc +++ b/components/viz/service/display_embedder/skia_output_device_vulkan_secondary_cb.cc
@@ -25,7 +25,7 @@ std::move(did_swap_buffer_complete_callback)), context_provider_(context_provider) { capabilities_.uses_default_gl_framebuffer = false; - capabilities_.max_frames_pending = 1; + capabilities_.pending_swap_params.max_pending_swaps = 1; capabilities_.preserve_buffer_content = false; capabilities_.output_surface_origin = gfx::SurfaceOrigin::kTopLeft; capabilities_.supports_post_sub_buffer = false;
diff --git a/components/viz/service/display_embedder/skia_output_device_vulkan_secondary_cb_offscreen.cc b/components/viz/service/display_embedder/skia_output_device_vulkan_secondary_cb_offscreen.cc index 910d785..aaca9ec 100644 --- a/components/viz/service/display_embedder/skia_output_device_vulkan_secondary_cb_offscreen.cc +++ b/components/viz/service/display_embedder/skia_output_device_vulkan_secondary_cb_offscreen.cc
@@ -35,7 +35,7 @@ memory_tracker, std::move(did_swap_buffer_complete_callback)) { DCHECK(context_state_->vk_context_provider()); - capabilities_.max_frames_pending = 1; + capabilities_.pending_swap_params.max_pending_swaps = 1; capabilities_.preserve_buffer_content = false; capabilities_.supports_post_sub_buffer = false; }
diff --git a/components/viz/service/display_embedder/skia_output_device_webview.cc b/components/viz/service/display_embedder/skia_output_device_webview.cc index b1c801c..3b1457d 100644 --- a/components/viz/service/display_embedder/skia_output_device_webview.cc +++ b/components/viz/service/display_embedder/skia_output_device_webview.cc
@@ -36,7 +36,8 @@ // SkSurface wrappers non GL fbo0. capabilities_.uses_default_gl_framebuffer = true; capabilities_.output_surface_origin = gl_surface_->GetOrigin(); - capabilities_.max_frames_pending = gl_surface_->GetBufferCount() - 1; + capabilities_.pending_swap_params.max_pending_swaps = + gl_surface_->GetBufferCount() - 1; DCHECK(context_state_->gr_context()); DCHECK(context_state_->context());
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc index ccb8460db..4ad1a24 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -880,7 +880,7 @@ // If there is only one pending frame, then we can use damage area hint from // SkiaOutputDevice, otherwise we have to track damage area with // FrameBufferDamageTracker. - if (capabilities_.max_frames_pending == 1 && + if (capabilities_.pending_swap_params.max_pending_swaps == 1 && capabilities_.damage_area_from_skia_output_device) { use_damage_area_from_skia_output_device_ = true; damage_of_current_buffer_ = gfx::Rect();
diff --git a/components/viz/service/display_embedder/software_output_surface.cc b/components/viz/service/display_embedder/software_output_surface.cc index 4ba0696..bc5a2ae1 100644 --- a/components/viz/service/display_embedder/software_output_surface.cc +++ b/components/viz/service/display_embedder/software_output_surface.cc
@@ -26,7 +26,8 @@ SoftwareOutputSurface::SoftwareOutputSurface( std::unique_ptr<SoftwareOutputDevice> software_device) : OutputSurface(std::move(software_device)) { - capabilities_.max_frames_pending = software_device_->MaxFramesPending(); + capabilities_.pending_swap_params.max_pending_swaps = + software_device_->MaxFramesPending(); capabilities_.resize_based_on_root_surface = software_device_->SupportsOverridePlatformSize(); }
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc index 589fc33..94a087b 100644 --- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc +++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -130,13 +130,10 @@ auto task_runner = base::ThreadTaskRunnerHandle::Get(); const auto& capabilities = output_surface->capabilities(); - int max_frames_pending = capabilities.max_frames_pending; - DCHECK_GT(max_frames_pending, 0); - + DCHECK_GT(capabilities.pending_swap_params.max_pending_swaps, 0); auto scheduler = std::make_unique<DisplayScheduler>( - begin_frame_source, task_runner.get(), max_frames_pending, - capabilities.max_frames_pending_120hz, hint_session_factory, - run_all_compositor_stages_before_draw); + begin_frame_source, task_runner.get(), capabilities.pending_swap_params, + hint_session_factory, run_all_compositor_stages_before_draw); #if !defined(OS_APPLE) auto* output_surface_ptr = output_surface.get();
diff --git a/components/viz/test/fake_output_surface.h b/components/viz/test/fake_output_surface.h index 0b35b2ba..2ace476 100644 --- a/components/viz/test/fake_output_surface.h +++ b/components/viz/test/fake_output_surface.h
@@ -53,7 +53,7 @@ } void set_max_frames_pending(int max) { - capabilities_.max_frames_pending = max; + capabilities_.pending_swap_params.max_pending_swaps = max; } void set_supports_dc_layers(bool supports) {
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index fa31673..3c00e21 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -412,8 +412,8 @@ "attribution_reporting/attribution_utils.h", "attribution_reporting/rate_limit_table.cc", "attribution_reporting/rate_limit_table.h", - "attribution_reporting/sent_report_info.cc", - "attribution_reporting/sent_report_info.h", + "attribution_reporting/sent_report.cc", + "attribution_reporting/sent_report.h", "attribution_reporting/sql_utils.cc", "attribution_reporting/sql_utils.h", "attribution_reporting/storable_source.cc",
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc index 5b1ad6d..5e230555 100644 --- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc +++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -15,6 +15,7 @@ #include "base/timer/elapsed_timer.h" #include "build/build_config.h" #include "build/chromecast_buildflags.h" +#include "build/chromeos_buildflags.h" #include "content/browser/accessibility/browser_accessibility.h" #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/renderer_host/render_view_host_impl.h"
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc index 9a1bbd0..414eed2 100644 --- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc +++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -316,26 +316,23 @@ OverrideWebUIAttributionManager(); - manager_.NotifyReportSent( - SentReportInfo(ReportBuilder(SourceBuilder(now).Build()) - .SetReportTime(now + base::Hours(3)) - .Build(), - SentReportInfo::Status::kSent, - /*http_response_code=*/200)); - manager_.NotifyReportSent( - SentReportInfo(ReportBuilder(SourceBuilder(now).Build()) - .SetReportTime(now + base::Hours(4)) - .SetPriority(-1) - .Build(), - SentReportInfo::Status::kDropped, - /*http_response_code=*/0)); - manager_.NotifyReportSent( - SentReportInfo(ReportBuilder(SourceBuilder(now).Build()) - .SetReportTime(now + base::Hours(5)) - .SetPriority(-2) - .Build(), - SentReportInfo::Status::kFailure, - /*http_response_code=*/0)); + manager_.NotifyReportSent(SentReport(ReportBuilder(SourceBuilder(now).Build()) + .SetReportTime(now + base::Hours(3)) + .Build(), + SentReport::Status::kSent, + /*http_response_code=*/200)); + manager_.NotifyReportSent(SentReport(ReportBuilder(SourceBuilder(now).Build()) + .SetReportTime(now + base::Hours(4)) + .SetPriority(-1) + .Build(), + SentReport::Status::kDropped, + /*http_response_code=*/0)); + manager_.NotifyReportSent(SentReport(ReportBuilder(SourceBuilder(now).Build()) + .SetReportTime(now + base::Hours(5)) + .SetPriority(-2) + .Build(), + SentReport::Status::kFailure, + /*http_response_code=*/0)); manager_.SetReportsForWebUI( {ReportBuilder( SourceBuilder(now) @@ -471,9 +468,8 @@ .Build(); manager_.SetReportsForWebUI({report}); report.report_time += base::Hours(1); - manager_.NotifyReportSent(SentReportInfo(report, - SentReportInfo::Status::kSent, - /*http_response_code=*/200)); + manager_.NotifyReportSent(SentReport(report, SentReport::Status::kSent, + /*http_response_code=*/200)); // Verify both rows get rendered. static constexpr char wait_script[] = R"(
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc index 8ae7f992..814b47b 100644 --- a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc +++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
@@ -15,7 +15,7 @@ #include "content/browser/attribution_reporting/attribution_manager_impl.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_storage.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" #include "content/browser/attribution_reporting/storable_source.h" #include "content/browser/storage_partition_impl.h" #include "content/public/browser/browser_context.h" @@ -220,22 +220,22 @@ } } -void AttributionInternalsHandlerImpl::OnReportSent(const SentReportInfo& info) { +void AttributionInternalsHandlerImpl::OnReportSent(const SentReport& info) { mojom::WebUIAttributionReport::Status status; switch (info.status) { - case SentReportInfo::Status::kSent: + case SentReport::Status::kSent: status = mojom::WebUIAttributionReport::Status::kSent; break; - case SentReportInfo::Status::kDropped: + case SentReport::Status::kDropped: status = mojom::WebUIAttributionReport::Status::kProhibitedByBrowserPolicy; break; - case SentReportInfo::Status::kFailure: + case SentReport::Status::kFailure: status = mojom::WebUIAttributionReport::Status::kNetworkError; break; - case SentReportInfo::Status::kTransientFailure: - case SentReportInfo::Status::kOffline: - case SentReportInfo::Status::kRemovedFromQueue: + case SentReport::Status::kTransientFailure: + case SentReport::Status::kOffline: + case SentReport::Status::kRemovedFromQueue: NOTREACHED(); return; }
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.h b/content/browser/attribution_reporting/attribution_internals_handler_impl.h index ba6af47..7198ed978 100644 --- a/content/browser/attribution_reporting/attribution_internals_handler_impl.h +++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.h
@@ -68,7 +68,7 @@ void OnReportsChanged() override; void OnSourceDeactivated( const AttributionStorage::DeactivatedSource& deactivated_source) override; - void OnReportSent(const SentReportInfo& info) override; + void OnReportSent(const SentReport& info) override; void OnReportDropped( const AttributionStorage::CreateReportResult& result) override;
diff --git a/content/browser/attribution_reporting/attribution_manager.h b/content/browser/attribution_reporting/attribution_manager.h index bd17799d..196b764 100644 --- a/content/browser/attribution_reporting/attribution_manager.h +++ b/content/browser/attribution_reporting/attribution_manager.h
@@ -12,7 +12,7 @@ #include "base/observer_list_types.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_storage.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" namespace base { class Time; @@ -58,7 +58,7 @@ virtual void OnSourceDeactivated( const AttributionStorage::DeactivatedSource& source) {} - virtual void OnReportSent(const SentReportInfo& info) {} + virtual void OnReportSent(const SentReport& info) {} virtual void OnReportDropped( const AttributionStorage::CreateReportResult& result) {}
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc index c1e7e8bf..0aeb486 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -84,20 +84,20 @@ } ConversionReportSendOutcome ConvertToConversionReportSendOutcome( - SentReportInfo::Status status) { + SentReport::Status status) { switch (status) { - case SentReportInfo::Status::kSent: + case SentReport::Status::kSent: return ConversionReportSendOutcome::kSent; - case SentReportInfo::Status::kTransientFailure: - case SentReportInfo::Status::kFailure: + case SentReport::Status::kTransientFailure: + case SentReport::Status::kFailure: return ConversionReportSendOutcome::kFailed; - case SentReportInfo::Status::kOffline: - case SentReportInfo::Status::kRemovedFromQueue: + case SentReport::Status::kOffline: + case SentReport::Status::kRemovedFromQueue: // Offline reports and reports removed from the queue before being sent // should never record an outcome. NOTREACHED(); return ConversionReportSendOutcome::kFailed; - case SentReportInfo::Status::kDropped: + case SentReport::Status::kDropped: return ConversionReportSendOutcome::kDropped; } } @@ -425,7 +425,7 @@ reporter_->AddReportsToQueue(std::move(reports)); } -void AttributionManagerImpl::OnReportSent(SentReportInfo info) { +void AttributionManagerImpl::OnReportSent(SentReport info) { DCHECK(info.report.conversion_id.has_value()); // If there was a transient failure, and another attempt is allowed, @@ -433,7 +433,7 @@ // from storage if it wasn't skipped due to the browser being offline. bool should_retry = false; - if (info.status == SentReportInfo::Status::kTransientFailure) { + if (info.status == SentReport::Status::kTransientFailure) { info.report.failed_send_attempts++; const absl::optional<base::TimeDelta> delay = attribution_policy_->GetFailedReportDelay( @@ -465,8 +465,8 @@ manager->NotifyReportsChanged(); }, weak_factory_.GetWeakPtr(), info.report)); - } else if (info.status == SentReportInfo::Status::kOffline || - info.status == SentReportInfo::Status::kRemovedFromQueue) { + } else if (info.status == SentReport::Status::kOffline || + info.status == SentReport::Status::kRemovedFromQueue) { // Remove the ID from the set so that subsequent attempts will not be // deduplicated. size_t num_removed = queued_reports_.erase(info.report.conversion_id); @@ -511,9 +511,9 @@ } // TODO(apaseltiner): Consider surfacing retry attempts in internals UI. - if (info.status != SentReportInfo::Status::kSent && - info.status != SentReportInfo::Status::kFailure && - info.status != SentReportInfo::Status::kDropped) { + if (info.status != SentReport::Status::kSent && + info.status != SentReport::Status::kFailure && + info.status != SentReport::Status::kDropped) { return; }
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.h b/content/browser/attribution_reporting/attribution_manager_impl.h index 7a714a14..0cdcf98 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl.h +++ b/content/browser/attribution_reporting/attribution_manager_impl.h
@@ -20,7 +20,7 @@ #include "content/browser/attribution_reporting/attribution_manager.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_storage.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" #include "content/common/content_export.h" #include "storage/browser/quota/special_storage_policy.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -153,7 +153,7 @@ void OnGetReportsToSendFromWebUI(base::OnceClosure done, std::vector<AttributionReport> reports); - void OnReportSent(SentReportInfo info); + void OnReportSent(SentReport info); void OnReportStored(AttributionStorage::CreateReportResult result);
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc index f8855e20..39a3f91 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -28,7 +28,7 @@ #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_storage.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" #include "content/browser/attribution_reporting/storable_source.h" #include "content/browser/attribution_reporting/storable_trigger.h" #include "content/public/test/browser_task_environment.h" @@ -79,7 +79,7 @@ (const DeactivatedSource& source), (override)); - MOCK_METHOD(void, OnReportSent, (const SentReportInfo& info), (override)); + MOCK_METHOD(void, OnReportSent, (const SentReport& info), (override)); MOCK_METHOD(void, OnReportDropped, @@ -101,8 +101,8 @@ for (auto& report : reports) { added_reports_.push_back(report); - SentReportInfo info(std::move(report), sent_report_info_status_, - /*http_response_code=*/0); + SentReport info(std::move(report), sent_report_status_, + /*http_response_code=*/0); if (should_run_report_sent_callbacks_) { report_sent_callback_.Run(std::move(info)); @@ -124,7 +124,7 @@ void RemoveAllReportsFromQueue() override { for (auto& deferred_callback : deferred_callbacks_) { - deferred_callback.status = SentReportInfo::Status::kRemovedFromQueue; + deferred_callback.status = SentReport::Status::kRemovedFromQueue; } RunDeferredCallbacks(); } @@ -133,8 +133,8 @@ should_run_report_sent_callbacks_ = should_run_report_sent_callbacks; } - void SetSentReportInfoStatus(SentReportInfo::Status status) { - sent_report_info_status_ = status; + void SetSentReportStatus(SentReport::Status status) { + sent_report_status_ = status; } const std::vector<AttributionReport>& added_reports() const { @@ -152,19 +152,18 @@ } void SetReportSentCallback( - base::RepeatingCallback<void(SentReportInfo)> report_sent_callback) { + base::RepeatingCallback<void(SentReport)> report_sent_callback) { report_sent_callback_ = std::move(report_sent_callback); } private: - base::RepeatingCallback<void(SentReportInfo)> report_sent_callback_; + base::RepeatingCallback<void(SentReport)> report_sent_callback_; bool should_run_report_sent_callbacks_ = false; - SentReportInfo::Status sent_report_info_status_ = - SentReportInfo::Status::kSent; + SentReport::Status sent_report_status_ = SentReport::Status::kSent; size_t expected_num_reports_ = 0u; std::vector<AttributionReport> added_reports_; base::OnceClosure quit_closure_; - std::vector<SentReportInfo> deferred_callbacks_; + std::vector<SentReport> deferred_callbacks_; }; // Time after impression that a conversion can first be sent. See @@ -311,8 +310,7 @@ QueuedReportFailedWithShouldRetry_QueuedAgain) { base::HistogramTester histograms; test_reporter_->ShouldRunReportSentCallbacks(true); - test_reporter_->SetSentReportInfoStatus( - SentReportInfo::Status::kTransientFailure); + test_reporter_->SetSentReportStatus(SentReport::Status::kTransientFailure); attribution_manager_->HandleSource( SourceBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build()); @@ -332,7 +330,7 @@ QueuedReportFailedWithoutShouldRetry_NotQueuedAgain) { base::HistogramTester histograms; test_reporter_->ShouldRunReportSentCallbacks(true); - test_reporter_->SetSentReportInfoStatus(SentReportInfo::Status::kFailure); + test_reporter_->SetSentReportStatus(SentReport::Status::kFailure); attribution_manager_->HandleSource( SourceBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build()); @@ -363,8 +361,7 @@ TEST_F(AttributionManagerImplTest, QueuedReportAlwaysFails_StopsSending) { base::HistogramTester histograms; test_reporter_->ShouldRunReportSentCallbacks(false); - test_reporter_->SetSentReportInfoStatus( - SentReportInfo::Status::kTransientFailure); + test_reporter_->SetSentReportStatus(SentReport::Status::kTransientFailure); attribution_manager_->HandleSource( SourceBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build()); @@ -429,8 +426,7 @@ TEST_F(AttributionManagerImplTest, QueuedReportOffline_NoFailureIncrement) { base::HistogramTester histograms; test_reporter_->ShouldRunReportSentCallbacks(true); - test_reporter_->SetSentReportInfoStatus( - SentReportInfo::Status::kTransientFailure); + test_reporter_->SetSentReportStatus(SentReport::Status::kTransientFailure); attribution_manager_->HandleSource( SourceBuilder(clock().Now()).SetExpiry(kImpressionExpiry).Build()); @@ -442,7 +438,7 @@ // into the queue 2 times. EXPECT_THAT(test_reporter_->added_reports(), SizeIs(3)); - test_reporter_->SetSentReportInfoStatus(SentReportInfo::Status::kOffline); + test_reporter_->SetSentReportStatus(SentReport::Status::kOffline); task_environment_.FastForwardBy(base::Minutes(30)); EXPECT_THAT(test_reporter_->added_reports(), SizeIs(3)); @@ -501,21 +497,21 @@ EXPECT_CALL(observer, OnReportSent(Field( - &SentReportInfo::report, + &SentReport::report, Field(&AttributionReport::impression, Property(&StorableSource::source_event_id, 1u))))); EXPECT_CALL(observer, OnReportSent(Field( - &SentReportInfo::report, + &SentReport::report, Field(&AttributionReport::impression, Property(&StorableSource::source_event_id, 2u))))); EXPECT_CALL(observer, OnReportSent(Field( - &SentReportInfo::report, + &SentReport::report, Field(&AttributionReport::impression, Property(&StorableSource::source_event_id, 3u))))); - test_reporter_->SetSentReportInfoStatus(SentReportInfo::Status::kSent); + test_reporter_->SetSentReportStatus(SentReport::Status::kSent); attribution_manager_->HandleSource(SourceBuilder(clock().Now()) .SetSourceEventId(1) .SetExpiry(kImpressionExpiry) @@ -525,7 +521,7 @@ kAttributionManagerQueueReportsInterval); // This one should be stored, as its status is `kDropped`. - test_reporter_->SetSentReportInfoStatus(SentReportInfo::Status::kDropped); + test_reporter_->SetSentReportStatus(SentReport::Status::kDropped); attribution_manager_->HandleSource(SourceBuilder(clock().Now()) .SetSourceEventId(2) .SetExpiry(kImpressionExpiry) @@ -534,7 +530,7 @@ task_environment_.FastForwardBy(kFirstReportingWindow - kAttributionManagerQueueReportsInterval); - test_reporter_->SetSentReportInfoStatus(SentReportInfo::Status::kSent); + test_reporter_->SetSentReportStatus(SentReport::Status::kSent); attribution_manager_->HandleSource(SourceBuilder(clock().Now()) .SetSourceEventId(3) .SetExpiry(kImpressionExpiry) @@ -544,8 +540,7 @@ kAttributionManagerQueueReportsInterval); // This one shouldn't be stored, as it will be retried. - test_reporter_->SetSentReportInfoStatus( - SentReportInfo::Status::kTransientFailure); + test_reporter_->SetSentReportStatus(SentReport::Status::kTransientFailure); attribution_manager_->HandleSource(SourceBuilder(clock().Now()) .SetSourceEventId(4) .SetExpiry(kImpressionExpiry)
diff --git a/content/browser/attribution_reporting/attribution_network_sender_impl.cc b/content/browser/attribution_reporting/attribution_network_sender_impl.cc index 4c5b989..6f2f950 100644 --- a/content/browser/attribution_reporting/attribution_network_sender_impl.cc +++ b/content/browser/attribution_reporting/attribution_network_sender_impl.cc
@@ -14,7 +14,7 @@ #include "base/time/time.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_utils.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" #include "content/public/browser/storage_partition.h" #include "net/base/isolation_info.h" #include "net/base/load_flags.h" @@ -201,15 +201,15 @@ net_error == net::ERR_CONNECTION_ABORTED || net_error == net::ERR_CONNECTION_RESET); - SentReportInfo::Status report_status = + SentReport::Status report_status = (status == Status::kOk) - ? SentReportInfo::Status::kSent - : (should_retry ? SentReportInfo::Status::kTransientFailure - : SentReportInfo::Status::kFailure); + ? SentReport::Status::kSent + : (should_retry ? SentReport::Status::kTransientFailure + : SentReport::Status::kFailure); std::move(sent_callback) - .Run(SentReportInfo(std::move(report), report_status, - headers ? headers->response_code() : 0)); + .Run(SentReport(std::move(report), report_status, + headers ? headers->response_code() : 0)); } } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_network_sender_impl_unittest.cc b/content/browser/attribution_reporting/attribution_network_sender_impl_unittest.cc index c6063159b..f27f3d9 100644 --- a/content/browser/attribution_reporting/attribution_network_sender_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_network_sender_impl_unittest.cc
@@ -14,7 +14,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/simple_test_clock.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" #include "content/browser/storage_partition_impl.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/storage_partition.h" @@ -64,7 +64,7 @@ } protected: - std::vector<SentReportInfo> sent_reports_; + std::vector<SentReport> sent_reports_; // |task_environment_| must be initialized first. content::BrowserTaskEnvironment task_environment_; @@ -74,7 +74,7 @@ network::TestURLLoaderFactory test_url_loader_factory_; private: - void OnReportSent(SentReportInfo info) { + void OnReportSent(SentReport info) { sent_reports_.push_back(std::move(info)); } @@ -181,10 +181,9 @@ EXPECT_EQ(1, test_url_loader_factory_.NumPending()); EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest( kReportUrl, "")); - EXPECT_THAT(sent_reports_, - ElementsAre(SentReportInfo(std::move(report), - SentReportInfo::Status::kSent, - /*http_response_code=*/200))); + EXPECT_THAT(sent_reports_, ElementsAre(SentReport( + std::move(report), SentReport::Status::kSent, + /*http_response_code=*/200))); } TEST_F(AttributionNetworkSenderTest, SenderDeletedDuringRequest_NoCrash) { @@ -208,29 +207,27 @@ EXPECT_EQ(0, test_url_loader_factory_.NumPending()); // Also verify that the sent callback runs if the request times out. - // TODO(apaseltiner): Should we propagate the timeout via the SentReportInfo + // TODO(apaseltiner): Should we propagate the timeout via the SentReport // instead of just setting |http_response_code = 0|? EXPECT_THAT(sent_reports_, - ElementsAre(SentReportInfo( - std::move(report), SentReportInfo::Status::kTransientFailure, - /*http_response_code=*/0))); + ElementsAre(SentReport(std::move(report), + SentReport::Status::kTransientFailure, + /*http_response_code=*/0))); } TEST_F(AttributionNetworkSenderTest, ReportRequestFailsWithTargetedError_ShouldRetrySet) { struct { int net_error; - SentReportInfo::Status expected_status; + SentReport::Status expected_status; } kTestCases[] = { - {net::ERR_INTERNET_DISCONNECTED, - SentReportInfo::Status::kTransientFailure}, - {net::ERR_TIMED_OUT, SentReportInfo::Status::kTransientFailure}, - {net::ERR_CONNECTION_ABORTED, SentReportInfo::Status::kTransientFailure}, - {net::ERR_CONNECTION_TIMED_OUT, - SentReportInfo::Status::kTransientFailure}, - {net::ERR_CONNECTION_REFUSED, SentReportInfo::Status::kFailure}, - {net::ERR_CERT_DATE_INVALID, SentReportInfo::Status::kFailure}, - {net::OK, SentReportInfo::Status::kFailure}, + {net::ERR_INTERNET_DISCONNECTED, SentReport::Status::kTransientFailure}, + {net::ERR_TIMED_OUT, SentReport::Status::kTransientFailure}, + {net::ERR_CONNECTION_ABORTED, SentReport::Status::kTransientFailure}, + {net::ERR_CONNECTION_TIMED_OUT, SentReport::Status::kTransientFailure}, + {net::ERR_CONNECTION_REFUSED, SentReport::Status::kFailure}, + {net::ERR_CERT_DATE_INVALID, SentReport::Status::kFailure}, + {net::OK, SentReport::Status::kFailure}, }; for (const auto& test_case : kTestCases) { @@ -267,9 +264,9 @@ // Ensure the request was replied to. EXPECT_EQ(0, test_url_loader_factory_.NumPending()); - EXPECT_THAT(sent_reports_, ElementsAre(SentReportInfo( - report, SentReportInfo::Status::kFailure, - /*http_response_code=*/200))); + EXPECT_THAT(sent_reports_, + ElementsAre(SentReport(report, SentReport::Status::kFailure, + /*http_response_code=*/200))); } TEST_F(AttributionNetworkSenderTest, @@ -281,9 +278,9 @@ EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest( kReportUrl, "", net::HttpStatusCode::HTTP_BAD_REQUEST)); - EXPECT_THAT(sent_reports_, ElementsAre(SentReportInfo( - report, SentReportInfo::Status::kFailure, - /*http_response_code=*/400))); + EXPECT_THAT(sent_reports_, + ElementsAre(SentReport(report, SentReport::Status::kFailure, + /*http_response_code=*/400))); } TEST_F(AttributionNetworkSenderTest, @@ -354,8 +351,8 @@ kReportUrl, "", net::HttpStatusCode::HTTP_BAD_REQUEST)); EXPECT_THAT( sent_reports_, - ElementsAre(SentReportInfo( - std::move(report), SentReportInfo::Status::kFailure, + ElementsAre(SentReport( + std::move(report), SentReport::Status::kFailure, /*http_response_code=*/net::HttpStatusCode::HTTP_BAD_REQUEST))); }
diff --git a/content/browser/attribution_reporting/attribution_reporter_impl.cc b/content/browser/attribution_reporting/attribution_reporter_impl.cc index 27f7fae9..be64afa 100644 --- a/content/browser/attribution_reporting/attribution_reporter_impl.cc +++ b/content/browser/attribution_reporting/attribution_reporter_impl.cc
@@ -11,7 +11,7 @@ #include "content/browser/attribution_reporting/attribution_manager.h" #include "content/browser/attribution_reporting/attribution_network_sender_impl.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" #include "content/browser/storage_partition_impl.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/network_service_instance.h" @@ -59,9 +59,9 @@ while (!report_queue_.empty()) { AttributionReport report = report_queue_.top(); report_queue_.pop(); - callback_.Run(SentReportInfo(std::move(report), - SentReportInfo::Status::kRemovedFromQueue, - /*http_response_code=*/0)); + callback_.Run(SentReport(std::move(report), + SentReport::Status::kRemovedFromQueue, + /*http_response_code=*/0)); } } @@ -103,9 +103,8 @@ // If there's no network connection, drop the report and tell the manager to // retry it later. if (offline_) { - callback_.Run(SentReportInfo(std::move(report), - SentReportInfo::Status::kOffline, - /*http_response_code=*/0)); + callback_.Run(SentReport(std::move(report), SentReport::Status::kOffline, + /*http_response_code=*/0)); } else { network_sender_->SendReport(std::move(report), callback_); } @@ -114,9 +113,8 @@ // to make sure we forward that the report was "sent" to ensure it is // deleted from storage, etc. This simulates sending the report through a // null channel. - callback_.Run(SentReportInfo(std::move(report), - SentReportInfo::Status::kDropped, - /*http_response_code=*/0)); + callback_.Run(SentReport(std::move(report), SentReport::Status::kDropped, + /*http_response_code=*/0)); } MaybeScheduleNextReport(); }
diff --git a/content/browser/attribution_reporting/attribution_reporter_impl.h b/content/browser/attribution_reporting/attribution_reporter_impl.h index 42f52aa9..1877b23 100644 --- a/content/browser/attribution_reporting/attribution_reporter_impl.h +++ b/content/browser/attribution_reporting/attribution_reporter_impl.h
@@ -27,7 +27,7 @@ class StoragePartitionImpl; -struct SentReportInfo; +struct SentReport; // This class is responsible for managing the dispatch of conversion reports to // an AttributionReporterImpl::NetworkSender. It maintains a queue of reports @@ -45,7 +45,7 @@ virtual ~NetworkSender() = default; // Callback used to notify caller that the requested report has been sent. - using ReportSentCallback = base::OnceCallback<void(SentReportInfo)>; + using ReportSentCallback = base::OnceCallback<void(SentReport)>; // Generates and sends a conversion report matching |report|. This should // generate a secure POST request with no-credentials. @@ -53,7 +53,7 @@ ReportSentCallback sent_callback) = 0; }; - using Callback = base::RepeatingCallback<void(SentReportInfo)>; + using Callback = base::RepeatingCallback<void(SentReport)>; AttributionReporterImpl(StoragePartitionImpl* storage_partition, const base::Clock* clock,
diff --git a/content/browser/attribution_reporting/attribution_reporter_impl_unittest.cc b/content/browser/attribution_reporting/attribution_reporter_impl_unittest.cc index b720472..50cba88 100644 --- a/content/browser/attribution_reporting/attribution_reporter_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_reporter_impl_unittest.cc
@@ -7,7 +7,7 @@ #include "base/memory/raw_ptr.h" #include "base/test/mock_callback.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" #include "content/browser/storage_partition_impl.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/network_service_instance.h" @@ -50,13 +50,13 @@ (override)); }; -auto InvokeCallbackWith(SentReportInfo::Status status, +auto InvokeCallbackWith(SentReport::Status status, int http_response_code = 200) { return [=](AttributionReport report, AttributionReporterImpl::NetworkSender::ReportSentCallback callback) { std::move(callback).Run( - SentReportInfo(std::move(report), status, http_response_code)); + SentReport(std::move(report), status, http_response_code)); }; } @@ -104,11 +104,10 @@ const auto report = GetReport(clock().Now(), AttributionReport::Id(1)); EXPECT_CALL(*sender_, SendReport(report, _)) - .WillOnce(InvokeCallbackWith(SentReportInfo::Status::kSent)); + .WillOnce(InvokeCallbackWith(SentReport::Status::kSent)); - EXPECT_CALL(callback_, - Run(SentReportInfo(report, SentReportInfo::Status::kSent, - /*http_response_code=*/200))); + EXPECT_CALL(callback_, Run(SentReport(report, SentReport::Status::kSent, + /*http_response_code=*/200))); reporter_->AddReportsToQueue({report}); @@ -123,11 +122,10 @@ GetReport(clock().Now() - base::Hours(10), AttributionReport::Id(1)); EXPECT_CALL(*sender_, SendReport(report, _)) - .WillOnce(InvokeCallbackWith(SentReportInfo::Status::kSent)); + .WillOnce(InvokeCallbackWith(SentReport::Status::kSent)); - EXPECT_CALL(callback_, - Run(SentReportInfo(report, SentReportInfo::Status::kSent, - /*http_response_code=*/200))); + EXPECT_CALL(callback_, Run(SentReport(report, SentReport::Status::kSent, + /*http_response_code=*/200))); reporter_->AddReportsToQueue({report}); @@ -142,8 +140,8 @@ GetReport(clock().Now() - base::Hours(10), AttributionReport::Id(1)); EXPECT_CALL(*sender_, SendReport).Times(0); - EXPECT_CALL(callback_, Run(SentReportInfo( - report, SentReportInfo::Status::kRemovedFromQueue, + EXPECT_CALL(callback_, + Run(SentReport(report, SentReport::Status::kRemovedFromQueue, /*http_response_code=*/0))); reporter_->AddReportsToQueue({report}); @@ -233,11 +231,10 @@ GetReport(clock().Now() + base::Minutes(i), AttributionReport::Id(i)); EXPECT_CALL(*sender_, SendReport(report, _)) - .WillOnce(InvokeCallbackWith(SentReportInfo::Status::kSent)); + .WillOnce(InvokeCallbackWith(SentReport::Status::kSent)); - EXPECT_CALL(callback_, - Run(SentReportInfo(report, SentReportInfo::Status::kSent, - /*http_response_code=*/200))); + EXPECT_CALL(callback_, Run(SentReport(report, SentReport::Status::kSent, + /*http_response_code=*/200))); reports.push_back(std::move(report)); } @@ -266,11 +263,10 @@ GetReport(clock().Now() + base::Minutes(i), AttributionReport::Id(i)); EXPECT_CALL(*sender_, SendReport(report, _)) - .WillOnce(InvokeCallbackWith(SentReportInfo::Status::kSent)); + .WillOnce(InvokeCallbackWith(SentReport::Status::kSent)); - EXPECT_CALL(callback_, - Run(SentReportInfo(report, SentReportInfo::Status::kSent, - /*http_response_code=*/200))); + EXPECT_CALL(callback_, Run(SentReport(report, SentReport::Status::kSent, + /*http_response_code=*/200))); reports.push_back(std::move(report)); } @@ -304,9 +300,8 @@ EXPECT_CALL(*sender_, SendReport).Times(0); - EXPECT_CALL(callback_, - Run(SentReportInfo(report, SentReportInfo::Status::kDropped, - /*http_response_code=*/0))); + EXPECT_CALL(callback_, Run(SentReport(report, SentReport::Status::kDropped, + /*http_response_code=*/0))); reporter_->AddReportsToQueue({report}); @@ -332,24 +327,23 @@ EXPECT_CALL(*sender_, SendReport).Times(0); EXPECT_CALL(callback_, - Run(SentReportInfo(report1_1, SentReportInfo::Status::kOffline, - /*http_response_code=*/0))); + Run(SentReport(report1_1, SentReport::Status::kOffline, + /*http_response_code=*/0))); EXPECT_CALL(checkpoint, Call(1)); EXPECT_CALL(*sender_, SendReport).Times(0); EXPECT_CALL(callback_, - Run(SentReportInfo(report2_1, SentReportInfo::Status::kOffline, - /*http_response_code=*/0))); + Run(SentReport(report2_1, SentReport::Status::kOffline, + /*http_response_code=*/0))); EXPECT_CALL(checkpoint, Call(2)); EXPECT_CALL(*sender_, SendReport) - .WillOnce(InvokeCallbackWith(SentReportInfo::Status::kSent)); - EXPECT_CALL(callback_, - Run(SentReportInfo(report1_2, SentReportInfo::Status::kSent, - /*http_response_code=*/200))); + .WillOnce(InvokeCallbackWith(SentReport::Status::kSent)); + EXPECT_CALL(callback_, Run(SentReport(report1_2, SentReport::Status::kSent, + /*http_response_code=*/200))); EXPECT_CALL(checkpoint, Call(3)); EXPECT_CALL(*sender_, SendReport).Times(0); EXPECT_CALL(callback_, - Run(SentReportInfo(report2_2, SentReportInfo::Status::kOffline, - /*http_response_code=*/0))); + Run(SentReport(report2_2, SentReport::Status::kOffline, + /*http_response_code=*/0))); } SetOffline(true);
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc index 2597e5a..4d72709 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.cc +++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -188,7 +188,7 @@ observer.OnSourceDeactivated(source); } -void TestAttributionManager::NotifyReportSent(const SentReportInfo& info) { +void TestAttributionManager::NotifyReportSent(const SentReport& info) { for (Observer& observer : observers_) observer.OnReportSent(info); } @@ -399,8 +399,8 @@ return tie(a) == tie(b); } -bool operator==(const SentReportInfo& a, const SentReportInfo& b) { - const auto tie = [](const SentReportInfo& info) { +bool operator==(const SentReport& a, const SentReport& b) { + const auto tie = [](const SentReport& info) { return std::make_tuple(info.report, info.status, info.http_response_code); }; return tie(a) == tie(b); @@ -556,31 +556,31 @@ << ",failed_send_attempts=" << report.failed_send_attempts << "}"; } -std::ostream& operator<<(std::ostream& out, SentReportInfo::Status status) { +std::ostream& operator<<(std::ostream& out, SentReport::Status status) { switch (status) { - case SentReportInfo::Status::kSent: + case SentReport::Status::kSent: out << "kSent"; break; - case SentReportInfo::Status::kTransientFailure: + case SentReport::Status::kTransientFailure: out << "kTransientFailure"; break; - case SentReportInfo::Status::kFailure: + case SentReport::Status::kFailure: out << "kFailure"; break; - case SentReportInfo::Status::kDropped: + case SentReport::Status::kDropped: out << "kDropped"; break; - case SentReportInfo::Status::kOffline: + case SentReport::Status::kOffline: out << "kOffline"; break; - case SentReportInfo::Status::kRemovedFromQueue: + case SentReport::Status::kRemovedFromQueue: out << "kRemovedFromQueue"; break; } return out; } -std::ostream& operator<<(std::ostream& out, const SentReportInfo& info) { +std::ostream& operator<<(std::ostream& out, const SentReport& info) { return out << "{report=" << info.report << ",status=" << info.status << ",http_response_code=" << info.http_response_code << "}"; }
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h index 4711d53..644e4a4 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.h +++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -24,7 +24,7 @@ #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_storage.h" #include "content/browser/attribution_reporting/rate_limit_table.h" -#include "content/browser/attribution_reporting/sent_report_info.h" +#include "content/browser/attribution_reporting/sent_report.h" #include "content/browser/attribution_reporting/storable_source.h" #include "content/browser/attribution_reporting/storable_trigger.h" #include "content/test/test_content_browser_client.h" @@ -188,7 +188,7 @@ void NotifyReportsChanged(); void NotifySourceDeactivated( const AttributionStorage::DeactivatedSource& source); - void NotifyReportSent(const SentReportInfo& info); + void NotifyReportSent(const SentReport& info); void NotifyReportDropped( const AttributionStorage::CreateReportResult& result); @@ -343,7 +343,7 @@ bool operator==(const AttributionReport& a, const AttributionReport& b); -bool operator==(const SentReportInfo& a, const SentReportInfo& b); +bool operator==(const SentReport& a, const SentReport& b); bool operator==(const AttributionStorage::DeactivatedSource& a, const AttributionStorage::DeactivatedSource& b); @@ -366,9 +366,9 @@ std::ostream& operator<<(std::ostream& out, const AttributionReport& report); -std::ostream& operator<<(std::ostream& out, SentReportInfo::Status status); +std::ostream& operator<<(std::ostream& out, SentReport::Status status); -std::ostream& operator<<(std::ostream& out, const SentReportInfo& info); +std::ostream& operator<<(std::ostream& out, const SentReport& info); std::ostream& operator<<(std::ostream& out, StorableSource::AttributionLogic attribution_logic);
diff --git a/content/browser/attribution_reporting/sent_report.cc b/content/browser/attribution_reporting/sent_report.cc new file mode 100644 index 0000000..0f77409 --- /dev/null +++ b/content/browser/attribution_reporting/sent_report.cc
@@ -0,0 +1,23 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/attribution_reporting/sent_report.h" + +namespace content { + +SentReport::SentReport(AttributionReport report, + Status status, + int http_response_code) + : report(std::move(report)), + status(status), + http_response_code(http_response_code) {} + +SentReport::SentReport(const SentReport& other) = default; +SentReport& SentReport::operator=(const SentReport& other) = default; +SentReport::SentReport(SentReport&& other) = default; +SentReport& SentReport::operator=(SentReport&& other) = default; + +SentReport::~SentReport() = default; + +} // namespace content
diff --git a/content/browser/attribution_reporting/sent_report_info.h b/content/browser/attribution_reporting/sent_report.h similarity index 68% rename from content/browser/attribution_reporting/sent_report_info.h rename to content/browser/attribution_reporting/sent_report.h index 7d274d55..9cd78d5 100644 --- a/content/browser/attribution_reporting/sent_report_info.h +++ b/content/browser/attribution_reporting/sent_report.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_SENT_REPORT_INFO_H_ -#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_SENT_REPORT_INFO_H_ +#ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_SENT_REPORT_H_ +#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_SENT_REPORT_H_ #include "base/time/time.h" #include "content/browser/attribution_reporting/attribution_report.h" @@ -13,7 +13,7 @@ // Struct that contains data about sent reports. Some info is displayed in the // Conversion Internals WebUI. -struct CONTENT_EXPORT SentReportInfo { +struct CONTENT_EXPORT SentReport { enum class Status { kSent, // The report failed without receiving response headers. @@ -30,14 +30,12 @@ kRemovedFromQueue, }; - SentReportInfo(AttributionReport report, - Status status, - int http_response_code); - SentReportInfo(const SentReportInfo& other); - SentReportInfo& operator=(const SentReportInfo& other); - SentReportInfo(SentReportInfo&& other); - SentReportInfo& operator=(SentReportInfo&& other); - ~SentReportInfo(); + SentReport(AttributionReport report, Status status, int http_response_code); + SentReport(const SentReport& other); + SentReport& operator=(const SentReport& other); + SentReport(SentReport&& other); + SentReport& operator=(SentReport&& other); + ~SentReport(); AttributionReport report; @@ -52,4 +50,4 @@ } // namespace content -#endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_SENT_REPORT_INFO_H_ +#endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_SENT_REPORT_H_
diff --git a/content/browser/attribution_reporting/sent_report_info.cc b/content/browser/attribution_reporting/sent_report_info.cc deleted file mode 100644 index 0067260f..0000000 --- a/content/browser/attribution_reporting/sent_report_info.cc +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/attribution_reporting/sent_report_info.h" - -namespace content { - -SentReportInfo::SentReportInfo(AttributionReport report, - Status status, - int http_response_code) - : report(std::move(report)), - status(status), - http_response_code(http_response_code) {} - -SentReportInfo::SentReportInfo(const SentReportInfo& other) = default; -SentReportInfo& SentReportInfo::operator=(const SentReportInfo& other) = - default; -SentReportInfo::SentReportInfo(SentReportInfo&& other) = default; -SentReportInfo& SentReportInfo::operator=(SentReportInfo&& other) = default; - -SentReportInfo::~SentReportInfo() = default; - -} // namespace content
diff --git a/content/browser/back_forward_cache_features_browsertest.cc b/content/browser/back_forward_cache_features_browsertest.cc index e656b97..ddfa991 100644 --- a/content/browser/back_forward_cache_features_browsertest.cc +++ b/content/browser/back_forward_cache_features_browsertest.cc
@@ -5,6 +5,7 @@ #include "content/browser/back_forward_cache_browsertest.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "content/browser/generic_sensor/sensor_provider_proxy_impl.h" #include "content/browser/presentation/presentation_test_utils.h" #include "content/browser/renderer_host/back_forward_cache_disable.h"
diff --git a/content/browser/devtools/protocol/native_input_event_builder.h b/content/browser/devtools/protocol/native_input_event_builder.h index befa361..81c5493 100644 --- a/content/browser/devtools/protocol/native_input_event_builder.h +++ b/content/browser/devtools/protocol/native_input_event_builder.h
@@ -5,6 +5,7 @@ #ifndef CONTENT_BROWSER_DEVTOOLS_PROTOCOL_NATIVE_INPUT_EVENT_BUILDER_H_ #define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_NATIVE_INPUT_EVENT_BUILDER_H_ +#include "build/build_config.h" #include "content/public/browser/native_web_keyboard_event.h" namespace content {
diff --git a/content/browser/download/download_item_utils.cc b/content/browser/download/download_item_utils.cc index 629165b..45f5300 100644 --- a/content/browser/download/download_item_utils.cc +++ b/content/browser/download/download_item_utils.cc
@@ -6,6 +6,7 @@ #include "base/memory/raw_ptr.h" #include "components/download/public/common/download_item.h" +#include "content/public/browser/global_routing_id.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" @@ -18,16 +19,21 @@ class DownloadItemData : public base::SupportsUserData::Data, public WebContentsObserver { public: - DownloadItemData(BrowserContext* browser_context, WebContents* web_contents); + DownloadItemData(BrowserContext* browser_context, + WebContents* web_contents, + GlobalRenderFrameHostId id); ~DownloadItemData() override = default; static void Attach(download::DownloadItem* download_item, BrowserContext* browser_context, - WebContents* web_contents); + WebContents* web_contents, + GlobalRenderFrameHostId id); + static DownloadItemData* Get(const download::DownloadItem* download_item); static void Detach(download::DownloadItem* download_item); BrowserContext* browser_context() const { return browser_context_; } + GlobalRenderFrameHostId id() const { return id_; } private: // WebContentsObserver methods. @@ -36,21 +42,26 @@ static const char kKey[]; raw_ptr<BrowserContext> browser_context_; + GlobalRenderFrameHostId id_; }; // static const char DownloadItemData::kKey[] = "DownloadItemUtils DownloadItemData"; DownloadItemData::DownloadItemData(BrowserContext* browser_context, - WebContents* web_contents) + WebContents* web_contents, + GlobalRenderFrameHostId id) : WebContentsObserver(web_contents), - browser_context_(browser_context) {} + browser_context_(browser_context), + id_(id) {} // static void DownloadItemData::Attach(download::DownloadItem* download_item, BrowserContext* browser_context, - WebContents* web_contents) { - auto data = std::make_unique<DownloadItemData>(browser_context, web_contents); + WebContents* web_contents, + GlobalRenderFrameHostId id) { + auto data = + std::make_unique<DownloadItemData>(browser_context, web_contents, id); download_item->SetUserData(&kKey, std::move(data)); } @@ -69,10 +80,12 @@ // To prevent reuse of a render in a different primary page, we will reset // web_contents when the primary page changed. Observe(nullptr); + id_ = GlobalRenderFrameHostId(); } void DownloadItemData::WebContentsDestroyed() { Observe(nullptr); + id_ = GlobalRenderFrameHostId(); } } // namespace @@ -96,10 +109,30 @@ } // static +RenderFrameHost* DownloadItemUtils::GetRenderFrameHost( + const download::DownloadItem* download_item) { + DownloadItemData* data = DownloadItemData::Get(download_item); + if (!data) + return nullptr; + return RenderFrameHost::FromID(data->id()); +} + +// static +void DownloadItemUtils::AttachInfo(download::DownloadItem* download_item, + BrowserContext* browser_context, + WebContents* web_contents, + GlobalRenderFrameHostId id) { + DownloadItemData::Attach(download_item, browser_context, web_contents, id); +} + +// static void DownloadItemUtils::AttachInfo(download::DownloadItem* download_item, BrowserContext* browser_context, WebContents* web_contents) { - DownloadItemData::Attach(download_item, browser_context, web_contents); + DownloadItemUtils::AttachInfo( + download_item, browser_context, web_contents, + web_contents ? web_contents->GetMainFrame()->GetGlobalId() + : GlobalRenderFrameHostId()); } } // namespace content
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index 1850e3b..23b2347 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -59,6 +59,7 @@ #include "content/public/browser/download_item_utils.h" #include "content/public/browser/download_manager_delegate.h" #include "content/public/browser/download_request_utils.h" +#include "content/public/browser/global_routing_id.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h" #include "content/public/browser/render_frame_host.h" @@ -210,6 +211,7 @@ state, danger_type, interrupt_reason, false /* paused */, false /* allow_metered */, opened, last_access_time, transient, received_slices, reroute_info, absl::nullopt /*download_schedule*/, + download::kInvalidRange, download::kInvalidRange, nullptr /* download_entry */); } @@ -368,10 +370,12 @@ downloads_[id] = base::WrapUnique(download); downloads_by_guid_[download->GetGuid()] = download; + GlobalRenderFrameHostId global_id(info.render_process_id, + info.render_frame_id); DownloadItemUtils::AttachInfo( download, GetBrowserContext(), - WebContentsImpl::FromRenderFrameHostID(info.render_process_id, - info.render_frame_id)); + WebContentsImpl::FromRenderFrameHostID(global_id), global_id); + return download; } @@ -814,9 +818,12 @@ download::DownloadItemImpl* download_item = item_factory_->CreateSavePageItem( this, id, main_file_path, page_url, mime_type, std::move(cancel_request_callback)); - DownloadItemUtils::AttachInfo(download_item, GetBrowserContext(), - WebContentsImpl::FromRenderFrameHostID( - render_process_id, render_frame_id)); + + GlobalRenderFrameHostId global_id(render_process_id, render_frame_id); + DownloadItemUtils::AttachInfo( + download_item, GetBrowserContext(), + WebContentsImpl::FromRenderFrameHostID(global_id), global_id); + OnDownloadCreated(base::WrapUnique(download_item)); if (!item_created.is_null()) std::move(item_created).Run(download_item); @@ -1059,7 +1066,8 @@ } #endif download::DownloadItemImpl* download = item.get(); - DownloadItemUtils::AttachInfo(download, GetBrowserContext(), nullptr); + DownloadItemUtils::AttachInfo(download, GetBrowserContext(), nullptr, + GlobalRenderFrameHostId()); OnDownloadCreated(std::move(item)); return download; } @@ -1131,7 +1139,8 @@ in_progress_manager_->RemoveInProgressDownload(item->GetGuid()); } item->SetDelegate(this); - DownloadItemUtils::AttachInfo(item.get(), GetBrowserContext(), nullptr); + DownloadItemUtils::AttachInfo(item.get(), GetBrowserContext(), nullptr, + GlobalRenderFrameHostId()); download = in_progress_downloads_.erase(download); OnDownloadCreated(std::move(item)); }
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index b3df769..74889f9 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -787,6 +787,7 @@ base::Time::Now(), true, std::vector<download::DownloadItem::ReceivedSlice>(), download::DownloadItemRerouteInfo(), absl::nullopt /*download_schedule*/, + download::kInvalidRange, download::kInvalidRange, nullptr /* download_entry */); in_progress_manager->AddDownloadItem(std::move(in_progress_item)); SetInProgressDownloadManager(std::move(in_progress_manager));
diff --git a/content/browser/file_system_access/safe_move_helper.cc b/content/browser/file_system_access/safe_move_helper.cc index fc151bf..0e1db764 100644 --- a/content/browser/file_system_access/safe_move_helper.cc +++ b/content/browser/file_system_access/safe_move_helper.cc
@@ -12,6 +12,7 @@ #include "base/task/thread_pool.h" #include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "components/services/quarantine/quarantine.h" #include "content/browser/file_system_access/file_system_access_error.h" #include "content/public/browser/content_browser_client.h"
diff --git a/content/browser/gpu/browser_gpu_channel_host_factory.cc b/content/browser/gpu/browser_gpu_channel_host_factory.cc index afa8981..4542f1b 100644 --- a/content/browser/gpu/browser_gpu_channel_host_factory.cc +++ b/content/browser/gpu/browser_gpu_channel_host_factory.cc
@@ -20,6 +20,7 @@ #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "components/viz/common/features.h" #include "components/viz/host/gpu_host_impl.h" #include "content/browser/gpu/gpu_data_manager_impl.h"
diff --git a/content/browser/loader/download_utils_impl.cc b/content/browser/loader/download_utils_impl.cc index 9e9f01ed..5edc9b0 100644 --- a/content/browser/loader/download_utils_impl.cc +++ b/content/browser/loader/download_utils_impl.cc
@@ -4,6 +4,7 @@ #include "content/browser/loader/download_utils_impl.h" +#include "build/build_config.h" #include "content/public/browser/content_browser_client.h" #include "content/public/common/content_client.h" #include "net/http/http_content_disposition.h"
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 64619a1..6ed02d4 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -144,6 +144,24 @@ std::unique_ptr<URLLoaderRequestInterceptor> browser_interceptor_; }; +class NavigationTimingThrottle : public blink::URLLoaderThrottle { + public: + NavigationTimingThrottle(bool is_main_frame, base::TimeTicks start) + : is_main_frame_(is_main_frame), start_(start) {} + + void WillStartRequest(network::ResourceRequest* request, + bool* defer) override { + base::UmaHistogramTimes( + base::StrCat({"Navigation.LoaderCreateToRequestStart.", + is_main_frame_ ? "MainFrame" : "Subframe"}), + base::TimeTicks::Now() - start_); + } + + private: + bool is_main_frame_; + base::TimeTicks start_; +}; + base::LazyInstance<NavigationURLLoaderImpl::URLLoaderFactoryInterceptor>::Leaky g_loader_factory_interceptor = LAZY_INSTANCE_INITIALIZER; @@ -1067,9 +1085,12 @@ std::vector<std::unique_ptr<blink::URLLoaderThrottle>> NavigationURLLoaderImpl::CreateURLLoaderThrottles() { - return CreateContentBrowserURLLoaderThrottles( + auto throttles = CreateContentBrowserURLLoaderThrottles( *resource_request_, browser_context_, web_contents_getter_, navigation_ui_data_.get(), frame_tree_node_id_); + throttles.push_back(std::make_unique<NavigationTimingThrottle>( + resource_request_->is_main_frame, loader_creation_time_)); + return throttles; } std::unique_ptr<SignedExchangeRequestHandler> @@ -1178,7 +1199,8 @@ frame_tree_node_id_)), navigation_ui_data_(std::move(navigation_ui_data)), interceptors_(std::move(initial_interceptors)), - download_policy_(request_info_->common_params->download_policy) { + download_policy_(request_info_->common_params->download_policy), + loader_creation_time_(base::TimeTicks::Now()) { DCHECK_CURRENTLY_ON(BrowserThread::UI); TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP1(
diff --git a/content/browser/loader/navigation_url_loader_impl.h b/content/browser/loader/navigation_url_loader_impl.h index f9ecb83..8334abb 100644 --- a/content/browser/loader/navigation_url_loader_impl.h +++ b/content/browser/loader/navigation_url_loader_impl.h
@@ -328,6 +328,9 @@ // Timer used for triggering (optional) early timeout on the navigation. base::OneShotTimer timeout_timer_; + // The time this loader was created. + base::TimeTicks loader_creation_time_; + base::WeakPtrFactory<NavigationURLLoaderImpl> weak_factory_{this}; };
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc index 07ff4f3..fa9ca56 100644 --- a/content/browser/media/media_web_contents_observer.cc +++ b/content/browser/media/media_web_contents_observer.cc
@@ -414,17 +414,6 @@ ->OnAudioOutputSinkChangingDisabled(media_player_id_); } -void MediaWebContentsObserver::MediaPlayerObserverHostImpl:: - OnBufferUnderflow() { - media_web_contents_observer_->web_contents_impl()->MediaBufferUnderflow( - media_player_id_); -} - -void MediaWebContentsObserver::MediaPlayerObserverHostImpl::OnSeek() { - media_web_contents_observer_->web_contents_impl()->MediaPlayerSeek( - media_player_id_); -} - void MediaWebContentsObserver::MediaPlayerObserverHostImpl::OnMediaPlaying() { PlayerInfo* player_info = GetPlayerInfo(); if (!player_info)
diff --git a/content/browser/media/media_web_contents_observer.h b/content/browser/media/media_web_contents_observer.h index 7b2189d..3266e4d 100644 --- a/content/browser/media/media_web_contents_observer.h +++ b/content/browser/media/media_web_contents_observer.h
@@ -214,8 +214,6 @@ void OnAudioOutputSinkChanged(const std::string& hashed_device_id) override; void OnUseAudioServiceChanged(bool uses_audio_service) override; void OnAudioOutputSinkChangingDisabled() override; - void OnBufferUnderflow() override; - void OnSeek() override; private: PlayerInfo* GetPlayerInfo();
diff --git a/content/browser/prerender/prerender_handle_impl.cc b/content/browser/prerender/prerender_handle_impl.cc index b5614e9..38c40e7 100644 --- a/content/browser/prerender/prerender_handle_impl.cc +++ b/content/browser/prerender/prerender_handle_impl.cc
@@ -8,9 +8,13 @@ PrerenderHandleImpl::PrerenderHandleImpl( base::WeakPtr<PrerenderHostRegistry> prerender_host_registry, - int frame_tree_node_id) + int frame_tree_node_id, + const GURL& prerendering_url) : prerender_host_registry_(std::move(prerender_host_registry)), - frame_tree_node_id_(frame_tree_node_id) {} + frame_tree_node_id_(frame_tree_node_id), + prerendering_url_(prerendering_url) { + DCHECK(!prerendering_url_.is_empty()); +} PrerenderHandleImpl::~PrerenderHandleImpl() { // TODO(https://crbug.com/1166085): Use proper FinalStatus after the @@ -21,4 +25,8 @@ } } +GURL PrerenderHandleImpl::GetInitialPrerenderingUrl() { + return prerendering_url_; +} + } // namespace content
diff --git a/content/browser/prerender/prerender_handle_impl.h b/content/browser/prerender/prerender_handle_impl.h index d3d39e8f..2d11815 100644 --- a/content/browser/prerender/prerender_handle_impl.h +++ b/content/browser/prerender/prerender_handle_impl.h
@@ -14,14 +14,18 @@ public: PrerenderHandleImpl( base::WeakPtr<PrerenderHostRegistry> prerender_host_registry, - int frame_tree_node_id); + int frame_tree_node_id, + const GURL& url); ~PrerenderHandleImpl() override; + GURL GetInitialPrerenderingUrl() override; private: base::WeakPtr<PrerenderHostRegistry> prerender_host_registry_; // `frame_tree_node_id_` is the root FrameTreeNode id of the prerendered // page. const int frame_tree_node_id_; + + const GURL prerendering_url_; }; } // namespace content
diff --git a/content/browser/renderer_host/clipboard_host_impl.cc b/content/browser/renderer_host/clipboard_host_impl.cc index 4cc0728b..d32fcbed 100644 --- a/content/browser/renderer_host/clipboard_host_impl.cc +++ b/content/browser/renderer_host/clipboard_host_impl.cc
@@ -117,7 +117,7 @@ render_frame_host->GetBrowserContext()->IsOffTheRecord() ? nullptr : std::make_unique<ui::DataTransferEndpoint>( - render_frame_host->GetLastCommittedOrigin())); + render_frame_host->GetMainFrame()->GetLastCommittedOrigin())); } void ClipboardHostImpl::Create( @@ -645,7 +645,7 @@ return nullptr; } return std::make_unique<ui::DataTransferEndpoint>( - render_frame_host()->GetLastCommittedOrigin(), + render_frame_host()->GetMainFrame()->GetLastCommittedOrigin(), render_frame_host()->HasTransientUserActivation()); } } // namespace content
diff --git a/content/browser/renderer_host/clipboard_host_impl_unittest.cc b/content/browser/renderer_host/clipboard_host_impl_unittest.cc index 037e03ce..e16a35c 100644 --- a/content/browser/renderer_host/clipboard_host_impl_unittest.cc +++ b/content/browser/renderer_host/clipboard_host_impl_unittest.cc
@@ -17,6 +17,7 @@ #include "base/test/bind.h" #include "content/browser/renderer_host/clipboard_host_impl.h" #include "content/public/test/browser_task_environment.h" +#include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/message_pipe.h" @@ -36,6 +37,8 @@ #include "ui/gfx/codec/png_codec.h" #include "ui/gfx/image/image_unittest_util.h" #include "ui/gfx/skia_util.h" +#include "url/gurl.h" +#include "url/origin.h" namespace ui { class DataTransferEndpoint; @@ -470,7 +473,7 @@ EXPECT_EQ( 1u, clipboard_host_impl()->is_paste_allowed_requests_for_testing().size()); - // count didn't change. + // Count didn't change. EXPECT_FALSE(is_policy_callback_called); clipboard_host_impl()->CompleteRequest( @@ -478,4 +481,66 @@ EXPECT_TRUE(is_policy_callback_called); } + +TEST_F(ClipboardHostImplScanTest, MainFrameOrigin) { + GURL gurl1("https://example.com"); + GURL gurl2("http://test.org"); + GURL gurl3("http://google.com"); + + NavigateAndCommit(gurl1); + content::RenderFrameHost* child_rfh = + content::NavigationSimulator::NavigateAndCommitFromDocument( + gurl2, content::RenderFrameHostTester::For(main_rfh()) + ->AppendChild("child")); + content::RenderFrameHost* grandchild_rfh = + content::NavigationSimulator::NavigateAndCommitFromDocument( + gurl3, content::RenderFrameHostTester::For(child_rfh)->AppendChild( + "grandchild")); + + mojo::Remote<blink::mojom::ClipboardHost> remote_grandchild; + // `FakeClipboardHostImpl` is a `DocumentService` and manages its own + // lifetime. + raw_ptr<FakeClipboardHostImpl> fake_clipboard_host_impl_grandchild = + new FakeClipboardHostImpl(grandchild_rfh, + remote_grandchild.BindNewPipeAndPassReceiver()); + + // Policy controller accepts the paste request. + PolicyControllerTest policy_controller; + EXPECT_CALL(policy_controller, PasteIfAllowed) + .WillOnce(testing::Invoke( + [&gurl1](const ui::DataTransferEndpoint* const data_src, + const ui::DataTransferEndpoint* const data_dst, + const absl::optional<size_t> size, + content::RenderFrameHost* rfh, + base::OnceCallback<void(bool)> callback) { + ASSERT_TRUE(data_dst); + EXPECT_TRUE(data_dst->GetOrigin()->IsSameOriginWith( + url::Origin::Create(gurl1))); + std::move(callback).Run(true); + })); + + bool is_policy_callback_called = false; + fake_clipboard_host_impl_grandchild->PasteIfPolicyAllowed( + ui::ClipboardBuffer::kCopyPaste, ui::ClipboardFormatType::PlainTextType(), + "data", + base::BindLambdaForTesting( + [&is_policy_callback_called]( + FakeClipboardHostImpl::ClipboardPasteContentAllowed allowed) { + is_policy_callback_called = true; + })); + base::RunLoop().RunUntilIdle(); + testing::Mock::VerifyAndClearExpectations(&policy_controller); + + // A new request is created. + EXPECT_EQ(1u, fake_clipboard_host_impl_grandchild + ->is_paste_allowed_requests_for_testing() + .size()); + // Count didn't change. + EXPECT_FALSE(is_policy_callback_called); + + fake_clipboard_host_impl_grandchild->CompleteRequest( + system_clipboard()->GetSequenceNumber(ui::ClipboardBuffer::kCopyPaste)); + + EXPECT_TRUE(is_policy_callback_called); +} } // namespace content
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc index 2a672523..a12085b 100644 --- a/content/browser/renderer_host/frame_tree_node.cc +++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -14,7 +14,9 @@ #include "base/memory/raw_ptr.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/strcat.h" #include "base/strings/string_util.h" +#include "base/timer/elapsed_timer.h" #include "content/browser/devtools/devtools_instrumentation.h" #include "content/browser/renderer_host/navigation_controller_impl.h" #include "content/browser/renderer_host/navigation_request.h" @@ -592,6 +594,7 @@ TRACE_EVENT2("navigation", "FrameTreeNode::DidStartLoading", "frame_tree_node", frame_tree_node_id(), "should_show_loading_ui ", should_show_loading_ui); + base::ElapsedTimer timer; frame_tree_->DidStartLoadingNode(*this, should_show_loading_ui, was_previously_loading); @@ -602,6 +605,10 @@ // Notify the RenderFrameHostManager of the event. render_manager()->OnDidStartLoading(); + base::UmaHistogramTimes( + base::StrCat({"Navigation.DidStartLoading.", + IsMainFrame() ? "MainFrame" : "Subframe"}), + timer.Elapsed()); } void FrameTreeNode::DidStopLoading() {
diff --git a/content/browser/renderer_host/media/media_devices_manager.h b/content/browser/renderer_host/media/media_devices_manager.h index f5ce8da..6d34d35 100644 --- a/content/browser/renderer_host/media/media_devices_manager.h +++ b/content/browser/renderer_host/media/media_devices_manager.h
@@ -17,6 +17,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/system/system_monitor.h" +#include "build/build_config.h" #include "content/browser/media/media_devices_util.h" #include "content/common/content_export.h" #include "media/audio/audio_device_description.h"
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 26819b5..ce259d7 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -23,6 +23,7 @@ #include "base/metrics/histogram_macros.h" #include "base/rand_util.h" #include "base/stl_util.h" +#include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/system/sys_info.h" @@ -1818,6 +1819,7 @@ } void NavigationRequest::BeginNavigationImpl() { + base::ElapsedTimer timer; SetState(WILL_START_NAVIGATION); bool convert_urn_uuid_urls = frame_tree_node_->IsFencedFrameRoot() || @@ -2026,7 +2028,13 @@ common_params_->previews_state, this, common_params_->url); } + base::UmaHistogramTimes( + base::StrCat({"Navigation.BeginNavigationImpl.", + IsInMainFrame() ? "MainFrame" : "Subframe"}), + timer.Elapsed()); WillStartRequest(); + // DO NOT ADD CODE AFTER THIS, as the NavigationRequest might have been + // deleted by the previous calls. } void NavigationRequest::SetWaitingForRendererResponse() { @@ -3919,6 +3927,11 @@ std::move(cached_response_head), std::move(interceptor)); DCHECK(!render_frame_host_); + base::UmaHistogramTimes( + base::StrCat({"Navigation.WillStartRequestToLoaderStart.", + IsInMainFrame() ? "MainFrame" : "Subframe"}), + base::TimeTicks::Now() - will_start_request_time_); + loader_->Start(); // DO NOT ADD CODE after this. The previous call to // NavigationURLLoader::Start() could cause the destruction of the @@ -5418,6 +5431,7 @@ void NavigationRequest::WillStartRequest() { EnterChildTraceEvent("WillStartRequest", this); DCHECK_EQ(state_, WILL_START_REQUEST); + will_start_request_time_ = base::TimeTicks::Now(); if (IsSelfReferentialURL()) { SetState(CANCELING);
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h index e64960d5..2b4a0718 100644 --- a/content/browser/renderer_host/navigation_request.h +++ b/content/browser/renderer_host/navigation_request.h
@@ -1672,6 +1672,9 @@ // The time this navigation was ready to commit. base::TimeTicks ready_to_commit_time_; + // The time WillStartRequest() was called. + base::TimeTicks will_start_request_time_; + // Set in ReadyToCommitNavigation. bool is_same_process_ = true;
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.cc b/content/browser/renderer_host/page_lifecycle_state_manager.cc index 2d39aed..0e6cfa6 100644 --- a/content/browser/renderer_host/page_lifecycle_state_manager.cc +++ b/content/browser/renderer_host/page_lifecycle_state_manager.cc
@@ -205,6 +205,25 @@ if (test_delegate_) test_delegate_->OnUpdateSentToRenderer(*last_state_sent_to_renderer_); + // TODO(https://crbug.com/1234634): Remove this. + // We record the time that we sent it so that we can measure how long the ack + // has been outstanding later. + if (new_state->should_dispatch_pageshow_for_debugging) { + // We could send a second one of these before before + // receiving the first ack. This would require something more complicated to + // handle perfectly but it should be rare or even impossible, so instead we + // just record that it happened and clear the timestamp without setting a + // new one + if (outstanding_ack_count_bug_1234634_ > 0) { + outstanding_ack_timestamp_bug_1234634_.reset(); + blink::RecordUMAEventPageShowPersisted( + blink::EventPageShowPersisted::kYesInBrowserPendingAck); + } else { + outstanding_ack_timestamp_bug_1234634_ = base::Time::Now(); + } + outstanding_ack_count_bug_1234634_++; + } + render_view_host_impl_->GetAssociatedPageBroadcast()->SetPageLifecycleState( std::move(state), std::move(page_restore_params), base::BindOnce(&PageLifecycleStateManager::OnPageLifecycleChangedAck, @@ -239,9 +258,12 @@ base::OnceClosure done_cb) { blink::mojom::PageLifecycleStatePtr old_state = std::move(last_acknowledged_state_); + // TODO(https://crbug.com/1234634): Remove this. if (acknowledged_state->should_dispatch_pageshow_for_debugging) { blink::RecordUMAEventPageShowPersisted( blink::EventPageShowPersisted::kYesInBrowserAck); + outstanding_ack_count_bug_1234634_--; + outstanding_ack_timestamp_bug_1234634_.reset(); } last_acknowledged_state_ = std::move(acknowledged_state);
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.h b/content/browser/renderer_host/page_lifecycle_state_manager.h index a0f26db8..1df284d 100644 --- a/content/browser/renderer_host/page_lifecycle_state_manager.h +++ b/content/browser/renderer_host/page_lifecycle_state_manager.h
@@ -8,6 +8,7 @@ #include "base/callback_forward.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "base/time/time.h" #include "base/timer/timer.h" #include "content/common/content_export.h" #include "content/public/common/page_visibility_state.h" @@ -86,6 +87,11 @@ void SetDelegateForTesting(TestDelegate* test_delegate_); + // TODO(https://crbug.com/1234634): Remove this. + absl::optional<base::Time> outstanding_ack_timestamp_bug_1234634() { + return outstanding_ack_timestamp_bug_1234634_; + } + private: // Send mojo message to renderer if the effective (page) lifecycle state has // changed. @@ -135,6 +141,15 @@ base::OneShotTimer back_forward_cache_timeout_monitor_; raw_ptr<TestDelegate> test_delegate_{nullptr}; + + // TODO(https://crbug.com/1234634): Remove this. + // We set this when we send an updated state that should result in a pageshow + // with persisted=true and clear it when we receive an ack for that. + absl::optional<base::Time> outstanding_ack_timestamp_bug_1234634_; + // Incremented when we send an updated state that should result in a pageshow, + // decremented when we receive an ack for that. + int outstanding_ack_count_bug_1234634_; + // NOTE: This must be the last member. base::WeakPtrFactory<PageLifecycleStateManager> weak_ptr_factory_{this}; };
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 2d918fcf..26e68b5c 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -721,6 +721,23 @@ void RenderViewHostImpl::RenderProcessExited( RenderProcessHost* host, const ChildProcessTerminationInfo& info) { + // TODO(https://crbug.com/1234634): Remove this. + // If the renderer has exited while we were are still waiting for a ack, + // then log information about the exit. + if (page_lifecycle_state_manager_->outstanding_ack_timestamp_bug_1234634() + .has_value()) { + base::TimeDelta delta = + base::Time::Now() - + page_lifecycle_state_manager_->outstanding_ack_timestamp_bug_1234634() + .value(); + UMA_HISTOGRAM_MEDIUM_TIMES("Event.PageShow.Persisted.Unacked.Time", delta); + // We don't record this as an enum because the enum is platform dependent. + // Since this is temporary debugging, 20 seems a safe upper limit for the + // number of elements. + UMA_HISTOGRAM_EXACT_LINEAR("Event.PageShow.Persisted.Unacked.Status", + static_cast<int>(info.status), 20); + } + renderer_view_created_ = false; GetWidget()->RendererExited(); delegate_->RenderViewTerminated(this, info.status, info.exit_code);
diff --git a/content/browser/utility_process_host_browsertest.cc b/content/browser/utility_process_host_browsertest.cc index d781ee5..085e49a 100644 --- a/content/browser/utility_process_host_browsertest.cc +++ b/content/browser/utility_process_host_browsertest.cc
@@ -142,9 +142,7 @@ } #if defined(OS_WIN) -// Times out. crbug.com/927298. -IN_PROC_BROWSER_TEST_F(UtilityProcessHostBrowserTest, - DISABLED_LaunchElevatedProcess) { +IN_PROC_BROWSER_TEST_F(UtilityProcessHostBrowserTest, LaunchElevatedProcess) { RunUtilityProcess(true, false); }
diff --git a/content/browser/web_contents/DEPS b/content/browser/web_contents/DEPS index 533dfe3e..0a7076fd 100644 --- a/content/browser/web_contents/DEPS +++ b/content/browser/web_contents/DEPS
@@ -3,4 +3,8 @@ "+components/remote_cocoa", "+content/app_shim_remote_cocoa", ], + "web_contents_view_aura_unittest.cc": [ + "+ui/ozone/buildflags.h", + "+ui/ozone/public/ozone_platform.h", + ], }
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index a31bda2..a3ff7b5 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -8640,16 +8640,6 @@ &WebContentsObserver::MediaEffectivelyFullscreenChanged, is_fullscreen); } -void WebContentsImpl::MediaBufferUnderflow(const MediaPlayerId& id) { - OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::MediaBufferUnderflow"); - observers_.NotifyObservers(&WebContentsObserver::MediaBufferUnderflow, id); -} - -void WebContentsImpl::MediaPlayerSeek(const MediaPlayerId& id) { - OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::MediaPlayerSeek"); - observers_.NotifyObservers(&WebContentsObserver::MediaPlayerSeek, id); -} - void WebContentsImpl::MediaDestroyed(const MediaPlayerId& id) { OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::MediaDestroyed"); observers_.NotifyObservers(&WebContentsObserver::MediaDestroyed, id); @@ -9224,7 +9214,8 @@ if (frame_tree_node_id != FrameTreeNode::kFrameTreeNodeInvalidId) { return std::make_unique<PrerenderHandleImpl>( - GetPrerenderHostRegistry()->GetWeakPtr(), frame_tree_node_id); + GetPrerenderHostRegistry()->GetWeakPtr(), frame_tree_node_id, + prerendering_url); } return nullptr; }
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index b0aee6a..e8a5b045 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -1140,7 +1140,7 @@ web_contents_->GetBrowserContext()->IsOffTheRecord() ? nullptr : std::make_unique<ui::DataTransferEndpoint>( - web_contents_->GetFocusedFrame()->GetLastCommittedOrigin())); + web_contents_->GetMainFrame()->GetLastCommittedOrigin())); if (!image.isNull()) data->provider().SetDragImage(image, image_offset); @@ -1455,7 +1455,7 @@ auto* focused_frame = web_contents_->GetFocusedFrame(); if (focused_frame && !web_contents_->GetBrowserContext()->IsOffTheRecord()) { drag_info.data_endpoint = ui::DataTransferEndpoint( - web_contents_->GetFocusedFrame()->GetLastCommittedOrigin()); + web_contents_->GetMainFrame()->GetLastCommittedOrigin()); } std::unique_ptr<DropData> drop_data = std::make_unique<DropData>();
diff --git a/content/browser/web_contents/web_contents_view_aura.h b/content/browser/web_contents/web_contents_view_aura.h index 6d82fe1..08a38d8f 100644 --- a/content/browser/web_contents/web_contents_view_aura.h +++ b/content/browser/web_contents/web_contents_view_aura.h
@@ -101,6 +101,7 @@ FRIEND_TEST_ALL_PREFIXES(WebContentsViewAuraTest, DragDropFiles); FRIEND_TEST_ALL_PREFIXES(WebContentsViewAuraTest, DragDropFilesOriginateFromRenderer); + FRIEND_TEST_ALL_PREFIXES(WebContentsViewAuraTest, DragDropImageFromRenderer); FRIEND_TEST_ALL_PREFIXES(WebContentsViewAuraTest, DragDropVirtualFiles); FRIEND_TEST_ALL_PREFIXES(WebContentsViewAuraTest, DragDropVirtualFilesOriginateFromRenderer);
diff --git a/content/browser/web_contents/web_contents_view_aura_unittest.cc b/content/browser/web_contents/web_contents_view_aura_unittest.cc index 618b429..308f1a5 100644 --- a/content/browser/web_contents/web_contents_view_aura_unittest.cc +++ b/content/browser/web_contents/web_contents_view_aura_unittest.cc
@@ -39,6 +39,17 @@ #include "ui/base/dragdrop/os_exchange_data_provider_win.h" #endif +#if defined(OS_LINUX) +#include "ui/ozone/buildflags.h" +#if BUILDFLAG(OZONE_PLATFORM_X11) +#include "ui/base/x/selection_utils.h" +#include "ui/base/x/x11_os_exchange_data_provider.h" +#include "ui/gfx/x/x11_atom_cache.h" +#include "ui/gfx/x/xproto_util.h" +#include "ui/ozone/public/ozone_platform.h" +#endif // BUILDFLAG(OZONE_PLATFORM_X11) +#endif // defined(OS_LINUX) + namespace content { namespace { @@ -407,6 +418,91 @@ ASSERT_TRUE(drop_complete_data_->drop_data.filenames.empty()); #endif } + +TEST_F(WebContentsViewAuraTest, DragDropImageFromRenderer) { + WebContentsViewAura* view = GetView(); + + const base::FilePath filename(FILE_PATH_LITERAL("image.jpg")); + const GURL source_url("file:///image.jpg"); + const std::string file_contents = "contents"; + const std::string url_spec = "http://example.com/image.jpg"; + const GURL url(url_spec); + const std::u16string url_title = u""; + const std::u16string html = u"<img src='http://example.com/image.jpg'>"; + + auto data = std::make_unique<ui::OSExchangeData>(); + +#if defined(OS_LINUX) +#if BUILDFLAG(OZONE_PLATFORM_X11) + // FileContents drag-drop in X relies on XDragDropClient::InitDrag() setting + // window property 'XdndDirectSave0' to filename. Since XDragDropClient is not + // created in this unittest, we will set this property manually to allow + // XOSExchangeDataProvider::GetFileContents() to succeed. + if (ui::OzonePlatform::GetPlatformNameForTest() == "x11") { + x11::Window xwindow = x11::CreateDummyWindow("Test Window"); + x11::SetStringProperty(xwindow, x11::GetAtom("XdndDirectSave0"), + x11::GetAtom("text/plain"), "image.jpg"); + data = std::make_unique<ui::OSExchangeData>( + std::make_unique<ui::XOSExchangeDataProvider>( + xwindow, xwindow, ui::SelectionFormatMap())); + } +#endif // BUILDFLAG(OZONE_PLATFORM_X11) +#endif // defined(OS_LINUX) + + // As per WebContentsViewAura::PrepareDragData(), we must call + // SetFileContents() before SetURL() to get the expected contents since + // SetURL() creates a synthesized <filename>.url shortcut. + data->SetFileContents(filename, file_contents); + data->SetURL(url, url_title); + data->SetHtml(html, GURL()); + data->MarkOriginatedFromRenderer(); + + ui::DropTargetEvent event(*data.get(), kClientPt, kScreenPt, + ui::DragDropTypes::DRAG_COPY); + + // Simulate drag enter. + EXPECT_EQ(nullptr, view->current_drop_data_); + view->OnDragEntered(event); + ASSERT_NE(nullptr, view->current_drop_data_); + + EXPECT_EQ(base::ASCIIToUTF16(url_spec), *view->current_drop_data_->text); + EXPECT_EQ(url_spec, view->current_drop_data_->url); + EXPECT_EQ(url_title, view->current_drop_data_->url_title); + EXPECT_TRUE(view->current_drop_data_->filenames.empty()); + EXPECT_EQ(file_contents, view->current_drop_data_->file_contents); + EXPECT_TRUE(view->current_drop_data_->file_contents_image_accessible); + EXPECT_EQ(source_url, view->current_drop_data_->file_contents_source_url); + EXPECT_EQ(FILE_PATH_LITERAL("jpg"), + view->current_drop_data_->file_contents_filename_extension); + EXPECT_EQ("", view->current_drop_data_->file_contents_content_disposition); + + // Simulate drop. + auto callback = base::BindOnce(&WebContentsViewAuraTest::OnDropComplete, + base::Unretained(this)); + view->RegisterDropCallbackForTesting(std::move(callback)); + + base::RunLoop run_loop; + async_drop_closure_ = run_loop.QuitClosure(); + + view->OnPerformDrop(event, std::move(data)); + run_loop.Run(); + + CheckDropData(view); + + EXPECT_EQ(base::ASCIIToUTF16(url_spec), drop_complete_data_->drop_data.text); + EXPECT_EQ(url_spec, drop_complete_data_->drop_data.url); + EXPECT_EQ(url_title, drop_complete_data_->drop_data.url_title); + EXPECT_TRUE(drop_complete_data_->drop_data.filenames.empty()); + EXPECT_EQ(file_contents, drop_complete_data_->drop_data.file_contents); + EXPECT_TRUE(drop_complete_data_->drop_data.file_contents_image_accessible); + EXPECT_EQ(source_url, + drop_complete_data_->drop_data.file_contents_source_url); + EXPECT_EQ(FILE_PATH_LITERAL("jpg"), + drop_complete_data_->drop_data.file_contents_filename_extension); + EXPECT_EQ("", + drop_complete_data_->drop_data.file_contents_content_disposition); +} + #endif #if defined(OS_WIN) @@ -548,6 +644,7 @@ TEST_F(WebContentsViewAuraTest, DragDropUrlData) { WebContentsViewAura* view = GetView(); auto data = std::make_unique<ui::OSExchangeData>(); + data->MarkOriginatedFromRenderer(); const std::string url_spec = "https://www.wikipedia.org/"; const GURL url(url_spec); @@ -573,7 +670,11 @@ EXPECT_EQ(url_title, view->current_drop_data_->url_title); // Virtual files should not have been retrieved if url data present. - ASSERT_TRUE(view->current_drop_data_->filenames.empty()); + EXPECT_TRUE(view->current_drop_data_->filenames.empty()); + // Shortcut *.url file contents created by SetURL() should be ignored + // (https://crbug.com/1274395). + EXPECT_TRUE(view->current_drop_data_->file_contents_source_url.is_empty()); + EXPECT_TRUE(view->current_drop_data_->file_contents.empty()); // Simulate drop (completes asynchronously since virtual file data is // present). @@ -593,7 +694,10 @@ EXPECT_EQ(url_title, drop_complete_data_->drop_data.url_title); // Virtual files should not have been retrieved if url data present. - ASSERT_TRUE(drop_complete_data_->drop_data.filenames.empty()); + EXPECT_TRUE(drop_complete_data_->drop_data.filenames.empty()); + EXPECT_TRUE( + drop_complete_data_->drop_data.file_contents_source_url.is_empty()); + EXPECT_TRUE(drop_complete_data_->drop_data.file_contents.empty()); } #endif
diff --git a/content/browser/web_package/signed_exchange_prologue.cc b/content/browser/web_package/signed_exchange_prologue.cc index 9dfb4ac..a1f99eb 100644 --- a/content/browser/web_package/signed_exchange_prologue.cc +++ b/content/browser/web_package/signed_exchange_prologue.cc
@@ -30,7 +30,7 @@ namespace signed_exchange_prologue { -constexpr size_t BeforeFallbackUrl::kEncodedSizeInBytes = +const size_t BeforeFallbackUrl::kEncodedSizeInBytes = sizeof(kSignedExchangeMagic) + kFallbackUrlLengthFieldSizeInBytes; size_t Parse2BytesEncodedLength(base::span<const uint8_t> input) {
diff --git a/content/browser/web_package/web_bundle_browsertest_base.cc b/content/browser/web_package/web_bundle_browsertest_base.cc index 5d98ad7..7df52012 100644 --- a/content/browser/web_package/web_bundle_browsertest_base.cc +++ b/content/browser/web_package/web_bundle_browsertest_base.cc
@@ -10,6 +10,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" #include "base/threading/thread_restrictions.h" +#include "build/build_config.h" #include "content/browser/renderer_host/navigation_request.h" #include "content/public/common/content_client.h" #include "content/public/test/back_forward_cache_util.h"
diff --git a/content/browser/web_package/web_bundle_network_browsertest.cc b/content/browser/web_package/web_bundle_network_browsertest.cc index 65c6565..cc4d7d5 100644 --- a/content/browser/web_package/web_bundle_network_browsertest.cc +++ b/content/browser/web_package/web_bundle_network_browsertest.cc
@@ -4,6 +4,7 @@ #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" +#include "build/build_config.h" #include "content/browser/web_package/web_bundle_browsertest_base.h" #include "content/public/test/back_forward_cache_util.h" #include "content/public/test/browser_test.h"
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/OWebContentsAccessibility.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/OWebContentsAccessibility.java index b9ee681..f843b5d 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/OWebContentsAccessibility.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/OWebContentsAccessibility.java
@@ -48,7 +48,9 @@ @Override public void clearNodeInfoCacheForGivenId(int virtualViewId) { - mImageDataRequestedNodes.remove(virtualViewId); + if (mImageDataRequestedNodes != null) { + mImageDataRequestedNodes.remove(virtualViewId); + } super.clearNodeInfoCacheForGivenId(virtualViewId); }
diff --git a/content/public/browser/download_item_utils.h b/content/public/browser/download_item_utils.h index 759e5a3d..fea65e78 100644 --- a/content/public/browser/download_item_utils.h +++ b/content/public/browser/download_item_utils.h
@@ -6,6 +6,7 @@ #define CONTENT_PUBLIC_BROWSER_DOWNLOAD_ITEM_UTILS_H_ #include "content/common/content_export.h" +#include "content/public/browser/global_routing_id.h" namespace download { class DownloadItem; @@ -15,6 +16,7 @@ class BrowserContext; class WebContents; +class RenderFrameHost; // Helper class to attach WebContents and BrowserContext to a DownloadItem. class CONTENT_EXPORT DownloadItemUtils { @@ -27,9 +29,20 @@ static WebContents* GetWebContents( const download::DownloadItem* downloadItem); + // Helper method to get the RenderFrameHost from a DownloadItem. + static RenderFrameHost* GetRenderFrameHost( + const download::DownloadItem* downloadItem); + // Attach information to a DownloadItem. static void AttachInfo(download::DownloadItem* downloadItem, BrowserContext* browser_context, + WebContents* web_contents, + GlobalRenderFrameHostId id); + + // Attach information to a DownloadItem. + // TODO(crbug.com/1278041): This method is test only and should be renamed. + static void AttachInfo(download::DownloadItem* downloadItem, + BrowserContext* browser_context, WebContents* web_contents); };
diff --git a/content/public/browser/prerender_handle.h b/content/public/browser/prerender_handle.h index 0487b84..ef1e2e8 100644 --- a/content/public/browser/prerender_handle.h +++ b/content/public/browser/prerender_handle.h
@@ -13,6 +13,9 @@ public: PrerenderHandle() = default; virtual ~PrerenderHandle() = default; + // Returns the initial URL that is passed to PrerenderHostRegistry for + // starting a prerendering page. + virtual GURL GetInitialPrerenderingUrl() = 0; }; } // namespace content
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h index 90d3a7d4..fe2f663 100644 --- a/content/public/browser/web_contents_observer.h +++ b/content/public/browser/web_contents_observer.h
@@ -711,8 +711,6 @@ virtual void MediaEffectivelyFullscreenChanged(bool is_fullscreen) {} virtual void MediaPictureInPictureChanged(bool is_picture_in_picture) {} virtual void MediaMutedStatusChanged(const MediaPlayerId& id, bool muted) {} - virtual void MediaBufferUnderflow(const MediaPlayerId& id) {} - virtual void MediaPlayerSeek(const MediaPlayerId& id) {} virtual void MediaDestroyed(const MediaPlayerId& id) {} // Invoked when the renderer process changes the page scale factor.
diff --git a/content/public/common/url_utils.cc b/content/public/common/url_utils.cc index 7a275487..2aecef60 100644 --- a/content/public/common/url_utils.cc +++ b/content/public/common/url_utils.cc
@@ -11,6 +11,7 @@ #include "base/containers/fixed_flat_set.h" #include "base/feature_list.h" #include "base/strings/string_piece.h" +#include "build/build_config.h" #include "content/common/url_schemes.h" #include "content/public/common/content_features.h" #include "content/public/common/url_constants.h"
diff --git a/content/public/renderer/video_encode_accelerator.cc b/content/public/renderer/video_encode_accelerator.cc index 9d99c7e..6355362a6 100644 --- a/content/public/renderer/video_encode_accelerator.cc +++ b/content/public/renderer/video_encode_accelerator.cc
@@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/task/task_runner_util.h" +#include "build/build_config.h" #include "content/renderer/render_thread_impl.h" #include "media/video/gpu_video_accelerator_factories.h"
diff --git a/content/public/test/content_browser_test_utils.h b/content/public/test/content_browser_test_utils.h index b3cf617..ad8accf9 100644 --- a/content/public/test/content_browser_test_utils.h +++ b/content/public/test/content_browser_test_utils.h
@@ -12,6 +12,7 @@ #include "base/compiler_specific.h" #include "base/memory/raw_ptr.h" #include "base/run_loop.h" +#include "build/build_config.h" #include "content/public/common/page_type.h" #include "ui/gfx/native_widget_types.h" #include "url/gurl.h"
diff --git a/content/public/test/mock_web_contents_observer.h b/content/public/test/mock_web_contents_observer.h index 53f17ed..724c8916 100644 --- a/content/public/test/mock_web_contents_observer.h +++ b/content/public/test/mock_web_contents_observer.h
@@ -310,11 +310,6 @@ MediaMutedStatusChanged, (const MediaPlayerId& id, bool muted), (override)); - MOCK_METHOD(void, - MediaBufferUnderflow, - (const MediaPlayerId& id), - (override)); - MOCK_METHOD(void, MediaPlayerSeek, (const MediaPlayerId& id), (override)); MOCK_METHOD(void, MediaDestroyed, (const MediaPlayerId& id), (override)); MOCK_METHOD(void, OnPageScaleFactorChanged,
diff --git a/content/public/test/scoped_page_focus_override.cc b/content/public/test/scoped_page_focus_override.cc index 0585642..9e83888 100644 --- a/content/public/test/scoped_page_focus_override.cc +++ b/content/public/test/scoped_page_focus_override.cc
@@ -50,12 +50,12 @@ void ScopedPageFocusOverride::AgentHostClosed(DevToolsAgentHost* agent_host) {} void ScopedPageFocusOverride::SetFocusEmulationEnabled(bool enabled) { - base::DictionaryValue command; - command.SetInteger("id", ++last_sent_id_); - command.SetString("method", "Emulation.setFocusEmulationEnabled"); - auto params = std::make_unique<base::DictionaryValue>(); - params->SetBoolean("enabled", enabled); - command.SetDictionary("params", std::move(params)); + base::Value command(base::Value::Type::DICTIONARY); + command.SetIntKey("id", ++last_sent_id_); + command.SetStringKey("method", "Emulation.setFocusEmulationEnabled"); + base::Value params(base::Value::Type::DICTIONARY); + params.SetBoolKey("enabled", enabled); + command.SetKey("params", std::move(params)); std::string json_command; base::JSONWriter::Write(command, &json_command);
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.cc b/content/renderer/pepper/ppb_graphics_3d_impl.cc index 9d717a2..a90d2dc5 100644 --- a/content/renderer/pepper/ppb_graphics_3d_impl.cc +++ b/content/renderer/pepper/ppb_graphics_3d_impl.cc
@@ -12,6 +12,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" +#include "build/build_config.h" #include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/gpu_stream_constants.h"
diff --git a/content/shell/browser/shell_devtools_bindings.cc b/content/shell/browser/shell_devtools_bindings.cc index ceaf609f..96d0dd16 100644 --- a/content/shell/browser/shell_devtools_bindings.cc +++ b/content/shell/browser/shell_devtools_bindings.cc
@@ -59,10 +59,10 @@ return instance.get(); } -base::DictionaryValue BuildObjectForResponse(const net::HttpResponseHeaders* rh, - bool success, - int net_error) { - base::DictionaryValue response = base::DictionaryValue(); +base::Value BuildObjectForResponse(const net::HttpResponseHeaders* rh, + bool success, + int net_error) { + base::Value response(base::Value::Type::DICTIONARY); int responseCode = 200; if (rh) { responseCode = rh->response_code(); @@ -70,18 +70,18 @@ // In case of no headers, assume file:// URL and failed to load responseCode = 404; } - response.SetInteger("statusCode", responseCode); - response.SetInteger("netError", net_error); - response.SetString("netErrorName", net::ErrorToString(net_error)); + response.SetIntKey("statusCode", responseCode); + response.SetIntKey("netError", net_error); + response.SetStringKey("netErrorName", net::ErrorToString(net_error)); - base::DictionaryValue headers; + base::Value headers(base::Value::Type::DICTIONARY); size_t iterator = 0; std::string name; std::string value; // TODO(caseq): this probably needs to handle duplicate header names // correctly by folding them. while (rh && rh->EnumerateHeaderLines(&iterator, &name, &value)) - headers.SetString(name, value); + headers.SetStringKey(name, value); response.SetKey("headers", std::move(headers)); return response; @@ -300,9 +300,9 @@ GURL gurl(*url); if (!gurl.is_valid()) { - base::DictionaryValue response; - response.SetInteger("statusCode", 404); - response.SetBoolean("urlValid", false); + base::Value response(base::Value::Type::DICTIONARY); + response.SetIntKey("statusCode", 404); + response.SetBoolKey("urlValid", false); SendMessageAck(request_id, std::move(response)); return; }
diff --git a/content/shell/browser/shell_devtools_bindings.h b/content/shell/browser/shell_devtools_bindings.h index 9a06d1d6..fbcd267 100644 --- a/content/shell/browser/shell_devtools_bindings.h +++ b/content/shell/browser/shell_devtools_bindings.h
@@ -15,6 +15,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/values.h" +#include "build/build_config.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_frontend_host.h" #include "content/public/browser/web_contents_observer.h"
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 8526e44..fe116f5 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -2794,6 +2794,12 @@ if (use_ozone) { deps += [ "//ui/ozone" ] + if (ozone_platform_x11) { + deps += [ + "//ui/base/x", + "//ui/gfx/x", + ] + } } if (is_mac) {
diff --git a/content/test/data/accessibility/aria/aria-required-expected-mac.txt b/content/test/data/accessibility/aria/aria-required-expected-mac.txt index 289ae59..b68056c 100644 --- a/content/test/data/accessibility/aria/aria-required-expected-mac.txt +++ b/content/test/data/accessibility/aria/aria-required-expected-mac.txt
@@ -1,4 +1,4 @@ -AXWebArea AXRequired=0 -++AXRadioGroup -++++AXRadioButton AXValue=0 -++++AXRadioButton AXValue=0 +AXWebArea +++AXRadioGroup AXRequired=1 +++++AXRadioButton AXRequired=0 AXValue=0 +++++AXRadioButton AXRequired=0 AXValue=0
diff --git a/content/test/data/accessibility/event/aria-required-changed-expected-mac.txt b/content/test/data/accessibility/event/aria-required-changed-expected-mac.txt index e69de29..8b13789 100644 --- a/content/test/data/accessibility/event/aria-required-changed-expected-mac.txt +++ b/content/test/data/accessibility/event/aria-required-changed-expected-mac.txt
@@ -0,0 +1 @@ +
diff --git a/content/test/data/accessibility/mac/attributes/ax-required-expected.txt b/content/test/data/accessibility/mac/attributes/ax-required-expected.txt index 8bb3a0f..ee4239dd 100644 --- a/content/test/data/accessibility/mac/attributes/ax-required-expected.txt +++ b/content/test/data/accessibility/mac/attributes/ax-required-expected.txt
@@ -3,8 +3,8 @@ input_aria_required.AXRequired=0 input_aria_required_true.AXRequired=1 input_aria_required_false.AXRequired=0 -combobox.AXRequired=n/a -combobox_aria_required_true.AXRequired=n/a -combobox_aria_required_false.AXRequired=n/a +combobox.AXRequired=0 +combobox_aria_required_true.AXRequired=1 +combobox_aria_required_false.AXRequired=0 not_applicable.AXRequired=n/a not_applicable_aria.AXRequired=n/a
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt index d43080f..bf1ffbe 100644 --- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -207,6 +207,11 @@ # Cannot generate correct rendering results on windows. crbug.com/1238570 [ win ] TraceTest_WebGPUImportVideoFrame [ Failure ] +# New flakes seen on Nexus 5X bot. +crbug.com/1278028 [ android android-nexus-5x ] TraceTest_Video_MP4_FourColors_Rot_180 [ RetryOnFailure ] +crbug.com/1278028 [ android android-nexus-5x ] TraceTest_Video_VP9 [ RetryOnFailure ] +crbug.com/1278028 [ android android-nexus-5x ] TraceTest_Video_VP9_DXVA [ RetryOnFailure ] + ####################################################################### # Automated Entries After This Point - Do Not Manually Add Below Here # #######################################################################
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 d3ca98a..d62536c7 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
@@ -637,6 +637,7 @@ crbug.com/654187 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_30.html [ Failure ] crbug.com/654187 [ mac nvidia-0xfe9 no-passthrough ] deqp/functional/gles3/framebufferblit/conversion_31.html [ Failure ] crbug.com/654187 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_33.html [ Failure ] +crbug.com/772651 [ mac nvidia ] conformance/glsl/bugs/vector-scalar-arithmetic-inside-loop-complex.html [ Failure ] crbug.com/795052 [ mac nvidia-0xfe9 ] conformance2/uniforms/draw-with-uniform-blocks.html [ Failure ] crbug.com/929398 [ mac nvidia-0xfe9 no-passthrough ] conformance2/glsl3/tricky-loop-conditions.html [ Failure ] crbug.com/756537 [ mac nvidia ] deqp/functional/gles3/shaderoperator/* [ Failure ] @@ -656,8 +657,7 @@ crbug.com/1199098 [ mac nvidia-0xfe9 no-passthrough ] deqp/functional/gles3/shadermatrix/mul_dynamic_mediump.html [ RetryOnFailure ] crbug.com/1199098 [ mac nvidia-0xfe9 no-passthrough ] deqp/functional/gles3/shadermatrix/sub_const.html [ RetryOnFailure ] crbug.com/1199098 [ mac nvidia-0xfe9 no-passthrough ] deqp/functional/gles3/shadermatrix/sub_dynamic.html [ RetryOnFailure ] - -crbug.com/772651 [ mac nvidia ] conformance/glsl/bugs/vector-scalar-arithmetic-inside-loop-complex.html [ Failure ] +crbug.com/1276186 [ mac nvidia-0xfe9 no-passthrough ] conformance/textures/misc/format-filterable-renderable.html [ Failure ] # Mac AMD # AMD Radeon HD 8870M (1002:6821) @@ -866,6 +866,7 @@ crbug.com/1027605 [ mac amd-0x679e no-passthrough ] deqp/functional/gles3/transformfeedback/random_separate_triangles.html [ Failure ] crbug.com/1217713 [ mac amd-0x679e no-passthrough ] deqp/functional/gles3/shaderindexing/mat_00.html [ Failure ] crbug.com/1217713 [ mac amd-0x679e no-passthrough ] deqp/functional/gles3/shaderindexing/mat_02.html [ Failure ] +crbug.com/1276186 [ mac amd-0x679e no-passthrough ] conformance/rendering/clear-default-framebuffer-with-scissor-test.html [ Failure ] # Mac / M1 / OpenGL crbug.com/1130112 [ mac apple-apple-m1 passthrough angle-opengl ] deqp/functional/gles3/texturefiltering/cube_combinations_00.html [ Failure ] @@ -987,6 +988,7 @@ crbug.com/1092734 [ android android-pixel-2 passthrough ] conformance2/textures/webgl_canvas/tex-2d-rgb565-rgb-unsigned_byte.html [ Failure ] crbug.com/1126631 [ android android-pixel-2 passthrough ] conformance2/textures/webgl_canvas/tex-3d-r11f_g11f_b10f-rgb-half_float.html [ RetryOnFailure ] crbug.com/1143323 [ android android-pixel-2 passthrough ] conformance/rendering/draw-arrays-out-of-bounds.html [ Failure ] +crbug.com/1276186 [ android android-pixel-2 ] conformance2/glsl3/array-equality.html [ Failure ] # Failing test in passthrough mode when experiment DrDc is enabled via fieldtrial_testing_config.json. crbug.com/1276552 [ android passthrough ] conformance/canvas/render-after-resize-test.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 308f3c343..b5ea88b 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
@@ -549,6 +549,7 @@ crbug.com/1230781 [ mac amd-0x679e ] conformance/canvas/to-data-url-test.html [ Failure ] crbug.com/1236072 [ mac amd-0x679e angle-opengl ] conformance/renderbuffers/stencil-renderbuffer-initialization.html [ Failure ] crbug.com/1227774 [ mac amd debug-x64 angle-opengl ] conformance/glsl/misc/shader-with-non-reserved-words.html [ Failure ] +crbug.com/1276186 [ mac amd-0x679e angle-opengl ] conformance/rendering/clear-default-framebuffer-with-scissor-test.html [ Failure ] # TODO(kbr): uncomment the following expectation after test has # been made more robust.
diff --git a/content/test/mock_widget_input_handler.h b/content/test/mock_widget_input_handler.h index bef706e..5782048f 100644 --- a/content/test/mock_widget_input_handler.h +++ b/content/test/mock_widget_input_handler.h
@@ -10,6 +10,7 @@ #include <memory> #include <utility> +#include "build/build_config.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/input/input_handler.mojom.h"
diff --git a/device/bluetooth/bluetooth_adapter.cc b/device/bluetooth/bluetooth_adapter.cc index ddde285..9c794c9 100644 --- a/device/bluetooth/bluetooth_adapter.cc +++ b/device/bluetooth/bluetooth_adapter.cc
@@ -674,6 +674,6 @@ } // static -constexpr base::TimeDelta BluetoothAdapter::timeoutSec = base::Seconds(180); +const base::TimeDelta BluetoothAdapter::timeoutSec = base::Seconds(180); } // namespace device
diff --git a/device/bluetooth/floss/floss_adapter_client.cc b/device/bluetooth/floss/floss_adapter_client.cc index 500b4c7b..c254d23 100644 --- a/device/bluetooth/floss/floss_adapter_client.cc +++ b/device/bluetooth/floss/floss_adapter_client.cc
@@ -117,7 +117,7 @@ dbus::MethodCall mc_get_address(kAdapterInterface, adapter::kGetAddress); object_proxy->CallMethodWithErrorResponse( - &mc_get_address, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + &mc_get_address, kDBusTimeoutMs, base::BindOnce(&FlossAdapterClient::HandleGetAddress, weak_ptr_factory_.GetWeakPtr())); @@ -178,7 +178,7 @@ writer.AppendObjectPath(dbus::ObjectPath(kExportedCallbacksPath)); object_proxy->CallMethodWithErrorResponse( - ®ister_callback, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + ®ister_callback, kDBusTimeoutMs, base::BindOnce(&FlossAdapterClient::DefaultResponse, weak_ptr_factory_.GetWeakPtr(), adapter::kRegisterCallback)); @@ -190,7 +190,7 @@ writer2.AppendObjectPath(dbus::ObjectPath(kExportedCallbacksPath)); object_proxy->CallMethodWithErrorResponse( - ®ister_connection_callback, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + ®ister_connection_callback, kDBusTimeoutMs, base::BindOnce(&FlossAdapterClient::DefaultResponse, weak_ptr_factory_.GetWeakPtr(), adapter::kRegisterCallback)); @@ -502,7 +502,7 @@ write_data(&writer); object_proxy->CallMethodWithErrorResponse( - &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + &method_call, kDBusTimeoutMs, base::BindOnce(&FlossAdapterClient::DefaultResponseWithCallback<R>, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); }
diff --git a/device/bluetooth/floss/floss_dbus_client.cc b/device/bluetooth/floss/floss_dbus_client.cc index bc037ff5..4996584 100644 --- a/device/bluetooth/floss/floss_dbus_client.cc +++ b/device/bluetooth/floss/floss_dbus_client.cc
@@ -11,6 +11,9 @@ namespace floss { +// All Floss D-Bus methods return immediately, so the timeout can be very short. +int kDBusTimeoutMs = 2000; + namespace { template <typename T>
diff --git a/device/bluetooth/floss/floss_dbus_client.h b/device/bluetooth/floss/floss_dbus_client.h index ca7765d..c8abbcc 100644 --- a/device/bluetooth/floss/floss_dbus_client.h +++ b/device/bluetooth/floss/floss_dbus_client.h
@@ -20,6 +20,8 @@ namespace floss { +extern int kDBusTimeoutMs; + // TODO(b/189499077) - Expose via floss package extern DEVICE_BLUETOOTH_EXPORT const char kAdapterService[]; extern DEVICE_BLUETOOTH_EXPORT const char kAdapterInterface[];
diff --git a/device/bluetooth/floss/floss_dbus_manager.cc b/device/bluetooth/floss/floss_dbus_manager.cc index f13080a..8fc3a5d 100644 --- a/device/bluetooth/floss/floss_dbus_manager.cc +++ b/device/bluetooth/floss/floss_dbus_manager.cc
@@ -52,7 +52,7 @@ GetSystemBus() ->GetObjectProxy(kFlossObjectManagerServiceName, dbus::ObjectPath("/")) ->CallMethodWithErrorCallback( - &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + &method_call, kDBusTimeoutMs, base::BindOnce(&FlossDBusManager::OnObjectManagerSupported, weak_ptr_factory_.GetWeakPtr()), base::BindOnce(&FlossDBusManager::OnObjectManagerNotSupported,
diff --git a/device/bluetooth/floss/floss_manager_client.cc b/device/bluetooth/floss/floss_manager_client.cc index 33d6ae0..56a512bd 100644 --- a/device/bluetooth/floss/floss_manager_client.cc +++ b/device/bluetooth/floss/floss_manager_client.cc
@@ -128,7 +128,7 @@ writer.AppendBool(enabled); object_proxy->CallMethodWithErrorResponse( - &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + &method_call, kDBusTimeoutMs, base::BindOnce(&FlossManagerClient::DefaultResponse, weak_ptr_factory_.GetWeakPtr(), "FlossManagerClient::SetFlossEnabled")); @@ -153,7 +153,7 @@ writer.AppendInt32(adapter); object_proxy->CallMethodWithErrorResponse( - &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + &method_call, kDBusTimeoutMs, base::BindOnce(&FlossManagerClient::DefaultResponseWithCallback<Void>, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -169,7 +169,7 @@ dbus::MethodCall method_call(kManagerInterface, manager::kGetAvailableAdapters); object_proxy->CallMethodWithErrorResponse( - &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + &method_call, kDBusTimeoutMs, base::BindOnce(&FlossManagerClient::HandleGetAvailableAdapters, weak_ptr_factory_.GetWeakPtr())); @@ -180,7 +180,7 @@ writer.AppendObjectPath(dbus::ObjectPath(kExportedCallbacksPath)); object_proxy->CallMethodWithErrorResponse( - ®ister_callback, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + ®ister_callback, kDBusTimeoutMs, base::BindOnce(&FlossManagerClient::DefaultResponse, weak_ptr_factory_.GetWeakPtr(), manager::kRegisterCallback));
diff --git a/docs/updater/installer_api_mac.md b/docs/updater/installer_api_mac.md index dd11458..0e41ed516 100644 --- a/docs/updater/installer_api_mac.md +++ b/docs/updater/installer_api_mac.md
@@ -18,7 +18,8 @@ ## .install Execution Environment ### Command-Line Arguments -The install executables are passed the following arguments, in this order: +For backward compatibility, install executables are passed the following +arguments, in this order: 1. The absolute path to the unpacked update archive (i.e. the parent directory of the install executable.) @@ -26,11 +27,17 @@ 2. The absolute path to the installation of the app, based on its existence-checker value. +3. The version of the app before this update. + +New install executables should instead depend on the environment variables below +rather than the above positional arguments. + ### Environment Variables The install executables are executed in an environment with the following environment variables defined: - `PATH`: '/bin:/usr/bin:/Path/To/ksadmin'. +- `PREVIOUS_VERSION`: The version of the app before this update. - `KS_TICKET_XC_PATH`: The absolute path to the installation of the app, based on its existence-checker value. - `KS_TICKET_AP`: The ap value of the currently-installed version of the app. @@ -38,6 +45,10 @@ - `UPDATE_IS_MACHINE`: An indicator of the updater's scope. - 0 if the updater is per-user. - 1 if the updater is cross-user. +- `SERVER_ARGS`: The arguments sent from the server, if any. Refer to + protocol\_3\_1.md's description of `manifest` response objects. +- `UNPACK_DIR`: The absolute path to the unpacked update archive (i.e. the + parent directory of the install executable.) ## Updating Product Metadata If the install executables succeed, the updater will automatically record the
diff --git a/extensions/browser/api/app_window/app_window_api.cc b/extensions/browser/api/app_window/app_window_api.cc index 3662c67..63175adc 100644 --- a/extensions/browser/api/app_window/app_window_api.cc +++ b/extensions/browser/api/app_window/app_window_api.cc
@@ -203,23 +203,20 @@ existing_window->Show(AppWindow::SHOW_ACTIVE); } - std::unique_ptr<base::DictionaryValue> result( - new base::DictionaryValue); - result->SetInteger("frameId", frame_id); - existing_window->GetSerializedState(result.get()); - result->SetBoolean("existingWindow", true); + base::Value result(base::Value::Type::DICTIONARY); + result.SetIntKey("frameId", frame_id); + existing_window->GetSerializedState(&result); + result.SetBoolKey("existingWindow", true); // We should not return the window until that window is properly // initialized. Hence, adding a callback for window first navigation // completion. if (existing_window->DidFinishFirstNavigation()) - return RespondNow(OneArgument( - base::Value::FromUniquePtrValue(std::move(result)))); + return RespondNow(OneArgument(std::move(result))); - existing_window->AddOnDidFinishFirstNavigationCallback(base::BindOnce( - &AppWindowCreateFunction:: - OnAppWindowFinishedFirstNavigationOrClosed, - this, - OneArgument(base::Value::FromUniquePtrValue(std::move(result))))); + existing_window->AddOnDidFinishFirstNavigationCallback( + base::BindOnce(&AppWindowCreateFunction:: + OnAppWindowFinishedFirstNavigationOrClosed, + this, OneArgument(std::move(result)))); return RespondLater(); } } @@ -418,12 +415,11 @@ if (create_params.creator_process_id == created_frame->GetProcess()->GetID()) frame_id = created_frame->GetRoutingID(); - std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue); - result->SetInteger("frameId", frame_id); - result->SetString("id", app_window->window_key()); - app_window->GetSerializedState(result.get()); - ResponseValue result_arg = - OneArgument(base::Value::FromUniquePtrValue(std::move(result))); + base::Value result(base::Value::Type::DICTIONARY); + result.SetIntKey("frameId", frame_id); + result.SetStringKey("id", app_window->window_key()); + app_window->GetSerializedState(&result); + ResponseValue result_arg = OneArgument(std::move(result)); if (AppWindowRegistry::Get(browser_context()) ->HadDevToolsAttached(app_window->web_contents())) {
diff --git a/extensions/browser/extension_navigation_throttle.cc b/extensions/browser/extension_navigation_throttle.cc index 9ab13b0..5790eac 100644 --- a/extensions/browser/extension_navigation_throttle.cc +++ b/extensions/browser/extension_navigation_throttle.cc
@@ -145,6 +145,11 @@ } } + // Some checks below will need to know whether this navigation is in a + // <webview> guest. + guest_view::GuestViewBase* guest = + guest_view::GuestViewBase::FromWebContents(web_contents); + // Is this navigation targeting an extension resource? ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context); const GURL& url = navigation_handle()->GetURL(); @@ -161,8 +166,19 @@ target_extension = registry->enabled_extensions().GetByID(target_origin.host()); } else { - // If the navigation is not to a chrome-extension resource, no need to - // perform any more checks; it's outside of the purview of this throttle. + // If this navigation is in a guest, check if the URL maps to the Chrome + // Web Store hosted app. If so, block the navigation to avoid a renderer + // kill later, see https://crbug.com/1197674. + if (guest) { + const Extension* hosted_app = + registry->enabled_extensions().GetHostedAppByURL(url); + if (hosted_app && hosted_app->id() == kWebStoreAppId) + return content::NavigationThrottle::BLOCK_REQUEST; + } + + // Otherwise, the navigation is not to a chrome-extension resource, and + // there is no need to perform any more checks; it's outside of the purview + // of this throttle. return content::NavigationThrottle::PROCEED; } @@ -212,8 +228,6 @@ } } - guest_view::GuestViewBase* guest = - guest_view::GuestViewBase::FromWebContents(web_contents); if (url_has_extension_scheme && guest) { // Check whether the guest is allowed to load the extension URL. This is // usually allowed only for the guest's owner extension resources, and only
diff --git a/extensions/shell/browser/shell_nacl_browser_delegate.cc b/extensions/shell/browser/shell_nacl_browser_delegate.cc index 5416340..204741bc 100644 --- a/extensions/shell/browser/shell_nacl_browser_delegate.cc +++ b/extensions/shell/browser/shell_nacl_browser_delegate.cc
@@ -154,10 +154,4 @@ base::Owned(std::move(extensions))); } -bool ShellNaClBrowserDelegate::IsNonSfiModeAllowed( - const base::FilePath& profile_directory, - const GURL& manifest_url) { - return false; -} - } // namespace extensions
diff --git a/extensions/shell/browser/shell_nacl_browser_delegate.h b/extensions/shell/browser/shell_nacl_browser_delegate.h index 4d6712d..d285639 100644 --- a/extensions/shell/browser/shell_nacl_browser_delegate.h +++ b/extensions/shell/browser/shell_nacl_browser_delegate.h
@@ -42,8 +42,6 @@ const base::FilePath& profile_directory) override; void SetDebugPatterns(const std::string& debug_patterns) override; bool URLMatchesDebugPatterns(const GURL& manifest_url) override; - bool IsNonSfiModeAllowed(const base::FilePath& profile_directory, - const GURL& manifest_url) override; private: content::BrowserContext* browser_context_; // Not owned.
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 94376b9..2c1c7b8c 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -68,10 +68,6 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -140,10 +136,6 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -223,10 +215,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -310,10 +298,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -397,10 +381,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -484,10 +464,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -571,10 +547,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -658,10 +630,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -738,10 +706,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -828,10 +792,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -915,10 +875,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1005,10 +961,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1095,10 +1047,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1185,10 +1133,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1275,10 +1219,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1365,10 +1305,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1455,10 +1391,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1545,10 +1477,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1635,10 +1563,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1725,10 +1649,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1815,10 +1735,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1905,10 +1821,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -1995,10 +1907,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2085,10 +1993,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2172,10 +2076,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2262,10 +2162,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2352,10 +2248,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2442,10 +2334,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2532,10 +2420,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2622,10 +2506,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2712,10 +2592,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2802,10 +2678,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2892,10 +2764,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -2982,10 +2850,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3072,10 +2936,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3162,10 +3022,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3252,10 +3108,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3342,10 +3194,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3429,10 +3277,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3516,10 +3360,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -3602,10 +3442,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3692,10 +3528,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3779,10 +3611,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3866,10 +3694,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -3953,10 +3777,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4040,10 +3860,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4127,10 +3943,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4214,10 +4026,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4299,10 +4107,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4384,10 +4188,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4471,10 +4271,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4558,10 +4354,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4645,10 +4437,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4732,10 +4520,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4819,10 +4603,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4906,10 +4686,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -4993,10 +4769,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5080,10 +4852,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5167,10 +4935,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5254,10 +5018,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5341,10 +5101,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5428,10 +5184,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5515,10 +5267,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5602,10 +5350,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5689,10 +5433,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5776,10 +5516,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5863,10 +5599,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -5950,10 +5682,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6037,10 +5765,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6121,10 +5845,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6205,10 +5925,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6288,10 +6004,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6372,10 +6084,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6456,10 +6164,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6546,10 +6250,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6636,10 +6336,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6726,10 +6422,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6816,10 +6508,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6906,10 +6594,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -6994,10 +6678,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7082,10 +6762,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7170,10 +6846,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7258,10 +6930,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7348,10 +7016,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7438,10 +7102,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7528,10 +7188,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7618,10 +7274,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7708,10 +7360,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7798,10 +7446,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7888,10 +7532,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -7978,10 +7618,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -8066,10 +7702,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -8154,10 +7786,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -8244,10 +7872,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -8334,10 +7958,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -8424,10 +8044,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -8514,10 +8130,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -8604,10 +8216,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -8684,10 +8292,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -8764,10 +8368,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -8844,10 +8444,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -8924,10 +8520,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9003,10 +8595,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9083,10 +8671,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9163,10 +8747,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9243,10 +8823,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9323,10 +8899,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9403,10 +8975,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9483,10 +9051,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9561,10 +9125,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9640,10 +9200,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9723,10 +9279,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -9813,10 +9365,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -9903,10 +9451,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -9993,10 +9537,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10083,10 +9623,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10173,10 +9709,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10263,10 +9795,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10353,10 +9881,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10440,10 +9964,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10530,10 +10050,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10617,10 +10133,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10707,10 +10219,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10797,10 +10305,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10887,10 +10391,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -10977,10 +10477,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11067,10 +10563,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11157,10 +10649,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11247,10 +10735,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11337,10 +10821,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11427,10 +10907,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11517,10 +10993,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11607,10 +11079,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11697,10 +11165,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11787,10 +11251,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11877,10 +11337,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -11967,10 +11423,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12057,10 +11509,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12147,10 +11595,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12237,10 +11681,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12327,10 +11767,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12417,10 +11853,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12507,10 +11939,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12597,10 +12025,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12687,10 +12111,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12777,10 +12197,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12867,10 +12283,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -12954,10 +12366,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13041,10 +12449,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13128,10 +12532,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13214,10 +12614,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13300,10 +12696,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13388,10 +12780,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13477,10 +12865,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13565,10 +12949,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13653,10 +13033,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13738,10 +13114,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13824,10 +13196,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13909,10 +13277,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -13999,10 +13363,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14089,10 +13449,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14179,10 +13535,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14269,10 +13621,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14359,10 +13707,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14449,10 +13793,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14539,10 +13879,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14629,10 +13965,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14719,10 +14051,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14809,10 +14137,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14899,10 +14223,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -14989,10 +14309,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15079,10 +14395,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15169,10 +14481,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15259,10 +14567,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15349,10 +14653,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15439,10 +14739,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15516,10 +14812,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15593,10 +14885,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15683,10 +14971,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15773,10 +15057,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15863,10 +15143,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -15953,10 +15229,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16043,10 +15315,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16133,10 +15401,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16223,10 +15487,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16313,10 +15573,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16403,10 +15659,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16490,10 +15742,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16577,10 +15825,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16664,10 +15908,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16750,10 +15990,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16840,10 +16076,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -16930,10 +16162,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17020,10 +16248,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17107,10 +16331,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17194,10 +16414,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17281,10 +16497,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17371,10 +16583,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17461,10 +16669,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17551,10 +16755,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17641,10 +16841,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17731,10 +16927,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17821,10 +17013,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -17911,10 +17099,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18001,10 +17185,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18091,10 +17271,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18181,10 +17357,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18271,10 +17443,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18361,10 +17529,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18451,10 +17615,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18541,10 +17701,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18631,10 +17787,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18720,10 +17872,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18798,10 +17946,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -18888,10 +18032,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -18978,10 +18118,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19068,10 +18204,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19158,10 +18290,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19247,10 +18375,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19336,10 +18460,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19425,10 +18545,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19503,10 +18619,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -19593,10 +18705,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19682,10 +18790,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19772,10 +18876,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19862,10 +18962,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -19952,10 +19048,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20042,10 +19134,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20132,10 +19220,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20221,10 +19305,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20311,10 +19391,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20401,10 +19477,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20479,10 +19551,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -20572,10 +19640,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20665,10 +19729,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20752,10 +19812,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20839,10 +19895,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -20926,10 +19978,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21016,10 +20064,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21106,10 +20150,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21196,10 +20236,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21285,10 +20321,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21371,10 +20403,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21461,10 +20489,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21547,10 +20571,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21633,10 +20653,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21722,10 +20738,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21811,10 +20823,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21900,10 +20908,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -21990,10 +20994,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22077,10 +21077,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22165,10 +21161,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22252,10 +21244,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22342,10 +21330,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22432,10 +21416,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22522,10 +21502,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22612,10 +21588,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22702,10 +21674,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22792,10 +21760,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22882,10 +21846,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -22972,10 +21932,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23062,10 +22018,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23152,10 +22104,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23242,10 +22190,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23332,10 +22276,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23421,10 +22361,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23510,10 +22446,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23596,10 +22528,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23686,10 +22614,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23776,10 +22700,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23866,10 +22786,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -23956,10 +22872,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24046,10 +22958,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24136,10 +23044,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24226,10 +23130,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24316,10 +23216,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24399,10 +23295,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24489,10 +23381,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24576,10 +23464,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24663,10 +23547,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24753,10 +23633,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24840,10 +23716,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -24917,10 +23789,6 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -24994,10 +23862,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -25065,10 +23929,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -25142,10 +24002,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -25213,10 +24069,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -25296,10 +24148,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -25386,10 +24234,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -25476,10 +24320,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -25566,10 +24406,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -25657,10 +24493,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -25743,10 +24575,6 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -25826,10 +24654,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -25913,10 +24737,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26003,10 +24823,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26087,10 +24903,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26174,10 +24986,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26261,10 +25069,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26351,10 +25155,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26441,10 +25241,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26531,10 +25327,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26621,10 +25413,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26711,10 +25499,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26801,10 +25585,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26891,10 +25671,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -26981,10 +25757,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27061,10 +25833,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -27147,10 +25915,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27237,10 +26001,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27327,10 +26087,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27417,10 +26173,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27507,10 +26259,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27597,10 +26345,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27687,10 +26431,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27777,10 +26517,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27867,10 +26603,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -27957,10 +26689,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28046,10 +26774,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28136,10 +26860,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28226,10 +26946,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28316,10 +27032,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28403,10 +27115,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28490,10 +27198,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28580,10 +27284,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28666,10 +27366,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -28850,7 +27546,7 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" + key: "luci.recipes.use_python3" value: 100 } experiments { @@ -28933,10 +27629,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29020,10 +27712,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29110,10 +27798,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29200,10 +27884,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29290,10 +27970,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29377,10 +28053,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29464,10 +28136,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29551,10 +28219,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29641,10 +28305,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29731,10 +28391,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29818,10 +28474,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29905,10 +28557,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -29995,10 +28643,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30085,10 +28729,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30175,10 +28815,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30265,10 +28901,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30355,10 +28987,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30442,10 +29070,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30529,10 +29153,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30617,10 +29237,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30707,10 +29323,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30797,10 +29409,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30887,10 +29495,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -30968,10 +29572,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -31054,10 +29654,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31141,10 +29737,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31228,10 +29820,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31315,10 +29903,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31402,10 +29986,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31489,10 +30069,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31576,10 +30152,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31665,10 +30237,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31755,10 +30323,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31845,10 +30409,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -31928,10 +30488,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -31999,10 +30555,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -32084,10 +30636,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32173,10 +30721,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32266,10 +30810,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32355,10 +30895,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32449,10 +30985,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32539,10 +31071,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32628,10 +31156,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32721,10 +31245,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32810,10 +31330,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32903,10 +31419,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -32992,10 +31504,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33081,10 +31589,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33170,10 +31674,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33259,10 +31759,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33348,10 +31844,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33437,10 +31929,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33527,10 +32015,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33617,10 +32101,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33704,10 +32184,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33791,10 +32267,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33878,10 +32350,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -33968,10 +32436,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -34049,10 +32513,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -34126,10 +32586,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -34197,10 +32653,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -34268,10 +32720,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -34339,10 +32787,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -34410,10 +32854,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -34493,10 +32933,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -34583,10 +33019,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -34673,10 +33105,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -34762,10 +33190,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -34849,10 +33273,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -34945,10 +33365,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35032,10 +33448,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35122,10 +33534,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35212,10 +33620,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35299,10 +33703,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35386,10 +33786,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35473,10 +33869,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35560,10 +33952,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35647,10 +34035,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35734,10 +34118,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35824,10 +34204,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -35914,10 +34290,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36001,10 +34373,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36091,10 +34459,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36178,10 +34542,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36268,10 +34628,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36355,10 +34711,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36442,10 +34794,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36532,10 +34880,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36619,10 +34963,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36709,10 +35049,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36796,10 +35132,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36883,10 +35215,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -36973,10 +35301,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37060,10 +35384,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37147,10 +35467,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37234,10 +35550,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37324,10 +35636,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37411,10 +35719,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37498,10 +35802,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37585,10 +35885,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37675,10 +35971,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37762,10 +36054,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37851,10 +36139,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -37938,10 +36222,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38024,10 +36304,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38114,10 +36390,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38197,10 +36469,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -38276,10 +36544,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -38362,10 +36626,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38452,10 +36712,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38542,10 +36798,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38629,10 +36881,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38719,10 +36967,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38807,10 +37051,6 @@ service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experimental: YES experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38895,10 +37135,6 @@ service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experimental: YES experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -38983,10 +37219,6 @@ service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experimental: YES experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39073,10 +37305,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39148,10 +37376,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -39222,10 +37446,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -39293,10 +37513,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -39378,10 +37594,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39467,10 +37679,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39556,10 +37764,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39645,10 +37849,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39734,10 +37934,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39823,10 +38019,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39908,10 +38100,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -39993,10 +38181,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40082,10 +38266,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40169,10 +38349,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40256,10 +38432,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40343,10 +38515,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40429,10 +38597,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40515,10 +38679,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40603,10 +38763,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40690,10 +38846,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40775,10 +38927,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40860,10 +39008,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -40948,10 +39092,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41033,10 +39173,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41118,10 +39254,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41203,10 +39335,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41290,10 +39418,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41377,10 +39501,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41464,10 +39584,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41551,10 +39667,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41638,10 +39750,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41725,10 +39833,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41812,10 +39916,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41899,10 +39999,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -41986,10 +40082,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42073,10 +40165,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42163,10 +40251,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42250,10 +40334,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42337,10 +40417,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42421,10 +40497,6 @@ build_numbers: YES service_account: "component-mapping-updater@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42493,10 +40565,6 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42574,10 +40642,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -42651,10 +40715,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -42728,10 +40788,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -42811,10 +40867,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42900,10 +40952,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -42989,10 +41037,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43078,10 +41122,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43168,10 +41208,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43255,10 +41291,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43342,10 +41374,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43429,10 +41457,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43516,10 +41540,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43599,10 +41619,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -43678,10 +41694,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -43763,10 +41775,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43849,10 +41857,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -43936,10 +41940,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -44026,10 +42026,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -44109,10 +42105,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -44188,10 +42180,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -44267,10 +42255,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -44346,10 +42330,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -44432,10 +42412,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -44522,10 +42498,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -44609,10 +42581,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -44696,10 +42664,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -44783,10 +42747,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -44858,10 +42818,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -44929,10 +42885,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -45000,10 +42952,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -45071,10 +43019,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -45154,10 +43098,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45241,10 +43181,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45328,10 +43264,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45415,10 +43347,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45504,10 +43432,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45593,10 +43517,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45682,10 +43602,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45768,10 +43684,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45857,10 +43769,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -45944,10 +43852,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -46031,10 +43935,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -46118,10 +44018,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -46205,10 +44101,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -46280,10 +44172,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -46351,10 +44239,6 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -46434,10 +44318,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -46521,10 +44401,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -46622,10 +44498,6 @@ build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -46703,10 +44575,6 @@ build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -46784,10 +44652,6 @@ build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -46865,10 +44729,6 @@ build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -46946,10 +44806,6 @@ build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -47027,10 +44883,6 @@ build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -47137,10 +44989,6 @@ build_numbers: YES service_account: "findit-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -47191,10 +45039,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -47282,10 +45126,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47332,10 +45172,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47382,10 +45218,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47432,10 +45264,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47482,10 +45310,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47532,10 +45356,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47582,10 +45402,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47632,10 +45448,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47682,10 +45494,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47732,10 +45540,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47782,10 +45586,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47832,10 +45632,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47882,10 +45678,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47932,10 +45724,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -47982,10 +45770,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48032,10 +45816,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48082,10 +45862,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48132,10 +45908,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48182,10 +45954,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48237,10 +46005,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48288,10 +46052,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48339,10 +46099,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48389,10 +46145,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48439,10 +46191,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48488,10 +46236,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48538,10 +46282,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48588,10 +46328,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48638,10 +46374,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48688,10 +46420,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48738,10 +46466,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48788,10 +46512,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48838,10 +46558,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48888,10 +46604,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48938,10 +46650,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -48989,10 +46697,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49040,10 +46744,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49091,10 +46791,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49142,10 +46838,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49193,10 +46885,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49244,10 +46932,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49294,10 +46978,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49344,10 +47024,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49397,10 +47073,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49450,10 +47122,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49501,10 +47169,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49552,10 +47216,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49603,10 +47263,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49654,10 +47310,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49704,10 +47356,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49754,10 +47402,6 @@ build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49828,10 +47472,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -49915,10 +47555,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -50069,10 +47705,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -50153,10 +47785,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -50240,10 +47868,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -50331,10 +47955,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -50422,10 +48042,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -50513,10 +48129,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -50604,10 +48216,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -50691,10 +48299,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -50778,10 +48382,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -50869,10 +48469,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -50975,10 +48571,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 20 } @@ -51066,10 +48658,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51157,10 +48745,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51248,10 +48832,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51339,10 +48919,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51430,10 +49006,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51521,10 +49093,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51612,10 +49180,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51703,10 +49267,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51794,10 +49354,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51885,10 +49441,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -51976,10 +49528,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -52067,10 +49615,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -52158,10 +49702,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -52249,10 +49789,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -52340,10 +49876,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -52431,10 +49963,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -52532,10 +50060,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -52636,12 +50160,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -52736,10 +50256,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -52837,10 +50353,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -52941,12 +50453,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -53033,10 +50541,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53125,10 +50629,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53216,10 +50716,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53307,10 +50803,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53398,10 +50890,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53489,10 +50977,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53584,10 +51068,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53679,10 +51159,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53770,10 +51246,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53864,10 +51336,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -53961,12 +51429,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -54054,10 +51518,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54145,10 +51605,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54237,10 +51693,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54328,10 +51780,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54419,10 +51867,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54510,10 +51954,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54601,10 +52041,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54692,10 +52128,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54783,10 +52215,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54874,10 +52302,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -54965,10 +52389,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55056,10 +52476,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55147,10 +52563,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55238,10 +52650,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55329,10 +52737,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55420,10 +52824,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55511,10 +52911,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55602,10 +52998,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55694,10 +53086,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55785,10 +53173,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55876,10 +53260,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -55968,10 +53348,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56059,10 +53435,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56150,10 +53522,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56241,10 +53609,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56331,10 +53695,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56422,10 +53782,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56513,10 +53869,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56604,10 +53956,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56695,10 +54043,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -56812,10 +54156,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -56911,10 +54251,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -56997,10 +54333,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57088,10 +54420,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57178,10 +54506,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57269,10 +54593,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57360,10 +54680,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57451,10 +54767,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57542,10 +54854,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57636,10 +54944,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57732,12 +55036,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -57823,10 +55123,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -57914,10 +55210,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58011,10 +55303,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58102,10 +55390,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58193,10 +55477,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58283,10 +55563,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -58368,10 +55644,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58456,10 +55728,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58544,10 +55812,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58632,10 +55896,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58721,10 +55981,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58810,10 +56066,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58899,10 +56151,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -58988,10 +56236,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -59079,10 +56323,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -59170,10 +56410,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -59257,10 +56493,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -59356,10 +56588,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -59443,10 +56671,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -59534,10 +56758,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -59625,10 +56845,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -59716,10 +56932,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -59807,10 +57019,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -59898,10 +57106,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -59989,10 +57193,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60080,10 +57280,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60170,10 +57366,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60260,10 +57452,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60350,10 +57538,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60440,10 +57624,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60527,10 +57707,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60614,10 +57790,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60701,10 +57873,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60788,10 +57956,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60875,10 +58039,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -60962,10 +58122,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61049,10 +58205,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61136,10 +58288,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61223,10 +58371,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61310,10 +58454,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61397,10 +58537,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61484,10 +58620,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61571,10 +58703,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61658,10 +58786,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61745,10 +58869,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61832,10 +58952,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -61919,10 +59035,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62006,10 +59118,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62093,10 +59201,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62180,10 +59284,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62267,10 +59367,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62354,10 +59450,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62439,10 +59531,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62524,10 +59612,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62609,10 +59693,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62694,10 +59774,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62779,10 +59855,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62864,10 +59936,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -62949,10 +60017,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63034,10 +60098,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63119,10 +60179,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63204,10 +60260,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63289,10 +60341,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63374,10 +60422,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63459,10 +60503,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63546,10 +60586,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63633,10 +60669,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63720,10 +60752,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63807,10 +60835,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63894,10 +60918,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -63981,10 +61001,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64068,10 +61084,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64155,10 +61167,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64242,10 +61250,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64329,10 +61333,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64416,10 +61416,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64503,10 +61499,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64590,10 +61582,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64677,10 +61665,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64764,10 +61748,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64851,10 +61831,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -64936,10 +61912,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65021,10 +61993,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65108,10 +62076,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65198,10 +62162,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -65287,10 +62247,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65380,10 +62336,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65481,10 +62433,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65577,10 +62525,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65681,10 +62625,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65774,10 +62714,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65867,10 +62803,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -65960,10 +62892,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66060,10 +62988,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66153,10 +63077,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66246,10 +63166,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66339,10 +63255,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66432,10 +63344,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66522,10 +63430,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66612,10 +63516,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66703,10 +63603,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66794,10 +63690,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66888,10 +63780,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -66979,10 +63867,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -67066,10 +63950,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67157,10 +64037,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -67244,10 +64120,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67335,10 +64207,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67426,10 +64294,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67518,10 +64382,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67609,10 +64469,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67700,10 +64556,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67791,10 +64643,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67882,10 +64730,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -67973,10 +64817,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68064,10 +64904,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68162,10 +64998,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68253,10 +65085,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68344,10 +65172,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68434,10 +65258,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68525,10 +65345,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68616,10 +65432,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68711,10 +65523,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68812,10 +65620,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -68916,12 +65720,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -69009,10 +65809,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -69101,10 +65897,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -69190,10 +65982,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -69281,10 +66069,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -69372,10 +66156,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -69463,10 +66243,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -69548,10 +66324,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -69639,10 +66411,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -69730,10 +66498,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -69821,10 +66585,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -69912,10 +66672,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70004,10 +66760,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70103,10 +66855,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70195,10 +66943,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70286,10 +67030,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70377,10 +67117,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70467,10 +67203,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 5 } @@ -70558,10 +67290,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70649,10 +67377,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70740,10 +67464,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70831,10 +67551,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -70928,10 +67644,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -71027,12 +67739,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -71121,10 +67829,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -71215,10 +67919,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -71306,10 +68006,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -71400,10 +68096,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -71494,10 +68186,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -71582,10 +68270,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -71670,10 +68354,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -71754,10 +68434,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -71838,10 +68514,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -71930,10 +68602,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72021,10 +68689,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72111,10 +68775,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72202,10 +68862,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72293,10 +68949,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72384,10 +69036,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72475,10 +69123,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72567,10 +69211,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72658,10 +69298,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72749,10 +69385,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72840,10 +69472,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -72934,10 +69562,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73031,12 +69655,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -73124,10 +69744,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73215,10 +69831,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73307,10 +69919,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73399,10 +70007,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73490,10 +70094,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -73581,10 +70181,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73672,10 +70268,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73767,10 +70359,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73858,10 +70446,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -73953,10 +70537,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74045,10 +70625,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74139,10 +70715,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74236,12 +70808,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -74328,10 +70896,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74419,10 +70983,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74510,10 +71070,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74601,10 +71157,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74692,10 +71244,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74782,10 +71330,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -74867,10 +71411,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -74958,10 +71498,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75047,10 +71583,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -75131,10 +71663,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75220,10 +71748,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75308,10 +71832,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75397,10 +71917,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75490,10 +72006,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75587,12 +72099,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -75685,10 +72193,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75779,10 +72283,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75864,10 +72364,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -75952,10 +72448,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76040,10 +72532,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76129,10 +72617,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76218,10 +72702,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76307,10 +72787,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76396,10 +72872,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76490,10 +72962,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76585,12 +73053,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -76675,10 +73139,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76764,10 +73224,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76853,10 +73309,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -76942,10 +73394,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77031,10 +73479,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77120,10 +73564,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77209,10 +73649,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77298,10 +73734,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77387,10 +73819,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77477,10 +73905,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77567,10 +73991,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77656,10 +74076,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77745,10 +74161,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77833,10 +74245,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -77917,10 +74325,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -78001,10 +74405,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -78092,10 +74492,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -78189,10 +74585,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -78276,10 +74668,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -78363,10 +74751,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -78454,10 +74838,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -78545,10 +74925,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -78636,10 +75012,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -78723,10 +75095,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -78810,10 +75178,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -78897,10 +75261,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -78989,10 +75349,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -79087,10 +75443,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -79182,10 +75534,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -79267,10 +75615,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -79357,10 +75701,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 5 } @@ -79448,10 +75788,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -79536,10 +75872,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -79624,10 +75956,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -79708,10 +76036,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -79792,10 +76116,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -79876,10 +76196,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -79960,10 +76276,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80048,10 +76360,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80139,10 +76447,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80230,10 +76534,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80321,10 +76621,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80412,10 +76708,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80509,10 +76801,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80600,10 +76888,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80701,10 +76985,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80805,12 +77085,8 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" - value: 25 + value: 100 } experiments { key: "luci.use_realms" @@ -80896,10 +77172,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -80990,10 +77262,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81081,10 +77349,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81172,10 +77436,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81264,10 +77524,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81355,10 +77611,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81447,10 +77699,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81538,10 +77786,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81629,10 +77873,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81720,10 +77960,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81811,10 +78047,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81902,10 +78134,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -81986,10 +78214,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82077,10 +78301,6 @@ value: 5 } experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 25 } @@ -82171,10 +78391,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82214,10 +78430,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82263,10 +78475,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82306,10 +78514,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82355,10 +78559,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82398,10 +78598,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82447,10 +78643,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82490,10 +78682,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82533,10 +78721,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82576,10 +78760,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82640,10 +78820,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82688,10 +78864,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82736,10 +78908,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82778,10 +78946,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82820,10 +78984,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82868,10 +79028,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82916,10 +79072,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -82958,10 +79110,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83006,10 +79154,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83054,10 +79198,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83096,10 +79236,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83144,10 +79280,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83192,10 +79324,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83234,10 +79362,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83276,10 +79400,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83318,10 +79438,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -83370,10 +79486,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 } @@ -83418,10 +79530,6 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { - key: "chromium.chromium_tests.use_rdb_results" - value: 100 - } - experiments { key: "luci.use_realms" value: 100 }
diff --git a/infra/config/main.star b/infra/config/main.star index ee62d6900..53941d7a 100755 --- a/infra/config/main.star +++ b/infra/config/main.star
@@ -164,8 +164,6 @@ ) luci.builder.defaults.experiments.set({ - # TODO(crbug.com/1135718): Promote out of experiment for all builders. - "chromium.chromium_tests.use_rdb_results": 100, # Launch Swarming tasks in "realms-aware mode", crbug.com/1136313. "luci.use_realms": 100, })
diff --git a/infra/config/recipes.star b/infra/config/recipes.star index c601e970..0f39127fb 100644 --- a/infra/config/recipes.star +++ b/infra/config/recipes.star
@@ -89,6 +89,7 @@ build_recipe( name = "recipe:android/sdk_packager", + use_python3 = True, ) build_recipe( @@ -145,9 +146,7 @@ build_recipe( name = "recipe:chromium/compilator", bootstrappable = True, - experiments = { - "luci.recipes.use_python3": 25, - }, + use_python3 = True, ) build_recipe(
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 979838a..53dec1a 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -128,31 +128,6 @@ {"5000", signin::kWaitThresholdMillisecondsForCapabilitiesApi, "5000"}, }; -const FeatureEntry::FeatureVariation - kOmniboxOnDeviceHeadSuggestNonIncognitoExperimentVariations[] = { - { - "relevance-1000", - (FeatureEntry::FeatureParam[]){ - {OmniboxFieldTrial::kOnDeviceHeadSuggestMaxScoreForNonUrlInput, - "1000"}, - {OmniboxFieldTrial::kOnDeviceHeadSuggestDemoteMode, - "decrease-relevances"}}, - 2, - nullptr, - }, - { - "no-delay-relevance-1000", - (FeatureEntry::FeatureParam[]){ - {OmniboxFieldTrial::kOnDeviceHeadSuggestDelaySuggestRequestMs, - "0"}, - {OmniboxFieldTrial::kOnDeviceHeadSuggestMaxScoreForNonUrlInput, - "1000"}, - {OmniboxFieldTrial::kOnDeviceHeadSuggestDemoteMode, - "decrease-relevances"}}, - 3, - nullptr, - }}; - const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches3[] = { {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "3"}}; const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches4[] = { @@ -423,19 +398,6 @@ {"toolbar-container", flag_descriptions::kToolbarContainerName, flag_descriptions::kToolbarContainerDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(toolbar_container::kToolbarContainerEnabled)}, - {"omnibox-on-device-head-suggestions-incognito", - flag_descriptions::kOmniboxOnDeviceHeadSuggestionsIncognitoName, - flag_descriptions::kOmniboxOnDeviceHeadSuggestionsIncognitoDescription, - flags_ui::kOsIos, - FEATURE_VALUE_TYPE(omnibox::kOnDeviceHeadProviderIncognito)}, - {"omnibox-on-device-head-suggestions-non-incognito", - flag_descriptions::kOmniboxOnDeviceHeadSuggestionsNonIncognitoName, - flag_descriptions::kOmniboxOnDeviceHeadSuggestionsNonIncognitoDescription, - flags_ui::kOsIos, - FEATURE_WITH_PARAMS_VALUE_TYPE( - omnibox::kOnDeviceHeadProviderNonIncognito, - kOmniboxOnDeviceHeadSuggestNonIncognitoExperimentVariations, - "OmniboxOnDeviceHeadNonIncognitoTuningMobile")}, {"omnibox-ui-max-autocomplete-matches", flag_descriptions::kOmniboxUIMaxAutocompleteMatchesName, flag_descriptions::kOmniboxUIMaxAutocompleteMatchesDescription, @@ -578,11 +540,6 @@ flag_descriptions::kOmniboxNewImplementationName, flag_descriptions::kOmniboxNewImplementationDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSNewOmniboxImplementation)}, - {"shared-highlighting-use-blocklist", - flag_descriptions::kSharedHighlightingUseBlocklistIOSName, - flag_descriptions::kSharedHighlightingUseBlocklistIOSDescription, - flags_ui::kOsIos, - FEATURE_VALUE_TYPE(shared_highlighting::kSharedHighlightingUseBlocklist)}, {"start-surface", flag_descriptions::kStartSurfaceName, flag_descriptions::kStartSurfaceDescription, flags_ui::kOsIos, FEATURE_WITH_PARAMS_VALUE_TYPE(kStartSurface,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index a4f805c..03ce72e 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -310,14 +310,6 @@ "Enables improvements to text fragments UI, including a menu for removing " "or resharing a highlight."; -const char kSharedHighlightingUseBlocklistIOSName[] = - "Shared Highlighting blocklist"; -const char kSharedHighlightingUseBlocklistIOSDescription[] = - "Uses a blocklist to disable Shared Highlighting link generation on " - "certain sites where personalized or dynamic content or other technical " - "restrictions make it unlikely that a URL can be generated and actually " - "work when shared."; - const char kLazilyCreateWebStateOnRestorationName[] = "Unrealized WebStates"; const char kLazilyCreateWebStateOnRestorationDescription[] = "Create WebState in unrealized state upon session restoration.";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 7706428..97c9095 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -403,11 +403,6 @@ extern const char kSharedHighlightingIOSName[]; extern const char kSharedHighlightingIOSDescription[]; -// Title and description for the flag to use a sites blocklist when generating -// URLs for Shared Highlighting (Link to Text). -extern const char kSharedHighlightingUseBlocklistIOSName[]; -extern const char kSharedHighlightingUseBlocklistIOSDescription[]; - // Title and description for the flag to enable annotating web forms with // Autofill field type predictions as placeholder. extern const char kShowAutofillTypePredictionsName[];
diff --git a/ios/chrome/browser/policy/policy_features.cc b/ios/chrome/browser/policy/policy_features.cc index 62c1940..131bf924 100644 --- a/ios/chrome/browser/policy/policy_features.cc +++ b/ios/chrome/browser/policy/policy_features.cc
@@ -13,7 +13,7 @@ #include "ios/web/common/features.h" const base::Feature kURLBlocklistIOS{"URLBlocklistIOS", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; namespace {
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm index 37cb9f8..85fa01f 100644 --- a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm +++ b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
@@ -218,7 +218,8 @@ // Test that update to autofill profile injected in FakeServer gets synced to // client. -- (void)testSyncUpdateAutofillProfile { +// Flaky test. See crbug.com/1276654. +- (void)DISABLED_testSyncUpdateAutofillProfile { const std::string kGuid = "2340E83B-5BEE-4560-8F95-5914EF7F539E"; const std::string kFullName = "Peter Pan"; const std::string kUpdatedFullName = "Roger Rabbit"; @@ -265,7 +266,8 @@ // Test that autofill profile deleted from FakeServer gets deleted from client // as well. -- (void)testSyncDeleteAutofillProfile { +// Flaky test. See crbug.com/1276413. +- (void)DISABLED_testSyncDeleteAutofillProfile { const std::string kGuid = "2340E83B-5BEE-4560-8F95-5914EF7F539E"; const std::string kFullName = "Peter Pan"; GREYAssertFalse([ChromeEarlGrey isAutofillProfilePresentWithGUID:kGuid
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 6b3b1a7..0aab3d6 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -2e271bfcd36d394b46dd4945ce4ce6797bb5d6d5 \ No newline at end of file +fc0b3f812abb8d7f5e6af171a420151aebf26a8d \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index c884808..f2ed95b8 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -15e603f0f12d3e8ee27be9545f15c93fabb0d3fa \ No newline at end of file +7d551a58577125b31fe4ed58616fe61ae95fccf7 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index a3b52bf..46780d5 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -07da3f703ea6fac573f51609154c2c76b3b868d8 \ No newline at end of file +4de7f880fa8466140471226943e391d675986000 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index 6cb65e60..3f6f60b4 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -e3b4f574bdefebcd430ef2425fdfa336deae0d4f \ No newline at end of file +a93b48bd11ebc032b3bbca334c5ad4a0f598a909 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index a61ed312..f1a9be0c 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -c3db6cb58331733f8e097085cc84c4b5593c108a \ No newline at end of file +3c4234422fe56bff1a64b1afa56efaad7daffccb \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index 1c8f9f31..0dc3d5d 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -58d2b63debfe332cd146b071deb3ae6db9e93402 \ No newline at end of file +05fd113b02392f06219659b1d6f2bdd2914f47e1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index c84ac58..56c42faa 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -b1ec816da9c46a9182a7fec6cadc224aa85c63dd \ No newline at end of file +5f10fb7df8f746b67f7d694079fcd12a85457c93 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 2736ebd..89132a8 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -e2a67e59c66641b3f1979968e349801ab1cbaec0 \ No newline at end of file +f2663d1ddc17bc344ebee2652df0bffaa7feca46 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index 86dbdd70..9ba4708 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -035a80c9b5617fa73f0837d340bf2a4f4e14be11 \ No newline at end of file +af24bb41746ceff2d0f1f2d2314678cf051dca1e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index f34354a..2552cfb9 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -bfd521fce25411e441ad9ca82c313e583abaed8b \ No newline at end of file +8556f00cc6c5698a64af6678069180ed413ed361 \ No newline at end of file
diff --git a/ios/web/download/BUILD.gn b/ios/web/download/BUILD.gn index f1cf31e..f9bf4b4 100644 --- a/ios/web/download/BUILD.gn +++ b/ios/web/download/BUILD.gn
@@ -19,6 +19,10 @@ sources = [ "download_controller_impl.h", "download_controller_impl.mm", + "download_native_task_bridge.h", + "download_native_task_bridge.mm", + "download_native_task_impl.h", + "download_native_task_impl.mm", "download_session_task_impl.h", "download_session_task_impl.mm", "download_task_impl.h", @@ -70,6 +74,7 @@ sources = [ "download_controller_impl_unittest.mm", + "download_native_task_impl_unittest.mm", "download_session_cookie_storage_unittest.mm", "download_session_task_impl_unittest.mm", "download_task_impl_unittest.mm",
diff --git a/ios/web/download/download_controller_impl.h b/ios/web/download/download_controller_impl.h index e0bb654..9e2ff9b6 100644 --- a/ios/web/download/download_controller_impl.h +++ b/ios/web/download/download_controller_impl.h
@@ -39,6 +39,17 @@ const std::string& content_disposition, int64_t total_bytes, const std::string& mime_type) override; + + void CreateNativeDownloadTask(WebState* web_state, + NSString* identifier, + const GURL& original_url, + NSString* http_method, + const std::string& content_disposition, + int64_t total_bytes, + const std::string& mime_type, + DownloadNativeTaskBridge* download) override + API_AVAILABLE(ios(15)); + void SetDelegate(DownloadControllerDelegate* delegate) override; DownloadControllerDelegate* GetDelegate() const override;
diff --git a/ios/web/download/download_controller_impl.mm b/ios/web/download/download_controller_impl.mm index 840f23b..8d3bf0b 100644 --- a/ios/web/download/download_controller_impl.mm +++ b/ios/web/download/download_controller_impl.mm
@@ -5,6 +5,8 @@ #import "ios/web/download/download_controller_impl.h" #include "base/strings/sys_string_conversions.h" +#import "ios/web/download/download_native_task_bridge.h" +#import "ios/web/download/download_native_task_impl.h" #import "ios/web/download/download_session_cookie_storage.h" #import "ios/web/download/download_session_task_impl.h" #include "ios/web/public/browser_state.h" @@ -67,6 +69,28 @@ delegate_->OnDownloadCreated(this, web_state, std::move(task)); } +void DownloadControllerImpl::CreateNativeDownloadTask( + WebState* web_state, + NSString* identifier, + const GURL& original_url, + NSString* http_method, + const std::string& content_disposition, + int64_t total_bytes, + const std::string& mime_type, + DownloadNativeTaskBridge* download) API_AVAILABLE(ios(15)) { + DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_); + if (!delegate_) { + [download cancel]; + return; + } + + auto task = std::make_unique<DownloadNativeTaskImpl>( + web_state, original_url, http_method, content_disposition, total_bytes, + mime_type, identifier, download, this); + alive_tasks_.insert(task.get()); + delegate_->OnDownloadCreated(this, web_state, std::move(task)); +} + void DownloadControllerImpl::SetDelegate(DownloadControllerDelegate* delegate) { DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_); delegate_ = delegate;
diff --git a/ios/web/download/download_controller_impl_unittest.mm b/ios/web/download/download_controller_impl_unittest.mm index b31ca66..3c034280 100644 --- a/ios/web/download/download_controller_impl_unittest.mm +++ b/ios/web/download/download_controller_impl_unittest.mm
@@ -12,6 +12,7 @@ #import "ios/web/public/test/fakes/fake_web_state.h" #include "ios/web/public/test/web_task_environment.h" #include "ios/web/public/test/web_test.h" +#import "ios/web/test/fakes/fake_native_task_bridge.h" #include "net/url_request/url_fetcher_response_writer.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest_mac.h" @@ -87,6 +88,39 @@ EXPECT_EQ("file.test", base::UTF16ToUTF8(task->GetSuggestedFilename())); } +// Tests that DownloadController::CreateNativeDownloadTask calls +// DownloadControllerDelegate::OnDownloadCreated. +TEST_F(DownloadControllerImplTest, OnNativeDownloadCreated) { + NSString* identifier = [NSUUID UUID].UUIDString; + GURL url("https://download.test"); + + if (@available(iOS 15, *)) { + WKDownload* fake_download = nil; + id<DownloadNativeTaskBridgeReadyDelegate> fake_ready_delegate; + FakeNativeTaskBridge* fake_task_bridge_ = + [[FakeNativeTaskBridge alloc] initWithDownload:fake_download + downloadReadyDelegate:fake_ready_delegate]; + + download_controller_->CreateNativeDownloadTask( + &web_state_, identifier, url, @"POST", kContentDisposition, + /*total_bytes=*/-1, kMimeType, fake_task_bridge_); + + ASSERT_EQ(1U, delegate_->alive_download_tasks().size()); + DownloadTask* task = delegate_->alive_download_tasks()[0].second.get(); + EXPECT_EQ(&web_state_, delegate_->alive_download_tasks()[0].first); + EXPECT_NSEQ(identifier, task->GetIndentifier()); + EXPECT_EQ(url, task->GetOriginalUrl()); + EXPECT_NSEQ(@"POST", task->GetHttpMethod()); + EXPECT_FALSE(task->IsDone()); + EXPECT_EQ(0, task->GetErrorCode()); + EXPECT_EQ(0, task->GetTotalBytes()); + EXPECT_EQ(0, task->GetPercentComplete()); + EXPECT_EQ(kContentDisposition, task->GetContentDisposition()); + EXPECT_EQ(kMimeType, task->GetMimeType()); + EXPECT_EQ("file.test", base::UTF16ToUTF8(task->GetSuggestedFilename())); + } +} + // Tests that DownloadController::FromBrowserState does not crash if used // without delegate. TEST_F(DownloadControllerImplTest, NullDelegate) {
diff --git a/ios/web/download/download_native_task_bridge.h b/ios/web/download/download_native_task_bridge.h new file mode 100644 index 0000000..8a2c735 --- /dev/null +++ b/ios/web/download/download_native_task_bridge.h
@@ -0,0 +1,50 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_DOWNLOAD_DOWNLOAD_NATIVE_TASK_BRIDGE_H_ +#define IOS_WEB_DOWNLOAD_DOWNLOAD_NATIVE_TASK_BRIDGE_H_ + +#import <WebKit/WebKit.h> + +@class DownloadNativeTaskBridge; + +@protocol DownloadNativeTaskBridgeReadyDelegate <NSObject> + +// Used to set response url, content length, mimetype and http response headers +// in CRWWkNavigationHandler so method can interact with WKWebView. +- (void)onDownloadNativeTaskBridgeReadyForDownload: + (DownloadNativeTaskBridge*)bridge API_AVAILABLE(ios(15)); + +@end + +// Class used to create a download task object that handles downloads through +// WKDownload. |progressionHandler| and |completionHandler| are instantiated +// as private instance variables in the implementation file in ios/web/download +@interface DownloadNativeTaskBridge : NSObject <WKDownloadDelegate> + +// Default initializer. |download| and |readyDelegate| must be non-nil. +- (instancetype)initWithDownload:(WKDownload*)download + downloadReadyDelegate: + (id<DownloadNativeTaskBridgeReadyDelegate>)readyDelegate + NS_DESIGNATED_INITIALIZER API_AVAILABLE(ios(15)); + +- (instancetype)init NS_UNAVAILABLE; + +// Cancels download +- (void)cancel; + +// Starts download and sets |progressionHandler| and |completionHandler| +- (void)startDownload:(NSURL*)url + progressionHandler:(void (^)())progressionHander + completionHandler:(void (^)(int error_code))completionHandler; + +@property(nonatomic, readonly) WKDownload* download API_AVAILABLE(ios(15)); +@property(nonatomic, readonly) NSURLResponse* response; +@property(nonatomic, readonly) NSString* suggestedFilename; +@property(nonatomic, readonly) NSProgress* progress; +@property(nonatomic, readonly) NSURL* urlForDownload; + +@end + +#endif // IOS_WEB_DOWNLOAD_DOWNLOAD_NATIVE_TASK_BRIDGE_H_
diff --git a/ios/web/download/download_native_task_bridge.mm b/ios/web/download/download_native_task_bridge.mm new file mode 100644 index 0000000..02db3a9 --- /dev/null +++ b/ios/web/download/download_native_task_bridge.mm
@@ -0,0 +1,116 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web/download/download_native_task_bridge.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation DownloadNativeTaskBridge { + void (^_startDownloadBlock)(NSURL*); + id<DownloadNativeTaskBridgeReadyDelegate> _readyDelegate; + void (^_progressionHandler)(); + void (^_completionHandler)(int error_code); +} + +- (instancetype)initWithDownload:(WKDownload*)download + downloadReadyDelegate: + (id<DownloadNativeTaskBridgeReadyDelegate>)readyDelegate + API_AVAILABLE(ios(15)) { + if ((self = [super init])) { + _download = download; + _readyDelegate = readyDelegate; + _download.delegate = self; + } + return self; +} + +- (void)cancel { + if (_startDownloadBlock) { + // WKDownload will pass a block to its delegate when calling its + // - download:decideDestinationUsingResponse:suggestedFilename + //:completionHandler: method. WKDownload enforces that this block is called + // before the object is destroyed or the download is cancelled. Thus it + // must be called now. + // + // Call it with a temporary path, and schedule a block to delete + // the file later (to avoid keeping the file around). + NSURL* url = [NSURL + fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: + self.suggestedFilename]]; + + _startDownloadBlock(url); + _startDownloadBlock = nil; + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{ + NSFileManager* manager = [NSFileManager defaultManager]; + [manager removeItemAtURL:url error:nil]; + }); + } + + [_download cancel:^(NSData* data){/* do nothing */}]; + _download = nil; +} + +- (void)startDownload:(NSURL*)url + progressionHandler:(void (^)())progressionHandler + completionHandler:(void (^)(int error_code))completionHandler { + _progressionHandler = progressionHandler; + _completionHandler = completionHandler; + + [_download.progress addObserver:self + forKeyPath:@"fractionCompleted" + options:NSKeyValueObservingOptionNew + context:nil]; + + _urlForDownload = [url copy]; + + _startDownloadBlock(_urlForDownload); + _startDownloadBlock = nil; +} + +#pragma mark - Properties + +- (NSProgress*)progress { + return _download.progress; +} + +#pragma mark - WKDownloadDelegate + +- (void)download:(WKDownload*)download + decideDestinationUsingResponse:(NSURLResponse*)response + suggestedFilename:(NSString*)suggestedFilename + completionHandler: + (void (^)(NSURL* destination))completionHandler API_AVAILABLE(ios(15)) { + _response = response; + _suggestedFilename = suggestedFilename; + _startDownloadBlock = completionHandler; + + [_readyDelegate onDownloadNativeTaskBridgeReadyForDownload:self]; +} + +- (void)download:(WKDownload*)download + didFailWithError:(NSError*)error + resumeData:(NSData*)resumeData API_AVAILABLE(ios(15)) { + if (_completionHandler) + (_completionHandler)(error.code); +} + +- (void)downloadDidFinish:(WKDownload*)download API_AVAILABLE(ios(15)) { + if (_completionHandler) + (_completionHandler)(0); +} + +#pragma mark - KVO + +- (void)observeValueForKeyPath:(NSString*)keyPath + ofObject:(id)object + change:(NSDictionary*)change + context:(void*)context API_AVAILABLE(ios(15)) { + if (_progressionHandler) + _progressionHandler(); +} + +@end
diff --git a/ios/web/download/download_native_task_impl.h b/ios/web/download/download_native_task_impl.h new file mode 100644 index 0000000..3f38c9f --- /dev/null +++ b/ios/web/download/download_native_task_impl.h
@@ -0,0 +1,61 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_DOWNLOAD_DOWNLOAD_NATIVE_TASK_IMPL_H_ +#define IOS_WEB_DOWNLOAD_DOWNLOAD_NATIVE_TASK_IMPL_H_ + +#import <WebKit/WebKit.h> + +#include "base/sequence_checker.h" +#include "ios/web/download/download_task_impl.h" + +@class DownloadNativeTaskBridge; + +namespace web { + +// Implementation of DownloadTaskImpl that uses WKDownload (wrapped in +// NativeTaskBridge) to perform the download +class DownloadNativeTaskImpl final : public DownloadTaskImpl { + public: + // Constructs a new DownloadSessionTaskImpl objects. |web_state|, |identifier| + // |delegate|, and |download| must be valid. + DownloadNativeTaskImpl(WebState* web_state, + const GURL& original_url, + NSString* http_method, + const std::string& content_disposition, + int64_t total_bytes, + const std::string& mime_type, + NSString* identifier, + DownloadNativeTaskBridge* download, + Delegate* delegate) API_AVAILABLE(ios(15)); + + DownloadNativeTaskImpl(const DownloadNativeTaskImpl&) = delete; + DownloadNativeTaskImpl& operator=(const DownloadNativeTaskImpl&) = delete; + + ~DownloadNativeTaskImpl() final; + + // DownloadTaskImpl overrides: + void Start(const base::FilePath& path, Destination destination_hint) final; + void Cancel() final; + void ShutDown() final; + + // DownloadTask overrides: + NSData* GetResponseData() const final; + const base::FilePath& GetResponsePath() const final; + int64_t GetTotalBytes() const final; + int64_t GetReceivedBytes() const final; + int GetPercentComplete() const final; + std::u16string GetSuggestedFilename() const final; + + private: + DownloadNativeTaskBridge* download_bridge_ API_AVAILABLE(ios(15)) = nil; + base::FilePath download_path_; + SEQUENCE_CHECKER(sequence_checker_); + + base::WeakPtrFactory<DownloadNativeTaskImpl> weak_factory_{this}; +}; + +} // namespace web + +#endif // IOS_WEB_DOWNLOAD_DOWNLOAD_NATIVE_TASK_IMPL_H_
diff --git a/ios/web/download/download_native_task_impl.mm b/ios/web/download/download_native_task_impl.mm new file mode 100644 index 0000000..4d9fce24 --- /dev/null +++ b/ios/web/download/download_native_task_impl.mm
@@ -0,0 +1,160 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web/download/download_native_task_impl.h" + +#include "base/strings/sys_string_conversions.h" +#import "ios/web/download/download_native_task_bridge.h" +#include "ios/web/public/thread/web_thread.h" +#import "net/base/filename_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using web::WebThread; + +namespace web { + +DownloadNativeTaskImpl::DownloadNativeTaskImpl( + WebState* web_state, + const GURL& original_url, + NSString* http_method, + const std::string& content_disposition, + int64_t total_bytes, + const std::string& mime_type, + NSString* identifier, + DownloadNativeTaskBridge* download, + Delegate* delegate) + : DownloadTaskImpl(web_state, + original_url, + http_method, + content_disposition, + total_bytes, + mime_type, + identifier, + delegate), + download_bridge_(download) { + DCHECK(download_bridge_); +} + +DownloadNativeTaskImpl::~DownloadNativeTaskImpl() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (@available(iOS 15, *)) { + [download_bridge_ cancel]; + download_bridge_ = nil; + } +} + +void DownloadNativeTaskImpl::Start(const base::FilePath& path, + Destination destination_hint) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DownloadTaskImpl::Start(path, destination_hint); + download_path_ = path; + // WKDownload can only download to a file. If the user has + // not specified a destination path, save the file to the + // suggested file name in a temporary directory. + if (download_path_.empty()) { + NSString* temporary_directory = NSTemporaryDirectory(); + NSString* temporary_filename = [temporary_directory + stringByAppendingPathComponent:base::SysUTF16ToNSString( + GetSuggestedFilename())]; + download_path_ = + base::FilePath(base::SysNSStringToUTF8(temporary_filename)); + } + + if (@available(iOS 15, *)) { + DCHECK(download_bridge_); + NSURL* downloadURL = [NSURL + fileURLWithPath:base::SysUTF8ToNSString(download_path_.AsUTF8Unsafe())]; + + base::WeakPtr<DownloadNativeTaskImpl> weak_this = + weak_factory_.GetWeakPtr(); + [download_bridge_ startDownload:downloadURL + progressionHandler:^() { + DownloadNativeTaskImpl* task = weak_this.get(); + if (task) + task->OnDownloadUpdated(); + } + completionHandler:^(int error_code) { + DownloadNativeTaskImpl* task = weak_this.get(); + if (task) + task->OnDownloadFinished(error_code); + }]; + } +} + +void DownloadNativeTaskImpl::Cancel() { + DCHECK_CURRENTLY_ON(web::WebThread::UI); + if (@available(iOS 15, *)) { + [download_bridge_ cancel]; + download_bridge_ = nil; + } + DownloadTaskImpl::Cancel(); +} + +void DownloadNativeTaskImpl::ShutDown() { + DCHECK_CURRENTLY_ON(web::WebThread::UI); + if (@available(iOS 15, *)) { + [download_bridge_ cancel]; + download_bridge_ = nil; + } + DownloadTaskImpl::ShutDown(); +} + +NSData* DownloadNativeTaskImpl::GetResponseData() const { + if (@available(iOS 15, *)) { + return [NSData dataWithContentsOfURL:[download_bridge_ urlForDownload]]; + } + return nil; +} + +const base::FilePath& DownloadNativeTaskImpl::GetResponsePath() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (@available(iOS 15, *)) { + return download_path_; + } + static const base::FilePath kEmptyPath; + return kEmptyPath; +} + +int64_t DownloadNativeTaskImpl::GetTotalBytes() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (@available(iOS 15, *)) { + return download_bridge_.progress.totalUnitCount; + } + return total_bytes_; +} + +int64_t DownloadNativeTaskImpl::GetReceivedBytes() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (@available(iOS 15, *)) { + return download_bridge_.progress.completedUnitCount; + } + return received_bytes_; +} + +int DownloadNativeTaskImpl::GetPercentComplete() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (@available(iOS 15, *)) { + return static_cast<int>(download_bridge_.progress.fractionCompleted * 100); + } + return percent_complete_; +} + +std::u16string DownloadNativeTaskImpl::GetSuggestedFilename() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + std::string suggested_filename; + if (@available(iOS 15, *)) { + suggested_filename = + base::SysNSStringToUTF8(download_bridge_.suggestedFilename); + } + return net::GetSuggestedFilename(GetOriginalUrl(), GetContentDisposition(), + /*referrer_charset=*/std::string(), + /*suggested_name=*/suggested_filename, + /*mime_type=*/std::string(), + /*default_name=*/"document"); +} + +} // namespace web
diff --git a/ios/web/download/download_native_task_impl_unittest.mm b/ios/web/download/download_native_task_impl_unittest.mm new file mode 100644 index 0000000..82afc13 --- /dev/null +++ b/ios/web/download/download_native_task_impl_unittest.mm
@@ -0,0 +1,149 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web/download/download_native_task_impl.h" + +#include "base/run_loop.h" +#include "base/strings/utf_string_conversions.h" +#import "base/test/ios/wait_util.h" +#import "ios/web/public/download/download_controller.h" +#import "ios/web/public/download/download_task_observer.h" +#import "ios/web/public/test/fakes/fake_web_state.h" +#include "ios/web/public/test/web_test.h" +#import "ios/web/test/fakes/fake_native_task_bridge.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/gtest_mac.h" +#include "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace web { + +namespace { + +const char kUrl[] = "chromium://download.test/"; +const char kContentDisposition[] = "attachment; filename=file.test"; +const char kMimeType[] = "application/pdf"; +const char kIdentifier[] = "testIdentifier"; +NSString* const kHttpMethod = @"POST"; + +class MockDownloadTaskObserver : public DownloadTaskObserver { + public: + MOCK_METHOD1(OnDownloadUpdated, void(DownloadTask* task)); + void OnDownloadDestroyed(DownloadTask* task) override { + // Removing observer here works as a test that + // DownloadTaskObserver::OnDownloadDestroyed is actually called. + // DownloadTask DCHECKs if it is destroyed without observer removal. + task->RemoveObserver(this); + } +}; + +// Mocks DownloadTaskImpl::Delegate's OnTaskUpdated and OnTaskDestroyed +// methods and stubs DownloadTaskImpl::Delegate::CreateSession with session +// mock. +class FakeDownloadNativeTaskImplDelegate : public DownloadTaskImpl::Delegate { + public: + FakeDownloadNativeTaskImplDelegate() {} + + MOCK_METHOD1(OnTaskDestroyed, void(DownloadTaskImpl* task)); + + // Returns mock, which can be accessed via session() method. + NSURLSession* CreateSession(NSString* identifier, + NSArray<NSHTTPCookie*>* cookies, + id<NSURLSessionDataDelegate> delegate, + NSOperationQueue* delegate_queue) { + // Make sure this method isn't called at all + ADD_FAILURE(); + return nil; + } +}; + +} // namespace + +// Test fixture for testing DownloadTaskImplTest class. +class DownloadNativeTaskImplTest : public PlatformTest { + protected: + DownloadNativeTaskImplTest() + : fake_task_bridge_([[FakeNativeTaskBridge alloc] + initWithDownload:fake_download + downloadReadyDelegate:fake_ready_delegate]), + task_(std::make_unique<DownloadNativeTaskImpl>(&web_state_, + GURL(kUrl), + kHttpMethod, + kContentDisposition, + /*total_bytes=*/-1, + kMimeType, + @(kIdentifier), + fake_task_bridge_, + &task_delegate_)) { + task_->AddObserver(&task_observer_); + } + + web::WebTaskEnvironment task_environment_; + FakeBrowserState browser_state_; + FakeWebState web_state_; + testing::StrictMock<FakeDownloadNativeTaskImplDelegate> task_delegate_; + WKDownload* fake_download API_AVAILABLE(ios(15)) = nil; + id<DownloadNativeTaskBridgeReadyDelegate> fake_ready_delegate; + FakeNativeTaskBridge* fake_task_bridge_; + std::unique_ptr<DownloadNativeTaskImpl> task_; + MockDownloadTaskObserver task_observer_; +}; + +// Tests DownloadNativeTaskImpl default state after construction. +TEST_F(DownloadNativeTaskImplTest, DefaultState) { + EXPECT_EQ(&web_state_, task_->GetWebState()); + EXPECT_EQ(DownloadTask::State::kNotStarted, task_->GetState()); + EXPECT_NSEQ(@(kIdentifier), task_->GetIndentifier()); + EXPECT_EQ(kUrl, task_->GetOriginalUrl()); + EXPECT_FALSE(task_->IsDone()); + EXPECT_EQ(0, task_->GetErrorCode()); + EXPECT_EQ(-1, task_->GetHttpCode()); + EXPECT_EQ(0, task_->GetReceivedBytes()); + if (@available(iOS 15, *)) { + EXPECT_EQ(0, task_->GetTotalBytes()); + EXPECT_EQ(0, task_->GetPercentComplete()); + } else { + EXPECT_EQ(-1, task_->GetTotalBytes()); + EXPECT_EQ(-1, task_->GetPercentComplete()); + } + EXPECT_EQ(kContentDisposition, task_->GetContentDisposition()); + EXPECT_EQ(kMimeType, task_->GetMimeType()); + EXPECT_EQ(kMimeType, task_->GetOriginalMimeType()); + EXPECT_EQ("file.test", base::UTF16ToUTF8(task_->GetSuggestedFilename())); + + EXPECT_CALL(task_delegate_, OnTaskDestroyed(task_.get())); +} + +TEST_F(DownloadNativeTaskImplTest, SuccessfulDownload) { + // Simulates starting and successfully completing a download + EXPECT_TRUE(fake_task_bridge_.calledStartDownloadBlock == NO); + task_->Start(base::FilePath(), DownloadTask::Destination::kToMemory); + EXPECT_EQ(DownloadTask::State::kInProgress, task_->GetState()); + if (@available(iOS 15, *)) { + EXPECT_TRUE(fake_task_bridge_.calledStartDownloadBlock == YES); + EXPECT_EQ(fake_task_bridge_.progress.totalUnitCount, 100); + } + EXPECT_CALL(task_delegate_, OnTaskDestroyed(task_.get())); +} + +TEST_F(DownloadNativeTaskImplTest, CancelledDownload) { + // Simulates download cancel and checks that |_startDownloadBlock| is called + EXPECT_TRUE(fake_task_bridge_.calledStartDownloadBlock == NO); + task_->Cancel(); + EXPECT_EQ(DownloadTask::State::kCancelled, task_->GetState()); + + if (@available(iOS 15, *)) { + EXPECT_TRUE(fake_task_bridge_.calledStartDownloadBlock == YES); + EXPECT_EQ(fake_task_bridge_.progress.totalUnitCount, 0); + EXPECT_TRUE(fake_task_bridge_.download == nil); + } + EXPECT_CALL(task_delegate_, OnTaskDestroyed(task_.get())); +} + +} // namespace web
diff --git a/ios/web/public/download/download_controller.h b/ios/web/public/download/download_controller.h index 6551531..539f35ae 100644 --- a/ios/web/public/download/download_controller.h +++ b/ios/web/public/download/download_controller.h
@@ -11,6 +11,7 @@ #include "ui/base/page_transition_types.h" +@class DownloadNativeTaskBridge; class GURL; namespace web { @@ -104,6 +105,19 @@ int64_t total_bytes, const std::string& mime_type) = 0; + // Creates a new native download task. This method uses |download| which + // is used to perform downloads using WKDownload instead of NSURLSession + // and will be supported from iOS 15+. + virtual void CreateNativeDownloadTask(WebState* web_state, + NSString* identifier, + const GURL& original_url, + NSString* http_method, + const std::string& content_disposition, + int64_t total_bytes, + const std::string& mime_type, + DownloadNativeTaskBridge* download) + API_AVAILABLE(ios(15)) = 0; + // Sets DownloadControllerDelegate. Clients must set the delegate to null in // DownloadControllerDelegate::OnDownloadControllerDestroyed(). virtual void SetDelegate(DownloadControllerDelegate* delegate) = 0;
diff --git a/ios/web/test/fakes/BUILD.gn b/ios/web/test/fakes/BUILD.gn index 6fa1fcb1..231db57 100644 --- a/ios/web/test/fakes/BUILD.gn +++ b/ios/web/test/fakes/BUILD.gn
@@ -9,6 +9,7 @@ deps = [ "//base", "//ios/third_party/webkit", + "//ios/web/download", "//ios/web/js_messaging", "//ios/web/navigation", "//ios/web/navigation:core", @@ -35,6 +36,8 @@ "crw_fake_wk_navigation_action.mm", "fake_java_script_feature.h", "fake_java_script_feature.mm", + "fake_native_task_bridge.h", + "fake_native_task_bridge.mm", "fake_navigation_manager_delegate.h", "fake_navigation_manager_delegate.mm", "fake_web_frame_impl.cc",
diff --git a/ios/web/test/fakes/fake_native_task_bridge.h b/ios/web/test/fakes/fake_native_task_bridge.h new file mode 100644 index 0000000..c743d4ce --- /dev/null +++ b/ios/web/test/fakes/fake_native_task_bridge.h
@@ -0,0 +1,30 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_TEST_FAKES_FAKE_NATIVE_TASK_BRIDGE_H_ +#define IOS_WEB_TEST_FAKES_FAKE_NATIVE_TASK_BRIDGE_H_ + +#import "ios/web/download/download_native_task_bridge.h" + +// Used to simulate methods in NativeTaskBridge +@interface FakeNativeTaskBridge : DownloadNativeTaskBridge + +// Used in testing to initialize ivars for a proper fake download and is only +// available in iOS 15+ as it uses |download| +- (void)downloadInitialized API_AVAILABLE(ios(15)); + +// Called in |_startDownloadBlock| in DownloadNativeTaskBridge to check if the +// block was called. +@property(nonatomic, readwrite) BOOL calledStartDownloadBlock; + +// Overriding properties in NativeTaskBridge to be used in unit tests +@property(nonatomic, readwrite, strong) + WKDownload* download API_AVAILABLE(ios(15)); +@property(nonatomic, readwrite, strong) NSProgress* progress; +@property(nonatomic, readwrite, strong) NSURLResponse* response; +@property(nonatomic, readwrite, strong) NSString* suggestedFilename; + +@end + +#endif // IOS_WEB_TEST_FAKES_FAKE_NATIVE_TASK_BRIDGE_H_
diff --git a/ios/web/test/fakes/fake_native_task_bridge.mm b/ios/web/test/fakes/fake_native_task_bridge.mm new file mode 100644 index 0000000..5d2f51a --- /dev/null +++ b/ios/web/test/fakes/fake_native_task_bridge.mm
@@ -0,0 +1,57 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web/test/fakes/fake_native_task_bridge.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation FakeNativeTaskBridge + +@synthesize download = _download; +@synthesize progress = _progress; +@synthesize response = _response; +@synthesize suggestedFilename = _suggestedFilename; + +- (instancetype)initWithDownload:(WKDownload*)download + downloadReadyDelegate: + (id<DownloadNativeTaskBridgeReadyDelegate>)ready { + if (self = [super initWithDownload:download downloadReadyDelegate:ready]) { + _calledStartDownloadBlock = NO; + if (@available(iOS 15, *)) + [self downloadInitialized]; + } + return self; +} + +- (void)cancel { + [super cancel]; + _progress = [NSProgress progressWithTotalUnitCount:0]; +} + +- (void)startDownload:(NSURL*)url + progressionHandler:(void (^)())progressionHandler + completionHandler:(void (^)(int error_code))completionHandler { + [super startDownload:url + progressionHandler:progressionHandler + completionHandler:completionHandler]; + + // Simulates completing a download progress + _progress = [NSProgress progressWithTotalUnitCount:100]; +} + +- (void)downloadInitialized { + // Instantiates _startDownloadBlock, so when we call + // startDownload:progressionHandler:completionHandler method, the block is + // initialized. + [super download:_download + decideDestinationUsingResponse:_response + suggestedFilename:_suggestedFilename + completionHandler:^void(NSURL* url) { + self->_calledStartDownloadBlock = YES; + }]; +} + +@end
diff --git a/media/gpu/chromeos/image_processor_factory.cc b/media/gpu/chromeos/image_processor_factory.cc index c96933a..cec60c50 100644 --- a/media/gpu/chromeos/image_processor_factory.cc +++ b/media/gpu/chromeos/image_processor_factory.cc
@@ -81,7 +81,7 @@ } #endif // BUILDFLAG(USE_VAAPI) -#if BUILDFLAG(USE_V4L2_CODEC) +#if BUILDFLAG(USE_V4L2_CODEC) && !BUILDFLAG(USE_VAAPI) std::unique_ptr<ImageProcessor> CreateV4L2ImageProcessorWithInputCandidates( const std::vector<PixelLayoutCandidate>& input_candidates, const gfx::Size& visible_size, @@ -134,7 +134,7 @@ } return nullptr; } -#endif // BUILDFLAG(USE_V4L2_CODEC) +#endif // BUILDFLAG(USE_V4L2_CODEC) && !BUILDFLAG(USE_VAAPI) } // namespace
diff --git a/media/mojo/mojom/media_player.mojom b/media/mojo/mojom/media_player.mojom index 83f8ade..1079db5 100644 --- a/media/mojo/mojom/media_player.mojom +++ b/media/mojo/mojom/media_player.mojom
@@ -106,12 +106,6 @@ // Notifies the browser process that the ability to switch audio output // devices for the associated media player has been disabled. OnAudioOutputSinkChangingDisabled(); - - // Notifies that a buffer underflow event happened for the media player. - OnBufferUnderflow(); - - // Notifies that a playback seek event happened for the media player. - OnSeek(); }; // Implemented by MediaWebContentsObserver::MediaPlayerHostImpl in the browser
diff --git a/net/cert/cert_verify_proc_builtin.cc b/net/cert/cert_verify_proc_builtin.cc index b10fadee..160d8455 100644 --- a/net/cert/cert_verify_proc_builtin.cc +++ b/net/cert/cert_verify_proc_builtin.cc
@@ -495,7 +495,9 @@ if (errors.ContainsError(cert_errors::kDistrustedByTrustStore) || errors.ContainsError(cert_errors::kVerifySignedDataFailed) || - errors.ContainsError(cert_errors::kNoIssuersFound)) { + errors.ContainsError(cert_errors::kNoIssuersFound) || + errors.ContainsError(cert_errors::kDeadlineExceeded) || + errors.ContainsError(cert_errors::kIterationLimitExceeded)) { *cert_status |= CERT_STATUS_AUTHORITY_INVALID; }
diff --git a/net/cert/cert_verify_proc_builtin_unittest.cc b/net/cert/cert_verify_proc_builtin_unittest.cc index cb1e228..1e43efa 100644 --- a/net/cert/cert_verify_proc_builtin_unittest.cc +++ b/net/cert/cert_verify_proc_builtin_unittest.cc
@@ -15,6 +15,9 @@ #include "net/cert/crl_set.h" #include "net/cert/ev_root_ca_metadata.h" #include "net/cert/internal/system_trust_store.h" +#include "net/cert/internal/trust_store.h" +#include "net/cert/internal/trust_store_collection.h" +#include "net/cert/internal/trust_store_in_memory.h" #include "net/cert_net/cert_net_fetcher_url_request.h" #include "net/der/encode_values.h" #include "net/log/net_log_with_source.h" @@ -78,6 +81,42 @@ return error; } +class MockSystemTrustStore : public SystemTrustStore { + public: + TrustStore* GetTrustStore() override { return &trust_store_; } + + bool UsesSystemTrustStore() const override { return false; } + + bool IsKnownRoot(const ParsedCertificate* trust_anchor) const override { + return false; + } + + void AddTrustStore(TrustStore* store) { trust_store_.AddTrustStore(store); } + + private: + TrustStoreCollection trust_store_; +}; + +class BlockingTrustStore : public TrustStore { + public: + CertificateTrust GetTrust(const ParsedCertificate* cert, + base::SupportsUserData* debug_data) const override { + return backing_trust_store_.GetTrust(cert, debug_data); + } + + void SyncGetIssuersOf(const ParsedCertificate* cert, + ParsedCertificateList* issuers) override { + sync_get_issuer_started_event_.Signal(); + sync_get_issuer_ok_to_finish_event_.Wait(); + + backing_trust_store_.SyncGetIssuersOf(cert, issuers); + } + + base::WaitableEvent sync_get_issuer_started_event_; + base::WaitableEvent sync_get_issuer_ok_to_finish_event_; + TrustStoreInMemory backing_trust_store_; +}; + } // namespace class CertVerifyProcBuiltinTest : public ::testing::Test { @@ -86,8 +125,10 @@ void SetUp() override { cert_net_fetcher_ = base::MakeRefCounted<CertNetFetcherURLRequest>(); - verify_proc_ = CreateCertVerifyProcBuiltin(cert_net_fetcher_, - CreateEmptySystemTrustStore()); + auto mock_system_trust_store = std::make_unique<MockSystemTrustStore>(); + mock_system_trust_store_ = mock_system_trust_store.get(); + verify_proc_ = CreateCertVerifyProcBuiltin( + cert_net_fetcher_, std::move(mock_system_trust_store)); context_ = std::make_unique<net::TestURLRequestContext>(); @@ -129,6 +170,10 @@ (*out_root)->SetValidity(not_before, not_after); } + void AddTrustStore(TrustStore* store) { + mock_system_trust_store_->AddTrustStore(store); + } + private: base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME, @@ -137,6 +182,7 @@ CertVerifier::Config config_; std::unique_ptr<net::TestURLRequestContext> context_; + MockSystemTrustStore* mock_system_trust_store_; scoped_refptr<CertVerifyProc> verify_proc_; scoped_refptr<CertNetFetcherURLRequest> cert_net_fetcher_; }; @@ -438,6 +484,53 @@ } #endif // defined(PLATFORM_USES_CHROMIUM_EV_METADATA) +TEST_F(CertVerifyProcBuiltinTest, DeadlineExceededDuringSyncGetIssuers) { + std::unique_ptr<CertBuilder> leaf, intermediate, root; + CreateChain(&leaf, &intermediate, &root); + ASSERT_TRUE(leaf && intermediate && root); + + BlockingTrustStore trust_store; + AddTrustStore(&trust_store); + + auto intermediate_parsed_cert = + ParsedCertificate::Create(intermediate->DupCertBuffer(), {}, nullptr); + ASSERT_TRUE(intermediate_parsed_cert); + trust_store.backing_trust_store_.AddCertificateWithUnspecifiedTrust( + intermediate_parsed_cert); + + scoped_refptr<X509Certificate> chain = leaf->GetX509Certificate(); + ASSERT_TRUE(chain.get()); + + CertVerifyResult verify_result; + NetLogSource verify_net_log_source; + TestCompletionCallback verify_callback; + Verify(chain.get(), "www.example.com", + /*flags=*/0, + /*additional_trust_anchors=*/{root->GetX509Certificate()}, + &verify_result, &verify_net_log_source, verify_callback.callback()); + + // Wait for trust_store.SyncGetIssuersOf to be called. + trust_store.sync_get_issuer_started_event_.Wait(); + + // Advance the clock past the verifier deadline. + const base::TimeDelta timeout_increment = + GetCertVerifyProcBuiltinTimeLimitForTesting() + base::Milliseconds(1); + task_environment().AdvanceClock(timeout_increment); + + // Signal trust_store.SyncGetIssuersOf to finish. + trust_store.sync_get_issuer_ok_to_finish_event_.Signal(); + + int error = verify_callback.WaitForResult(); + // Because the deadline was reached while retrieving the intermediate, path + // building should have stopped there and not found the root. The partial + // path built up to that point should be returned, and the error should be + // CERT_AUTHORITY_INVALID. + EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); + ASSERT_EQ(1u, verify_result.verified_cert->intermediate_buffers().size()); + EXPECT_EQ(intermediate->GetCertBuffer(), + verify_result.verified_cert->intermediate_buffers()[0].get()); +} + TEST_F(CertVerifyProcBuiltinTest, DebugData) { std::unique_ptr<CertBuilder> leaf, intermediate, root; CreateChain(&leaf, &intermediate, &root);
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index cb1009f..3c28869 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn
@@ -238,6 +238,7 @@ "chromoting_param_traits_impl.h", "client_session.cc", "client_session.h", + "client_session_events.h", "config_file_watcher.cc", "config_file_watcher.h", "config_watcher.h",
diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc index 5ee5e3c..50fb575c 100644 --- a/remoting/host/client_session.cc +++ b/remoting/host/client_session.cc
@@ -391,8 +391,9 @@ options.ApplySessionOptions(session_options); // Create the desktop environment. Drop the connection if it could not be // created for any reason (for instance the curtain could not initialize). - desktop_environment_ = - desktop_environment_factory_->Create(weak_factory_.GetWeakPtr(), options); + desktop_environment_ = desktop_environment_factory_->Create( + client_session_control_weak_factory_.GetWeakPtr(), + client_session_events_weak_factory_.GetWeakPtr(), options); if (!desktop_environment_) { DisconnectSession(protocol::HOST_CONFIGURATION_ERROR); return; @@ -514,7 +515,8 @@ HOST_LOG << "Client disconnected: " << client_jid_ << "; error = " << error; // Ignore any further callbacks. - weak_factory_.InvalidateWeakPtrs(); + client_session_control_weak_factory_.InvalidateWeakPtrs(); + client_session_events_weak_factory_.InvalidateWeakPtrs(); // If the client never authenticated then the session failed. if (!is_authenticated_) @@ -909,6 +911,32 @@ connection_->client_stub()->SetVideoLayout(layout); } +void ClientSession::OnDesktopAttached(uint32_t session_id) { + if (remote_webauthn_message_handler_) { + // On Windows, only processes running on an attached desktop session can + // bind ChromotingHostServices, so we notify the extension that it might be + // able to connect now. + remote_webauthn_message_handler_->NotifyWebAuthnStateChange(); + } +} + +void ClientSession::OnDesktopDetached() { + // Clear ChromotingSessionServices receivers and all other receivers brokered + // by ChromotingSessionServices, as they are scoped to desktop session that + // is being detached. + // TODO(yuweih): If we decide to start the IPC server per remote session, then + // we may just stop the server here instead, which will automatically + // disconnect all ongoing IPCs. + session_services_receivers_.Clear(); + if (remote_webauthn_message_handler_) { + remote_webauthn_message_handler_->ClearReceivers(); + remote_webauthn_message_handler_->NotifyWebAuthnStateChange(); + } + if (remote_open_url_message_handler_) { + remote_open_url_message_handler_->ClearReceivers(); + } +} + void ClientSession::CreateFileTransferMessageHandler( const std::string& channel_name, std::unique_ptr<protocol::MessagePipe> pipe) {
diff --git a/remoting/host/client_session.h b/remoting/host/client_session.h index 8d6cbd6..5c563cd 100644 --- a/remoting/host/client_session.h +++ b/remoting/host/client_session.h
@@ -20,6 +20,7 @@ #include "mojo/public/cpp/bindings/receiver_set.h" #include "remoting/host/client_session_control.h" #include "remoting/host/client_session_details.h" +#include "remoting/host/client_session_events.h" #include "remoting/host/desktop_and_cursor_composer_notifier.h" #include "remoting/host/desktop_and_cursor_conditional_composer.h" #include "remoting/host/desktop_display_info.h" @@ -72,6 +73,7 @@ public protocol::VideoStream::Observer, public ClientSessionControl, public ClientSessionDetails, + public ClientSessionEvents, public DesktopAndCursorComposerNotifier::EventHandler, public webrtc::MouseCursorMonitor::Callback, public mojom::ChromotingSessionServices { @@ -163,6 +165,10 @@ void OnDesktopDisplayChanged( std::unique_ptr<protocol::VideoLayout> layout) override; + // ClientSessionEvents interface. + void OnDesktopAttached(uint32_t session_id) override; + void OnDesktopDetached() override; + // ClientSessionDetails interface. uint32_t desktop_session_id() const override; ClientSessionControl* session_control() override; @@ -391,7 +397,11 @@ // Used to disable callbacks to |this| once DisconnectSession() has been // called. - base::WeakPtrFactory<ClientSessionControl> weak_factory_{this}; + base::WeakPtrFactory<ClientSessionControl> + client_session_control_weak_factory_{this}; + + base::WeakPtrFactory<ClientSessionEvents> client_session_events_weak_factory_{ + this}; }; } // namespace remoting
diff --git a/remoting/host/client_session_control.h b/remoting/host/client_session_control.h index e071363c..de94fe9 100644 --- a/remoting/host/client_session_control.h +++ b/remoting/host/client_session_control.h
@@ -23,7 +23,7 @@ // temporarily if the local mouse movements are detected). class ClientSessionControl { public: - virtual ~ClientSessionControl() {} + virtual ~ClientSessionControl() = default; // Returns the authenticated JID of the client session. virtual const std::string& client_jid() const = 0; @@ -43,6 +43,7 @@ virtual void SetDisableInputs(bool disable_inputs) = 0; // Called when the host desktop displays are changed. + // TODO(yuweih): Move this to ClientSessionEvents. virtual void OnDesktopDisplayChanged( std::unique_ptr<protocol::VideoLayout> layout) = 0; };
diff --git a/remoting/host/client_session_events.h b/remoting/host/client_session_events.h new file mode 100644 index 0000000..1c1f37c --- /dev/null +++ b/remoting/host/client_session_events.h
@@ -0,0 +1,33 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef REMOTING_HOST_CLIENT_SESSION_EVENTS_H_ +#define REMOTING_HOST_CLIENT_SESSION_EVENTS_H_ + +#include <stdint.h> + +namespace remoting { + +// Allow the desktop environment to trigger events on the client session. +class ClientSessionEvents { + public: + virtual ~ClientSessionEvents() = default; + + // Called when the desktop session agent is attached to the given session ID. + // This method is only called on platforms that use a multi-process + // architecture (i.e. ones where the desktop being remoted can change). + virtual void OnDesktopAttached(uint32_t session_id) = 0; + + // Called when the desktop session agent is detached from the previous desktop + // session. This method is only called on platforms that use a multi-process + // architecture (i.e. ones where the desktop being remoted can change). + virtual void OnDesktopDetached() = 0; + + protected: + ClientSessionEvents() = default; +}; + +} // namespace remoting + +#endif // REMOTING_HOST_CLIENT_SESSION_EVENTS_H_
diff --git a/remoting/host/desktop_environment.h b/remoting/host/desktop_environment.h index 98b11e82..11b3043 100644 --- a/remoting/host/desktop_environment.h +++ b/remoting/host/desktop_environment.h
@@ -25,6 +25,7 @@ class ActionExecutor; class AudioCapturer; class ClientSessionControl; +class ClientSessionEvents; class FileOperations; class InputInjector; class KeyboardLayoutMonitor; @@ -79,7 +80,7 @@ // Used to create |DesktopEnvironment| instances. class DesktopEnvironmentFactory { public: - virtual ~DesktopEnvironmentFactory() {} + virtual ~DesktopEnvironmentFactory() = default; // Creates an instance of |DesktopEnvironment|. Returns a nullptr pointer if // the desktop environment could not be created for any reason (if the curtain @@ -87,6 +88,7 @@ // the created desktop environment. virtual std::unique_ptr<DesktopEnvironment> Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) = 0; // Returns |true| if created |DesktopEnvironment| instances support audio
diff --git a/remoting/host/desktop_session_agent.cc b/remoting/host/desktop_session_agent.cc index 8c2378b..067fad0 100644 --- a/remoting/host/desktop_session_agent.cc +++ b/remoting/host/desktop_session_agent.cc
@@ -392,7 +392,8 @@ // Create a desktop environment for the new session. desktop_environment_ = delegate_->desktop_environment_factory().Create( - weak_factory_.GetWeakPtr(), options); + weak_factory_.GetWeakPtr(), /* client_session_events= */ nullptr, + options); // Create the session controller and set the initial screen resolution. screen_controls_ = desktop_environment_->CreateScreenControls();
diff --git a/remoting/host/desktop_session_proxy.cc b/remoting/host/desktop_session_proxy.cc index 814a8ce79..76ad4e2 100644 --- a/remoting/host/desktop_session_proxy.cc +++ b/remoting/host/desktop_session_proxy.cc
@@ -103,12 +103,14 @@ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, base::WeakPtr<DesktopSessionConnector> desktop_session_connector, const DesktopEnvironmentOptions& options) : audio_capture_task_runner_(audio_capture_task_runner), caller_task_runner_(caller_task_runner), io_task_runner_(io_task_runner), client_session_control_(client_session_control), + client_session_events_(client_session_events), desktop_session_connector_(desktop_session_connector), ipc_file_operations_factory_(this), pending_capture_frame_requests_(0), @@ -301,6 +303,10 @@ DCHECK(caller_task_runner_->BelongsToCurrentThread()); DCHECK(!desktop_channel_); + if (client_session_events_) { + client_session_events_->OnDesktopAttached(session_id); + } + // Ignore the attach notification if the client session has been disconnected // already. if (!client_session_control_.get()) @@ -343,6 +349,10 @@ video_capturer_->OnCaptureResult( webrtc::DesktopCapturer::Result::ERROR_TEMPORARY, nullptr); } + + if (client_session_events_) { + client_session_events_->OnDesktopDetached(); + } } void DesktopSessionProxy::SetAudioCapturer(
diff --git a/remoting/host/desktop_session_proxy.h b/remoting/host/desktop_session_proxy.h index f2d0d5b..bda9f06f 100644 --- a/remoting/host/desktop_session_proxy.h +++ b/remoting/host/desktop_session_proxy.h
@@ -89,6 +89,7 @@ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, base::WeakPtr<DesktopSessionConnector> desktop_session_connector, const DesktopEnvironmentOptions& options); @@ -250,6 +251,9 @@ // Used to disconnect the client session. base::WeakPtr<ClientSessionControl> client_session_control_; + // Used to trigger events on the client session. + base::WeakPtr<ClientSessionEvents> client_session_events_; + // Used to create a desktop session and receive notifications every time // the desktop process is replaced. base::WeakPtr<DesktopSessionConnector> desktop_session_connector_;
diff --git a/remoting/host/fake_desktop_environment.cc b/remoting/host/fake_desktop_environment.cc index e253c17..8f5c3009 100644 --- a/remoting/host/fake_desktop_environment.cc +++ b/remoting/host/fake_desktop_environment.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/memory/weak_ptr.h" #include "remoting/host/audio_capturer.h" #include "remoting/host/desktop_capturer_proxy.h" #include "remoting/host/fake_keyboard_layout_monitor.h" @@ -146,6 +147,7 @@ // DesktopEnvironmentFactory implementation. std::unique_ptr<DesktopEnvironment> FakeDesktopEnvironmentFactory::Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) { std::unique_ptr<FakeDesktopEnvironment> result( new FakeDesktopEnvironment(capture_thread_, options));
diff --git a/remoting/host/fake_desktop_environment.h b/remoting/host/fake_desktop_environment.h index 8324dc4..e8f59588 100644 --- a/remoting/host/fake_desktop_environment.h +++ b/remoting/host/fake_desktop_environment.h
@@ -155,6 +155,7 @@ // DesktopEnvironmentFactory implementation. std::unique_ptr<DesktopEnvironment> Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) override; bool SupportsAudioCapture() const override;
diff --git a/remoting/host/host_mock_objects.cc b/remoting/host/host_mock_objects.cc index c30c362..4773d5f 100644 --- a/remoting/host/host_mock_objects.cc +++ b/remoting/host/host_mock_objects.cc
@@ -73,6 +73,7 @@ std::unique_ptr<DesktopEnvironment> MockDesktopEnvironmentFactory::Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) { return base::WrapUnique(CreatePtr()); } @@ -94,6 +95,10 @@ MockClientSessionDetails::~MockClientSessionDetails() = default; +MockClientSessionEvents::MockClientSessionEvents() = default; + +MockClientSessionEvents::~MockClientSessionEvents() = default; + MockClientSessionEventHandler::MockClientSessionEventHandler() = default; MockClientSessionEventHandler::~MockClientSessionEventHandler() = default;
diff --git a/remoting/host/host_mock_objects.h b/remoting/host/host_mock_objects.h index 00b0eb70..2601ff0 100644 --- a/remoting/host/host_mock_objects.h +++ b/remoting/host/host_mock_objects.h
@@ -18,6 +18,7 @@ #include "remoting/host/client_session.h" #include "remoting/host/client_session_control.h" #include "remoting/host/client_session_details.h" +#include "remoting/host/client_session_events.h" #include "remoting/host/desktop_environment.h" #include "remoting/host/host_status_observer.h" #include "remoting/host/input_injector.h" @@ -115,6 +116,15 @@ MOCK_CONST_METHOD0(desktop_session_id, uint32_t()); }; +class MockClientSessionEvents : public ClientSessionEvents { + public: + MockClientSessionEvents(); + ~MockClientSessionEvents() override; + + MOCK_METHOD(void, OnDesktopAttached, (uint32_t session_id), (override)); + MOCK_METHOD(void, OnDesktopDetached, (), (override)); +}; + class MockClientSessionEventHandler : public ClientSession::EventHandler { public: MockClientSessionEventHandler(); @@ -151,6 +161,7 @@ std::unique_ptr<DesktopEnvironment> Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) override; };
diff --git a/remoting/host/ipc_desktop_environment.cc b/remoting/host/ipc_desktop_environment.cc index 6a2e7b6..f9f4441 100644 --- a/remoting/host/ipc_desktop_environment.cc +++ b/remoting/host/ipc_desktop_environment.cc
@@ -35,6 +35,7 @@ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, base::WeakPtr<DesktopSessionConnector> desktop_session_connector, const DesktopEnvironmentOptions& options) : desktop_session_proxy_( @@ -42,6 +43,7 @@ caller_task_runner, io_task_runner, client_session_control, + client_session_events, desktop_session_connector, options)) { DCHECK(caller_task_runner->BelongsToCurrentThread()); @@ -123,12 +125,14 @@ std::unique_ptr<DesktopEnvironment> IpcDesktopEnvironmentFactory::Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) { DCHECK(caller_task_runner_->BelongsToCurrentThread()); return std::make_unique<IpcDesktopEnvironment>( audio_task_runner_, caller_task_runner_, io_task_runner_, - client_session_control, connector_factory_.GetWeakPtr(), options); + client_session_control, client_session_events, + connector_factory_.GetWeakPtr(), options); } bool IpcDesktopEnvironmentFactory::SupportsAudioCapture() const {
diff --git a/remoting/host/ipc_desktop_environment.h b/remoting/host/ipc_desktop_environment.h index 9131bc4..68d21f7 100644 --- a/remoting/host/ipc_desktop_environment.h +++ b/remoting/host/ipc_desktop_environment.h
@@ -45,6 +45,7 @@ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, base::WeakPtr<DesktopSessionConnector> desktop_session_connector, const DesktopEnvironmentOptions& options); @@ -100,6 +101,7 @@ // DesktopEnvironmentFactory implementation. std::unique_ptr<DesktopEnvironment> Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) override; bool SupportsAudioCapture() const override;
diff --git a/remoting/host/ipc_desktop_environment_unittest.cc b/remoting/host/ipc_desktop_environment_unittest.cc index 1333e13..193e8bcc 100644 --- a/remoting/host/ipc_desktop_environment_unittest.cc +++ b/remoting/host/ipc_desktop_environment_unittest.cc
@@ -14,6 +14,7 @@ #include "base/callback_helpers.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "base/message_loop/message_pump_type.h" #include "base/process/process.h" #include "base/process/process_handle.h" @@ -303,6 +304,10 @@ MockClientSessionControl client_session_control_; base::WeakPtrFactory<ClientSessionControl> client_session_control_factory_; + MockClientSessionEvents client_session_events_; + base::WeakPtrFactory<MockClientSessionEvents> client_session_events_factory_{ + &client_session_events_}; + private: // Runs until there are no references to |task_runner_|. base::RunLoop main_run_loop_; @@ -369,7 +374,7 @@ task_runner_, task_runner_, io_task_runner_, &daemon_channel_); desktop_environment_ = desktop_environment_factory_->Create( client_session_control_factory_.GetWeakPtr(), - DesktopEnvironmentOptions()); + client_session_events_factory_.GetWeakPtr(), DesktopEnvironmentOptions()); screen_controls_ = desktop_environment_->CreateScreenControls(); @@ -574,7 +579,7 @@ // Create an environment with multi touch enabled. desktop_environment_ = desktop_environment_factory_->Create( client_session_control_factory_.GetWeakPtr(), - DesktopEnvironmentOptions()); + client_session_events_factory_.GetWeakPtr(), DesktopEnvironmentOptions()); std::unique_ptr<protocol::MockClipboardStub> clipboard_stub( new protocol::MockClipboardStub());
diff --git a/remoting/host/it2me_desktop_environment.cc b/remoting/host/it2me_desktop_environment.cc index 27d95b9..43bc1f8a8 100644 --- a/remoting/host/it2me_desktop_environment.cc +++ b/remoting/host/it2me_desktop_environment.cc
@@ -99,6 +99,7 @@ std::unique_ptr<DesktopEnvironment> It2MeDesktopEnvironmentFactory::Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) { DCHECK(caller_task_runner()->BelongsToCurrentThread());
diff --git a/remoting/host/it2me_desktop_environment.h b/remoting/host/it2me_desktop_environment.h index c4ac81df..a61f8f64 100644 --- a/remoting/host/it2me_desktop_environment.h +++ b/remoting/host/it2me_desktop_environment.h
@@ -65,6 +65,7 @@ // DesktopEnvironmentFactory interface. std::unique_ptr<DesktopEnvironment> Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) override; };
diff --git a/remoting/host/me2me_desktop_environment.cc b/remoting/host/me2me_desktop_environment.cc index 0559d729..f9e071a 100644 --- a/remoting/host/me2me_desktop_environment.cc +++ b/remoting/host/me2me_desktop_environment.cc
@@ -197,6 +197,7 @@ std::unique_ptr<DesktopEnvironment> Me2MeDesktopEnvironmentFactory::Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) { DCHECK(caller_task_runner()->BelongsToCurrentThread());
diff --git a/remoting/host/me2me_desktop_environment.h b/remoting/host/me2me_desktop_environment.h index fbc625c..60d8435 100644 --- a/remoting/host/me2me_desktop_environment.h +++ b/remoting/host/me2me_desktop_environment.h
@@ -74,6 +74,7 @@ // DesktopEnvironmentFactory interface. std::unique_ptr<DesktopEnvironment> Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) override; };
diff --git a/remoting/host/remote_open_url/remote_open_url_message_handler.cc b/remoting/host/remote_open_url/remote_open_url_message_handler.cc index 14edac1..ff7476cc 100644 --- a/remoting/host/remote_open_url/remote_open_url_message_handler.cc +++ b/remoting/host/remote_open_url/remote_open_url_message_handler.cc
@@ -54,6 +54,12 @@ AddReceiverAndGetReceiverId(std::move(receiver)); } +void RemoteOpenUrlMessageHandler::ClearReceivers() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + receivers_.Clear(); +} + void RemoteOpenUrlMessageHandler::OnIncomingMessage( std::unique_ptr<CompoundBuffer> message) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/remoting/host/remote_open_url/remote_open_url_message_handler.h b/remoting/host/remote_open_url/remote_open_url_message_handler.h index 97abd85..c738c37 100644 --- a/remoting/host/remote_open_url/remote_open_url_message_handler.h +++ b/remoting/host/remote_open_url/remote_open_url_message_handler.h
@@ -33,6 +33,7 @@ // Adds a receiver to the receiver set. void AddReceiver(mojo::PendingReceiver<mojom::RemoteUrlOpener> receiver); + void ClearReceivers(); // protocol::NamedMessagePipeHandler overrides. void OnIncomingMessage(std::unique_ptr<CompoundBuffer> message) override;
diff --git a/remoting/host/webauthn/BUILD.gn b/remoting/host/webauthn/BUILD.gn index 41fb005..946aaed 100644 --- a/remoting/host/webauthn/BUILD.gn +++ b/remoting/host/webauthn/BUILD.gn
@@ -8,6 +8,8 @@ sources = [ "remote_webauthn_constants.cc", "remote_webauthn_constants.h", + "remote_webauthn_extension_notifier.cc", + "remote_webauthn_extension_notifier.h", "remote_webauthn_message_handler.cc", "remote_webauthn_message_handler.h", "remote_webauthn_native_messaging_host.cc",
diff --git a/remoting/host/webauthn/remote_webauthn_extension_notifier.cc b/remoting/host/webauthn/remote_webauthn_extension_notifier.cc new file mode 100644 index 0000000..46292a4 --- /dev/null +++ b/remoting/host/webauthn/remote_webauthn_extension_notifier.cc
@@ -0,0 +1,22 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "remoting/host/webauthn/remote_webauthn_extension_notifier.h" + +#include "base/notreached.h" + +namespace remoting { + +RemoteWebAuthnExtensionNotifier::RemoteWebAuthnExtensionNotifier() = default; + +RemoteWebAuthnExtensionNotifier::~RemoteWebAuthnExtensionNotifier() = default; + +void RemoteWebAuthnExtensionNotifier::NotifyStateChange() { + // TODO(yuweih): Replace with real implementation. Also NotifyStateChange() + // might get called multiple times in the same turn of the message loop, so + // the calls should be deduplicated by posting a task to the task runner. + NOTIMPLEMENTED(); +} + +} // namespace remoting
diff --git a/remoting/host/webauthn/remote_webauthn_extension_notifier.h b/remoting/host/webauthn/remote_webauthn_extension_notifier.h new file mode 100644 index 0000000..04c33846 --- /dev/null +++ b/remoting/host/webauthn/remote_webauthn_extension_notifier.h
@@ -0,0 +1,29 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef REMOTING_HOST_WEBAUTHN_REMOTE_WEBAUTHN_EXTENSION_NOTIFIER_H_ +#define REMOTING_HOST_WEBAUTHN_REMOTE_WEBAUTHN_EXTENSION_NOTIFIER_H_ + +namespace remoting { + +// Class to notify the remote WebAuthn proxy extension of possible changes in +// the state of whether WebAuthn proxying is allowed in the current desktop +// session. +class RemoteWebAuthnExtensionNotifier final { + public: + RemoteWebAuthnExtensionNotifier(); + RemoteWebAuthnExtensionNotifier(const RemoteWebAuthnExtensionNotifier&) = + delete; + RemoteWebAuthnExtensionNotifier& operator=( + const RemoteWebAuthnExtensionNotifier&) = delete; + ~RemoteWebAuthnExtensionNotifier(); + + // Notifies the extension that the remote WebAuthn state has possibly changed. + // Safe to call this method when the state has not changed. + void NotifyStateChange(); +}; + +} // namespace remoting + +#endif // REMOTING_HOST_WEBAUTHN_REMOTE_WEBAUTHN_EXTENSION_NOTIFIER_H_
diff --git a/remoting/host/webauthn/remote_webauthn_message_handler.cc b/remoting/host/webauthn/remote_webauthn_message_handler.cc index 09a2c48..1baeaad 100644 --- a/remoting/host/webauthn/remote_webauthn_message_handler.cc +++ b/remoting/host/webauthn/remote_webauthn_message_handler.cc
@@ -24,12 +24,13 @@ RemoteWebAuthnMessageHandler::~RemoteWebAuthnMessageHandler() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - OnDisconnecting(); + DCHECK(!connected()); } void RemoteWebAuthnMessageHandler::OnConnected() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + NotifyWebAuthnStateChange(); } void RemoteWebAuthnMessageHandler::OnIncomingMessage( @@ -63,6 +64,8 @@ VLOG(1) << "Number of bound receivers on disconnecting: " << receiver_set_.size(); receiver_set_.Clear(); + + NotifyWebAuthnStateChange(); } void RemoteWebAuthnMessageHandler:: @@ -91,6 +94,18 @@ VLOG(1) << "New receiver added. Receiver ID: " << id; } +void RemoteWebAuthnMessageHandler::ClearReceivers() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + receiver_set_.Clear(); +} + +void RemoteWebAuthnMessageHandler::NotifyWebAuthnStateChange() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + extension_notifier_.NotifyStateChange(); +} + base::WeakPtr<RemoteWebAuthnMessageHandler> RemoteWebAuthnMessageHandler::GetWeakPtr() { return weak_factory_.GetWeakPtr();
diff --git a/remoting/host/webauthn/remote_webauthn_message_handler.h b/remoting/host/webauthn/remote_webauthn_message_handler.h index 8fe3ecb..3116a0fd 100644 --- a/remoting/host/webauthn/remote_webauthn_message_handler.h +++ b/remoting/host/webauthn/remote_webauthn_message_handler.h
@@ -16,6 +16,7 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "remoting/host/mojom/webauthn_proxy.mojom.h" +#include "remoting/host/webauthn/remote_webauthn_extension_notifier.h" #include "remoting/protocol/named_message_pipe_handler.h" namespace remoting { @@ -45,6 +46,11 @@ IsUserVerifyingPlatformAuthenticatorAvailableCallback callback) override; void AddReceiver(mojo::PendingReceiver<mojom::WebAuthnProxy> receiver); + void ClearReceivers(); + + // Notifies the WebAuthn proxy extension that the availablitiy of WebAuthn + // proxying may have changed. + void NotifyWebAuthnStateChange(); base::WeakPtr<RemoteWebAuthnMessageHandler> GetWeakPtr(); @@ -58,6 +64,7 @@ SEQUENCE_CHECKER(sequence_checker_); + RemoteWebAuthnExtensionNotifier extension_notifier_; mojo::ReceiverSet<mojom::WebAuthnProxy> receiver_set_; // message ID => mojo callback mappings.
diff --git a/remoting/host/win/session_desktop_environment.cc b/remoting/host/win/session_desktop_environment.cc index 3061f02..29258019 100644 --- a/remoting/host/win/session_desktop_environment.cc +++ b/remoting/host/win/session_desktop_environment.cc
@@ -77,6 +77,7 @@ std::unique_ptr<DesktopEnvironment> SessionDesktopEnvironmentFactory::Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) { DCHECK(caller_task_runner()->BelongsToCurrentThread());
diff --git a/remoting/host/win/session_desktop_environment.h b/remoting/host/win/session_desktop_environment.h index 2b4d0e6..7809c78 100644 --- a/remoting/host/win/session_desktop_environment.h +++ b/remoting/host/win/session_desktop_environment.h
@@ -67,6 +67,7 @@ // DesktopEnvironmentFactory implementation. std::unique_ptr<DesktopEnvironment> Create( base::WeakPtr<ClientSessionControl> client_session_control, + base::WeakPtr<ClientSessionEvents> client_session_events, const DesktopEnvironmentOptions& options) override; private:
diff --git a/sandbox/policy/win/sandbox_win.cc b/sandbox/policy/win/sandbox_win.cc index ba68235..497d535f 100644 --- a/sandbox/policy/win/sandbox_win.cc +++ b/sandbox/policy/win/sandbox_win.cc
@@ -916,8 +916,11 @@ GENERIC_READ | GENERIC_EXECUTE, &granted_access, &granted_access_status) && granted_access_status; - if (!access_check) + if (!access_check) { + PLOG(ERROR) << "Sandbox cannot access executable. Check filesystem " + "permissions are valid. See https://bit.ly/31yqMJR."; return SBOX_ERROR_CREATE_APPCONTAINER_ACCESS_CHECK; + } return SBOX_ALL_OK; }
diff --git a/services/network/session_cleanup_cookie_store.cc b/services/network/session_cleanup_cookie_store.cc index 5b216f4..a876da00 100644 --- a/services/network/session_cleanup_cookie_store.cc +++ b/services/network/session_cleanup_cookie_store.cc
@@ -31,10 +31,10 @@ net::NetLogCaptureMode capture_mode) { if (!net::NetLogCaptureIncludesSensitive(capture_mode)) return base::Value(); - base::DictionaryValue dict; - dict.SetString("origin", origin); - dict.SetBoolean("is_https", is_https); - return std::move(dict); + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetStringKey("origin", origin); + dict.SetBoolKey("is_https", is_https); + return dict; } } // namespace
diff --git a/testing/buildbot/chromium.angle.json b/testing/buildbot/chromium.angle.json index a47efcd..14a87e20 100644 --- a/testing/buildbot/chromium.angle.json +++ b/testing/buildbot/chromium.angle.json
@@ -610,8 +610,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -635,8 +635,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -658,7 +658,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -676,8 +676,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -711,8 +711,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -748,8 +748,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -785,8 +785,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -923,8 +923,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -949,8 +949,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -976,8 +976,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1002,8 +1002,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1028,8 +1028,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1054,8 +1054,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1080,8 +1080,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1106,8 +1106,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1133,8 +1133,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1160,8 +1160,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1187,8 +1187,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1214,8 +1214,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1241,8 +1241,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1268,8 +1268,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1295,8 +1295,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1321,8 +1321,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1347,8 +1347,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1373,8 +1373,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1400,8 +1400,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1425,8 +1425,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1450,8 +1450,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -2342,7 +2342,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -2360,7 +2360,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2397,7 +2397,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2434,7 +2434,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2471,7 +2471,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2508,7 +2508,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2544,7 +2544,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2682,7 +2682,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2709,7 +2709,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2735,7 +2735,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2762,7 +2762,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2788,7 +2788,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2814,7 +2814,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2840,7 +2840,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2866,7 +2866,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2892,7 +2892,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2918,7 +2918,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2945,7 +2945,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2972,7 +2972,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2999,7 +2999,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3026,7 +3026,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3053,7 +3053,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3080,7 +3080,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3107,7 +3107,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3134,7 +3134,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3161,7 +3161,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3187,7 +3187,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3213,7 +3213,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3239,7 +3239,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3265,7 +3265,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3290,7 +3290,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3315,7 +3315,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index c3578d7..6e87cac 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -13100,6 +13100,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14897,6 +14918,28 @@ }, { "args": [ + "--enable-features=EnableOverlayPrioritization", + "--test-launcher-print-test-stdio=always" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { + "args": [ "--test-launcher-print-test-stdio=always" ], "merge": { @@ -16487,6 +16530,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -18122,6 +18186,28 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04", + "pool": "chrome.tests" + } + ], + "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -20186,6 +20272,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -21741,6 +21848,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json index b1c29ef4..0f899a2 100644 --- a/testing/buildbot/chromium.dawn.json +++ b/testing/buildbot/chromium.dawn.json
@@ -194,6 +194,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--no-xvfb", "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan" ], @@ -227,6 +228,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--no-xvfb", "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan" ], @@ -274,8 +276,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -301,8 +303,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -328,8 +330,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -355,8 +357,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -381,8 +383,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -405,8 +407,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -435,8 +437,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -448,6 +450,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--no-xvfb", "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan" ], @@ -466,8 +469,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -481,6 +484,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--no-xvfb", "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan" ], @@ -499,8 +503,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -702,6 +706,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--no-xvfb", "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan" ], @@ -735,6 +740,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--no-xvfb", "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan" ], @@ -782,8 +788,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -809,8 +815,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -836,8 +842,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -863,8 +869,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -889,8 +895,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -913,8 +919,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -943,8 +949,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -956,6 +962,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--no-xvfb", "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan" ], @@ -974,8 +981,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -989,6 +996,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--no-xvfb", "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan" ], @@ -1007,8 +1015,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1227,6 +1235,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--platform=mac-mac11" ], "isolate_name": "webgpu_blink_web_tests", @@ -1262,6 +1271,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--platform=mac-mac11" ], "isolate_name": "webgpu_blink_web_tests", @@ -1484,6 +1494,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--platform=mac-mac11" ], "isolate_name": "webgpu_blink_web_tests", @@ -1517,6 +1528,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--platform=mac-mac11" ], "isolate_name": "webgpu_blink_web_tests", @@ -1827,6 +1839,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--platform=mac-mac11" ], "isolate_name": "webgpu_blink_web_tests", @@ -1862,6 +1875,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--platform=mac-mac11" ], "isolate_name": "webgpu_blink_web_tests", @@ -2084,6 +2098,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--platform=mac-mac11" ], "isolate_name": "webgpu_blink_web_tests", @@ -2117,6 +2132,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--platform=mac-mac11" ], "isolate_name": "webgpu_blink_web_tests", @@ -2163,7 +2179,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }, @@ -2194,7 +2210,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }, @@ -2225,7 +2241,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }, @@ -2255,7 +2271,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }, @@ -2283,7 +2299,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }, @@ -2318,7 +2334,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }, @@ -2336,6 +2352,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64", "--time-out-ms=48000" ], @@ -2354,7 +2371,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }, @@ -2558,6 +2575,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64" ], "isolate_name": "webgpu_blink_web_tests", @@ -2590,6 +2608,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-partial-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64" ], "isolate_name": "webgpu_blink_web_tests", @@ -2635,7 +2654,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2661,7 +2680,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2687,7 +2706,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2713,7 +2732,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2738,7 +2757,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2761,7 +2780,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2791,7 +2810,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2804,6 +2823,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64" ], "isolate_name": "webgpu_blink_web_tests", @@ -2821,7 +2841,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2836,6 +2856,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-partial-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64" ], "isolate_name": "webgpu_blink_web_tests", @@ -2853,7 +2874,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3050,6 +3071,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64" ], "isolate_name": "webgpu_blink_web_tests", @@ -3082,6 +3104,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-partial-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64" ], "isolate_name": "webgpu_blink_web_tests", @@ -3127,7 +3150,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3153,7 +3176,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3179,7 +3202,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3205,7 +3228,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3230,7 +3253,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3253,7 +3276,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3283,7 +3306,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3296,6 +3319,7 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64" ], "isolate_name": "webgpu_blink_web_tests", @@ -3313,7 +3337,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3328,6 +3352,7 @@ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-partial-backend-validation", "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox", "--target=Release_x64" ], "isolate_name": "webgpu_blink_web_tests", @@ -3345,7 +3370,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3543,7 +3568,8 @@ { "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", - "--flag-specific=webgpu" + "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox" ], "isolate_name": "webgpu_blink_web_tests", "merge": { @@ -3574,7 +3600,8 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-partial-backend-validation", - "--time-out-ms=30000" + "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox" ], "isolate_name": "webgpu_blink_web_tests", "merge": { @@ -3619,7 +3646,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3645,7 +3672,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3671,7 +3698,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3697,7 +3724,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3722,7 +3749,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3745,7 +3772,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3775,7 +3802,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3787,7 +3814,8 @@ { "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", - "--flag-specific=webgpu" + "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox" ], "isolate_name": "webgpu_blink_web_tests", "merge": { @@ -3804,7 +3832,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3818,7 +3846,8 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-partial-backend-validation", - "--time-out-ms=30000" + "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox" ], "isolate_name": "webgpu_blink_web_tests", "merge": { @@ -3835,7 +3864,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4031,7 +4060,8 @@ { "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", - "--flag-specific=webgpu" + "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox" ], "isolate_name": "webgpu_blink_web_tests", "merge": { @@ -4062,7 +4092,8 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-partial-backend-validation", - "--time-out-ms=30000" + "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox" ], "isolate_name": "webgpu_blink_web_tests", "merge": { @@ -4107,7 +4138,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4133,7 +4164,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4159,7 +4190,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4185,7 +4216,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4210,7 +4241,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4233,7 +4264,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4263,7 +4294,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4275,7 +4306,8 @@ { "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", - "--flag-specific=webgpu" + "--flag-specific=webgpu", + "--additional-driver-flag=--disable-gpu-sandbox" ], "isolate_name": "webgpu_blink_web_tests", "merge": { @@ -4292,7 +4324,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4306,7 +4338,8 @@ "args": [ "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--flag-specific=webgpu-with-partial-backend-validation", - "--time-out-ms=30000" + "--time-out-ms=30000", + "--additional-driver-flag=--disable-gpu-sandbox" ], "isolate_name": "webgpu_blink_web_tests", "merge": { @@ -4323,7 +4356,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index b59338c..f75378b 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -75355,6 +75355,28 @@ }, { "args": [ + "--enable-features=EnableOverlayPrioritization,PartitionAllocBackupRefPtr" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { + "args": [ "--enable-features=PartitionAllocBackupRefPtr" ], "merge": { @@ -82017,6 +82039,28 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "isolate_profile_data": true, "merge": { "args": [],
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 94f2c789..255527b 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -454,8 +454,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -479,8 +479,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -504,8 +504,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -532,8 +532,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -557,8 +557,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -580,8 +580,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -603,7 +603,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -621,8 +621,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -656,8 +656,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -693,8 +693,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -730,8 +730,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7100,8 +7100,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7125,8 +7125,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7153,8 +7153,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7178,8 +7178,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7201,8 +7201,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7221,8 +7221,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7258,8 +7258,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7293,8 +7293,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7328,8 +7328,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7363,8 +7363,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7384,7 +7384,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -7402,8 +7402,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7446,8 +7446,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7490,8 +7490,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7526,8 +7526,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7561,8 +7561,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -7597,8 +7597,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8303,7 +8303,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8329,7 +8329,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8355,7 +8355,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8385,7 +8385,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8412,7 +8412,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8441,7 +8441,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8470,7 +8470,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8498,7 +8498,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8524,7 +8524,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8548,7 +8548,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8569,7 +8569,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8607,7 +8607,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8643,7 +8643,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8679,7 +8679,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8715,7 +8715,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8755,7 +8755,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8800,7 +8800,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8836,7 +8836,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8881,7 +8881,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8918,7 +8918,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8954,7 +8954,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -8992,7 +8992,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -9030,7 +9030,7 @@ "dimension_sets": [ { "gpu": "10de:2184-440.100", - "os": "Ubuntu-18.04.5", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -9061,8 +9061,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -9086,8 +9086,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -9111,8 +9111,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -9139,8 +9139,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -9164,8 +9164,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -9187,8 +9187,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -9207,8 +9207,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11211,8 +11211,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11236,8 +11236,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11261,8 +11261,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11289,8 +11289,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11314,8 +11314,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11337,8 +11337,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11357,8 +11357,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11394,8 +11394,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11429,8 +11429,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11464,8 +11464,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11499,8 +11499,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11520,7 +11520,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -11538,8 +11538,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11582,8 +11582,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11617,8 +11617,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11661,8 +11661,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11697,8 +11697,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11732,8 +11732,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11769,8 +11769,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -11806,8 +11806,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12429,8 +12429,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12457,8 +12457,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12494,8 +12494,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12529,8 +12529,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12564,8 +12564,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12599,8 +12599,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12643,8 +12643,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12679,8 +12679,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12715,8 +12715,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12758,8 +12758,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12795,8 +12795,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -12838,8 +12838,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -23944,8 +23944,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -23970,8 +23970,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -23994,8 +23994,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -24014,8 +24014,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -24037,7 +24037,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -24055,8 +24055,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -24090,8 +24090,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -24125,8 +24125,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -24156,8 +24156,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -24193,8 +24193,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -24230,8 +24230,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -26605,7 +26605,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26631,7 +26631,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26655,7 +26655,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26680,7 +26680,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26706,7 +26706,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26726,7 +26726,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26746,7 +26746,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26770,7 +26770,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26793,7 +26793,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -26811,7 +26811,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26846,7 +26846,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26878,7 +26878,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26912,7 +26912,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26943,7 +26943,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -26980,7 +26980,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27017,7 +27017,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27054,7 +27054,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27090,7 +27090,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27127,7 +27127,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27163,7 +27163,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27199,7 +27199,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27234,7 +27234,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27263,7 +27263,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27288,7 +27288,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27313,7 +27313,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27340,7 +27340,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27364,7 +27364,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27387,7 +27387,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27412,7 +27412,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27438,7 +27438,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27458,7 +27458,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27478,7 +27478,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27501,7 +27501,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27525,7 +27525,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27562,7 +27562,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27597,7 +27597,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27632,7 +27632,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27667,7 +27667,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27688,7 +27688,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -27706,7 +27706,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27750,7 +27750,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27794,7 +27794,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27830,7 +27830,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27865,7 +27865,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27901,7 +27901,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27938,7 +27938,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -27975,7 +27975,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -28011,7 +28011,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -28083,7 +28083,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -29961,6 +29961,42 @@ ] }, "Win10 FYI x64 Release (NVIDIA GeForce GTX 1660)": { + "isolated_scripts": [ + { + "args": [ + "noop_sleep", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "noop_sleep_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "expiration": 21600, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + } + ] + }, + "Win10 FYI x64 Release (NVIDIA)": { "gtest_tests": [ { "args": [ @@ -29982,7 +30018,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 2 }, @@ -30008,7 +30043,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "angle_unittests", @@ -30034,7 +30068,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "angle_white_box_tests", @@ -30063,7 +30096,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "browser_tests", @@ -30090,7 +30122,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 2 }, @@ -30115,7 +30146,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gl_unittests", @@ -30139,7 +30169,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gles2_conform_test", @@ -30165,7 +30194,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gles2_conform_test", @@ -30192,7 +30220,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gles2_conform_test", @@ -30213,7 +30240,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gpu_unittests", @@ -30234,7 +30260,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "swiftshader_unittests", @@ -30258,7 +30283,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "vulkan_tests", @@ -30283,7 +30307,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "xr_browser_tests", @@ -30321,7 +30344,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -30357,7 +30379,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -30393,7 +30414,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -30429,7 +30449,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -30469,7 +30488,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -30514,895 +30532,6 @@ "pool": "chromium.tests.gpu" } ], - "expiration": 21600, - "idempotent": false, - "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "pixel", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle", - "--dont-restore-color-profile-after-test", - "--test-machine-name", - "${buildername}", - "--git-revision=${got_revision}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "pixel_skia_gold_passthrough_test", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "screenshot_sync", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle", - "--dont-restore-color-profile-after-test" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "screenshot_sync_passthrough_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "trace_test", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "trace_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl2_conformance_d3d11_passthrough_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_d3d11_passthrough_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_d3d9_passthrough_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-unsafe-fast-js-calls --enable-fake-no-alloc-direct-call-for-testing --use-gl=angle --use-cmd-decoder=passthrough --force_high_performance_gpu" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_fast_call_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_gl_passthrough_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_vulkan_passthrough_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:2184-27.21.14.5638", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "expiration": 21600, - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - } - ] - }, - "Win10 FYI x64 Release (NVIDIA)": { - "gtest_tests": [ - { - "args": [ - "angle_end2end_tests", - "--gtest_filter=-*Vulkan_SwiftShader*", - "--bot-mode" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "angle_end2end_tests", - "test_id_prefix": "ninja://third_party/angle/src/tests:angle_end2end_tests/", - "use_isolated_scripts_api": true - }, - { - "args": [ - "angle_unittests" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "angle_unittests", - "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", - "use_isolated_scripts_api": true - }, - { - "args": [ - "angle_white_box_tests", - "--bot-mode" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "angle_white_box_tests", - "test_id_prefix": "ninja://third_party/angle/src/tests:angle_white_box_tests/", - "use_isolated_scripts_api": true - }, - { - "args": [ - "--enable-gpu", - "--test-launcher-bot-mode", - "--test-launcher-jobs=1", - "--gtest_filter=TabCaptureApiPixelTest.EndToEnd*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "name": "tab_capture_end2end_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "browser_tests", - "test_id_prefix": "ninja://chrome/test:browser_tests/" - }, - { - "args": [ - "--use-cmd-decoder=passthrough", - "--use-gl=angle", - "--use-gpu-in-tests" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "name": "gl_tests_passthrough", - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "gl_tests", - "test_id_prefix": "ninja://gpu:gl_tests/" - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_unittests", - "test_id_prefix": "ninja://ui/gl:gl_unittests/" - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gles2_conform_test", - "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/" - }, - { - "args": [ - "--use-gpu-in-tests", - "--use-angle=d3d9" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "name": "gles2_conform_d3d9_test", - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gles2_conform_test", - "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/" - }, - { - "args": [ - "--use-gpu-in-tests", - "--use-angle=gl", - "--disable-gpu-sandbox" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "name": "gles2_conform_gl_test", - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gles2_conform_test", - "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gpu_unittests", - "test_id_prefix": "ninja://gpu:gpu_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "swiftshader_unittests", - "test_id_prefix": "ninja://third_party/swiftshader/tests/GLESUnitTests:swiftshader_unittests/" - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "vulkan_tests", - "test_id_prefix": "ninja://gpu/vulkan:vulkan_tests/" - }, - { - "args": [ - "--ignore-runtime-requirements=*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "name": "xr_browser_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "xr_browser_tests", - "test_id_prefix": "ninja://chrome/test:xr_browser_tests/" - } - ], - "isolated_scripts": [ - { - "args": [ - "context_lost", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "context_lost_passthrough_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "depth_capture", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "depth_capture_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "gpu_process", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gpu_process_launch_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "hardware_accelerated_feature", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "hardware_accelerated_feature_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "info_collection", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", - "--expected-vendor-id", - "10de", - "--expected-device-id", - "1cb3" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "info_collection_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "maps", - "--show-stdout", - "--browser=release_x64", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle", - "--dont-restore-color-profile-after-test", - "--test-machine-name", - "${buildername}", - "--git-revision=${got_revision}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "maps_pixel_passthrough_test", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-27.21.14.5148", - "os": "Windows-10-18363", - "pool": "chromium.tests.gpu" - } - ], "idempotent": false, "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" }, @@ -31430,7 +30559,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31473,7 +30602,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31500,7 +30629,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31535,7 +30664,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31570,7 +30699,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31607,7 +30736,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31644,7 +30773,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31681,7 +30810,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31717,7 +30846,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31754,7 +30883,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31790,7 +30919,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31824,7 +30953,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31847,7 +30976,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31867,7 +30996,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31913,7 +31042,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31950,7 +31079,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -31979,7 +31108,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32004,7 +31133,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32029,7 +31158,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32057,7 +31186,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32083,7 +31212,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32107,7 +31236,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32130,7 +31259,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32155,7 +31284,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32181,7 +31310,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32201,7 +31330,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32221,7 +31350,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32244,7 +31373,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32268,7 +31397,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32305,7 +31434,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32340,7 +31469,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32375,7 +31504,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32410,7 +31539,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32431,7 +31560,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -32449,7 +31578,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32493,7 +31622,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32525,7 +31654,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32568,7 +31697,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32594,7 +31723,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32629,7 +31758,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32664,7 +31793,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32701,7 +31830,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32738,7 +31867,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32775,7 +31904,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32811,7 +31940,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32848,7 +31977,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -32884,7 +32013,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json index f9ca38c..791f3da09 100644 --- a/testing/buildbot/chromium.gpu.json +++ b/testing/buildbot/chromium.gpu.json
@@ -514,8 +514,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -542,8 +542,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -567,8 +567,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -604,8 +604,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -639,8 +639,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -675,8 +675,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -710,8 +710,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -745,8 +745,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -766,7 +766,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -784,8 +784,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -828,8 +828,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -872,8 +872,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -908,8 +908,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -943,8 +943,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -979,8 +979,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1007,8 +1007,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1035,8 +1035,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1060,8 +1060,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1097,8 +1097,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1132,8 +1132,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1168,8 +1168,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1203,8 +1203,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1238,8 +1238,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1259,7 +1259,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -1277,8 +1277,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1321,8 +1321,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1365,8 +1365,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1401,8 +1401,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1436,8 +1436,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1472,8 +1472,8 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -3588,7 +3588,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3616,7 +3616,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3642,7 +3642,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3666,7 +3666,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3690,7 +3690,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3727,7 +3727,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3762,7 +3762,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3797,7 +3797,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3832,7 +3832,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3853,7 +3853,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -3871,7 +3871,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3915,7 +3915,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3959,7 +3959,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -3995,7 +3995,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4030,7 +4030,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4066,7 +4066,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4094,7 +4094,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4122,7 +4122,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4148,7 +4148,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4172,7 +4172,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4196,7 +4196,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4233,7 +4233,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4268,7 +4268,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4303,7 +4303,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4338,7 +4338,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4359,7 +4359,7 @@ "--expected-vendor-id", "10de", "--expected-device-id", - "1cb3" + "2184" ], "isolate_name": "telemetry_gpu_integration_test", "merge": { @@ -4377,7 +4377,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4421,7 +4421,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4465,7 +4465,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4492,7 +4492,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4527,7 +4527,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4562,7 +4562,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -4598,7 +4598,7 @@ "containment_type": "AUTO", "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 8198209..cce3bea 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -5961,6 +5961,28 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "isolate_profile_data": true, "merge": { "args": [], @@ -9762,6 +9784,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -11695,6 +11738,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13633,6 +13697,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-14.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -15558,6 +15643,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index ff90aa61..bc4e01e 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -17223,6 +17223,27 @@ "test_id_prefix": "ninja://components/viz:viz_unittests/" }, { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json index 164572a3..a7f16a5 100644 --- a/testing/buildbot/client.v8.fyi.json +++ b/testing/buildbot/client.v8.fyi.json
@@ -481,8 +481,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -515,8 +515,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -549,8 +549,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -583,8 +583,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -626,8 +626,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -669,8 +669,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -704,8 +704,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -738,8 +738,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -774,8 +774,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -810,8 +810,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -849,8 +849,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -883,8 +883,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -917,8 +917,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -951,8 +951,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -994,8 +994,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1037,8 +1037,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1072,8 +1072,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1106,8 +1106,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1142,8 +1142,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1178,8 +1178,8 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", + "gpu": "10de:2184-440.100", + "os": "Ubuntu-18.04.5|Ubuntu-18.04.6", "pool": "chromium.tests.gpu" } ], @@ -1916,7 +1916,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -1950,7 +1950,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -1984,7 +1984,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2018,7 +2018,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2061,7 +2061,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2104,7 +2104,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2139,7 +2139,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2173,7 +2173,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2209,7 +2209,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" } @@ -2245,7 +2245,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:1cb3-27.21.14.5148", + "gpu": "10de:2184-27.21.14.5638", "os": "Windows-10-18363", "pool": "chromium.tests.gpu" }
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index 351e4ca..cfadf5bb 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -618,19 +618,19 @@ 'swarming': { 'dimensions': { 'gpu': '10de:2184-440.100', - 'os': 'Ubuntu-18.04.5', + 'os': 'Ubuntu-18.04.5|Ubuntu-18.04.6', 'pool': 'chromium.tests.gpu', }, }, }, - 'linux_nvidia_quadro_p400_stable': { + 'linux_nvidia_gtx_1660_stable': { 'swarming': { 'dimensions': { - 'gpu': '10de:1cb3-418.56', - 'os': 'Ubuntu-19.04', + 'gpu': '10de:2184-440.100', + 'os': 'Ubuntu-18.04.5|Ubuntu-18.04.6', 'pool': 'chromium.tests.gpu', - } - } + }, + }, }, 'lollipop': { 'swarming': { @@ -1061,7 +1061,7 @@ 'win10_intel_hd_630_stable_dimension_set': { 'swarming': { # We use explicit 'dimension_sets' instead of 'dimensions' since this is - # used in conjunction with 'win10_nvidia_quadro_p400_stable_dimension_set' + # used in conjunction with 'win10_nvidia_gtx_1660_stable_dimension_set' # to trigger tests on multiple configurations. 'dimension_sets': [ { @@ -1072,7 +1072,7 @@ ], }, }, - 'win10_nvidia_geforce_gtx_1660': { + 'win10_nvidia_gtx_1660_experimental': { 'swarming': { 'dimensions': { 'gpu': '10de:2184-27.21.14.5638', @@ -1081,32 +1081,23 @@ }, }, }, - 'win10_nvidia_quadro_p400_experimental': { + 'win10_nvidia_gtx_1660_stable': { 'swarming': { 'dimensions': { - 'gpu': '10de:1cb3-27.21.14.5148', + 'gpu': '10de:2184-27.21.14.5638', 'os': 'Windows-10-18363', 'pool': 'chromium.tests.gpu', }, }, }, - 'win10_nvidia_quadro_p400_stable': { - 'swarming': { - 'dimensions': { - 'gpu': '10de:1cb3-27.21.14.5148', - 'os': 'Windows-10-18363', - 'pool': 'chromium.tests.gpu', - }, - }, - }, - # Version of win10_nvidia_quadro_p400_stable that uses 'dimension_sets' + # Version of win10_nvidia_gtx_1660_stable that uses 'dimension_sets' # instead of 'dimensions' so it can be used to trigger tests on multiple # configurations. - 'win10_nvidia_quadro_p400_stable_dimension_set': { + 'win10_nvidia_gtx_1660_stable_dimension_set': { 'swarming': { 'dimension_sets': [ { - 'gpu': '10de:1cb3-27.21.14.5148', + 'gpu': '10de:2184-27.21.14.5638', 'os': 'Windows-10-18363', 'pool': 'chromium.tests.gpu', },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index f11e76c7..5620afd 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2341,6 +2341,12 @@ 'ToTWinCFI64', ], }, + 'overlay_prioritization_viz_unittests': { + 'remove_from': [ + # Reduce CQ load + 'Linux Tests (Wayland)', + ], + }, 'ozone_unittests': { 'modifications': { 'chromeos-betty-pi-arc-chrome': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 32f658b..4326e28 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -4048,6 +4048,9 @@ '--flag-specific=webgpu-with-backend-validation', # Increase the timeout when using backend validation layers (crbug.com/1208253) '--time-out-ms=30000', + # TODO(crbug.com/1274975): Remove this once loading on newer NVIDIA + # GPUs is fixed. + '--additional-driver-flag=--disable-gpu-sandbox', ], 'win64_args': [ '--target=Release_x64' ], 'mac_args': [ @@ -4080,6 +4083,9 @@ # crbug.com/953991 Ensure WebGPU is ready before running tests '--initialize-webgpu-adapter-at-startup-timeout-ms=60000', '--flag-specific=webgpu', + # TODO(crbug.com/1274975): Remove this once loading on newer NVIDIA + # GPUs is fixed. + '--additional-driver-flag=--disable-gpu-sandbox', ], 'win64_args': [ '--target=Release_x64' ], 'mac_args': [ @@ -4116,6 +4122,9 @@ '--flag-specific=webgpu-with-partial-backend-validation', # Increase the timeout when using backend validation layers (crbug.com/1208253) '--time-out-ms=30000', + # TODO(crbug.com/1274975): Remove this once loading on newer NVIDIA + # GPUs is fixed. + '--additional-driver-flag=--disable-gpu-sandbox', ], 'win64_args': [ '--target=Release_x64' ], 'mac_args': [ @@ -4664,6 +4673,17 @@ '--shard-timeout=3000' ], 'test': 'opus_tests', + }, + }, + + # TODO(petermcneeley) : Remove once OverlayPrioritization has landed on + # all ozone platforms. + 'overlay_prioritization_gtests': { + 'overlay_prioritization_viz_unittests': { + 'args': [ + '--enable-features=EnableOverlayPrioritization' + ], + 'test': 'viz_unittests', }, }, @@ -6095,6 +6115,7 @@ 'non_android_and_cast_and_chromeos_chromium_gtests', 'non_android_chromium_gtests', 'vr_platform_specific_chromium_gtests', + 'overlay_prioritization_gtests', 'weblayer_gtests', ],
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index f84811fa..9d74b74 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1286,7 +1286,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_common_gtests_passthrough', @@ -1305,7 +1305,7 @@ 'linux-angle-nvidia': { 'os_type': 'linux', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_angle_linux_nvidia_gtests', @@ -1351,7 +1351,7 @@ 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gpu_telemetry_tests': 'gpu_angle_win_intel_nvidia_telemetry_tests', @@ -1369,7 +1369,7 @@ 'win10-angle-x64-nvidia': { 'os_type': 'win', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_angle_win_nvidia_gtests', @@ -2138,7 +2138,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', @@ -2160,7 +2160,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', @@ -2245,7 +2245,7 @@ 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable_dimension_set', + 'win10_nvidia_gtx_1660_stable_dimension_set', 'win10_intel_hd_630_stable_dimension_set', ], 'test_suites': { @@ -2270,7 +2270,7 @@ 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', @@ -2292,7 +2292,7 @@ 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', @@ -2316,7 +2316,7 @@ 'os_type': 'win', 'browser_config': 'release', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', @@ -2338,7 +2338,7 @@ 'os_type': 'win', 'browser_config': 'release', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', @@ -3826,7 +3826,7 @@ 'browser_config': 'debug', 'os_type': 'linux', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_desktop_passthrough_gtests', @@ -3837,7 +3837,7 @@ 'browser_config': 'release', 'os_type': 'linux', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_desktop_passthrough_gtests', @@ -3894,7 +3894,7 @@ 'browser_config': 'debug_x64', 'os_type': 'win', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_win_gtests', @@ -3905,7 +3905,7 @@ 'browser_config': 'release_x64', 'os_type': 'win', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_win_gtests', @@ -3953,7 +3953,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_angle_linux_gtests', @@ -4154,7 +4154,7 @@ 'browser_config': 'debug', 'os_type': 'linux', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_fyi_linux_debug_gtests', @@ -4193,7 +4193,7 @@ # need the browser_config parameter. 'os_type': 'linux', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { # This bot doesn't run any browser-based tests @@ -4243,7 +4243,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_fyi_linux_release_gtests', @@ -4277,7 +4277,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_fyi_vulkan_gtests', @@ -4487,7 +4487,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_fyi_linux_optional_gtests', @@ -4546,7 +4546,7 @@ 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_fyi_win_optional_gtests', @@ -4559,7 +4559,7 @@ 'os_type': 'win', 'browser_config': 'debug_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test', @@ -4569,7 +4569,7 @@ 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test', @@ -4579,7 +4579,7 @@ 'os_type': 'win', 'browser_config': 'debug_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_fyi_win_gtests', @@ -4608,7 +4608,7 @@ 'browser_config': 'release_x64', 'mixins': [ 'limited_capacity_bot', - 'win10_nvidia_quadro_p400_experimental', + 'win10_nvidia_gtx_1660_experimental', ], # When the experimental driver is identical to the stable driver, this # should be running the gpu_noop_sleep_telemetry_test. Otherwise, it @@ -4652,18 +4652,17 @@ 'browser_config': 'release_x64', 'mixins': [ 'limited_capacity_bot', - 'win10_nvidia_geforce_gtx_1660', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { - 'gtest_tests': 'gpu_fyi_win_gtests', - 'gpu_telemetry_tests': 'gpu_fyi_win_release_telemetry_tests', + 'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test', }, }, 'Win10 FYI x64 Release (NVIDIA)': { 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_fyi_win_gtests', @@ -4675,7 +4674,7 @@ 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'isolated_scripts': 'win_specific_xr_perf_tests', @@ -4685,7 +4684,7 @@ 'os_type': 'win', 'browser_config': 'release_x64', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_skia_renderer_dawn_gtests', @@ -4696,7 +4695,7 @@ 'browser_config': 'release', 'os_type': 'win', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gtest_tests': 'gpu_fyi_win_gtests', @@ -6224,7 +6223,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gpu_telemetry_tests': 'gpu_v8_desktop_passthrough_telemetry_tests', @@ -6234,7 +6233,7 @@ 'os_type': 'linux', 'browser_config': 'release', 'mixins': [ - 'linux_nvidia_quadro_p400_stable', + 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { 'gpu_telemetry_tests': 'gpu_v8_desktop_passthrough_telemetry_tests', @@ -6368,7 +6367,7 @@ 'os_type': 'win', 'browser_config': 'release', 'mixins': [ - 'win10_nvidia_quadro_p400_stable', + 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { 'gpu_telemetry_tests': 'gpu_v8_desktop_passthrough_telemetry_tests',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 285d131..35706d23 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -5515,27 +5515,6 @@ ] } ], - "OmniboxOnDeviceHeadNonIncognitoTuningMobile": [ - { - "platforms": [ - "android", - "ios" - ], - "experiments": [ - { - "name": "NoDelayWithScore1K", - "params": { - "DelayOnDeviceHeadSuggestRequestMs": "0", - "DemoteOnDeviceSearchSuggestionsMode": "decrease-relevances", - "OnDeviceSuggestMaxScoreForNonUrlInput": "1000" - }, - "enable_features": [ - "OmniboxOnDeviceHeadProviderNonIncognito" - ] - } - ] - } - ], "OmniboxPedalsBatch2NonEnglish": [ { "platforms": [ @@ -6302,28 +6281,22 @@ ], "experiments": [ { - "name": "Enabled_Prefetch_Prefetch1_NSP6_Small_20210301", + "name": "Prefetch_2_With_Decoys_20211129", "params": { "dns_canary_url": "http://dns-tunnel-check.googlezip.net/connect", "do_no_state_prefetch": "true", + "ineligible_decoy_request_probability": "1", "lite_mode_only": "false", - "max_srp_prefetches": "1", - "max_subresource_count_per_prerender": "6", - "tls_canary_url": "http://tls-tunnel-check.googlezip.net/connect" + "max_srp_prefetches": "5", + "max_subresource_count_per_prerender": "0", + "start_spare_renderer": "true", + "tls_canary_url": "http://tls-tunnel-check.googlezip.net/connect", + "use_speculation_rules": "true" }, "enable_features": [ "IsolatePrerenders", "IsolatePrerendersMustProbeOrigin" ] - }, - { - "name": "NoPrefetches_CounterFactualControl_Small_2_20210301", - "params": { - "max_srp_prefetches": "0" - }, - "enable_features": [ - "IsolatePrerenders" - ] } ] } @@ -9155,5 +9128,20 @@ } ] } + ], + "WinDelaySpellcheckServiceInit": [ + { + "platforms": [ + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "WinDelaySpellcheckServiceInit" + ] + } + ] + } ] }
diff --git a/third_party/blink/public/common/frame/event_page_show_persisted.h b/third_party/blink/public/common/frame/event_page_show_persisted.h index 6b04fdb..742ef67 100644 --- a/third_party/blink/public/common/frame/event_page_show_persisted.h +++ b/third_party/blink/public/common/frame/event_page_show_persisted.h
@@ -50,10 +50,14 @@ // RenderView was not live when the IPC was being sent. kYesInBrowserRenderViewNotLive = 11, + // We are sending another persisted=true state change before receiving the ACK + // for the previous one. + kYesInBrowserPendingAck = 12, + // There is not kNoInBrowser as we don't have to compare the counts of // pageshow events without persisted between browser and renderer so far. - kMaxValue = kYesInBrowserRenderViewNotLive, + kMaxValue = kYesInBrowserPendingAck, }; BLINK_COMMON_EXPORT void RecordUMAEventPageShowPersisted(
diff --git a/third_party/blink/public/platform/web_media_player_client.h b/third_party/blink/public/platform/web_media_player_client.h index ac8f54a89..f95f5f6 100644 --- a/third_party/blink/public/platform/web_media_player_client.h +++ b/third_party/blink/public/platform/web_media_player_client.h
@@ -199,12 +199,6 @@ // TODO(crbug.com/1039252): Remove by merging this method into SizeChanged(). virtual void DidPlayerSizeChange(const gfx::Size& size) = 0; - // Notify the client that a buffer underflow happened for the media player. - virtual void DidBufferUnderflow() = 0; - - // Notify that a playback seek event happened for the media player. - virtual void DidSeek() = 0; - // Notify the client that one of the state used by Picture-in-Picture has // changed. The client will then have to poll the states from the associated // WebMediaPlayer.
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 8b2c62b..f931569 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -4771,6 +4771,12 @@ if (style->Display() == EDisplay::kNone) break; + // CSSContainerQueries rely on LayoutNG being fully shipped before shipping. + // In the meantime, make sure we do not mark containers for re-attachment + // since we might be in the process of laying out the container. + if (style->IsContainerForContainerQueries()) + break; + found_fc = DefinitelyNewFormattingContext(*ancestor, *style); ancestor->SetShouldForceLegacyLayoutForChild(true); ancestor->SetNeedsReattachLayoutTree();
diff --git a/third_party/blink/renderer/core/frame/frame_overlay.cc b/third_party/blink/renderer/core/frame/frame_overlay.cc index 125288cd..a0cd975 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay.cc +++ b/third_party/blink/renderer/core/frame/frame_overlay.cc
@@ -39,10 +39,7 @@ #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer_client.h" #include "third_party/blink/renderer/platform/graphics/paint/scoped_paint_chunk_properties.h" namespace blink { @@ -64,9 +61,6 @@ frame_->View()->SetVisualViewportOrOverlayNeedsRepaint(); delegate_.reset(); - if (layer_) - layer_.Release()->Destroy(); - #if DCHECK_IS_ON() is_destroyed_ = true; #endif @@ -75,35 +69,7 @@ void FrameOverlay::UpdatePrePaint() { // Invalidate DisplayItemClient. Invalidate(); - - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - delegate_->Invalidate(); - return; - } - - auto* parent_layer = frame_->LocalFrameRoot() - .View() - ->GetLayoutView() - ->Compositor() - ->PaintRootGraphicsLayer(); - if (!parent_layer) { - layer_ = nullptr; - return; - } - - if (!layer_) { - layer_ = MakeGarbageCollected<GraphicsLayer>(*this); - layer_->SetDrawsContent(true); - layer_->SetHitTestable(false); - } - - DCHECK(parent_layer); - if (layer_->Parent() != parent_layer || - // Keep the layer the last child of parent to make it topmost. - parent_layer->Children().back() != layer_) - parent_layer->AddChild(layer_); - layer_->SetLayerState(DefaultPropertyTreeState(), gfx::Vector2d()); - layer_->SetSize(Size()); + delegate_->Invalidate(); } gfx::Size FrameOverlay::Size() const { @@ -113,52 +79,13 @@ return size; } -gfx::Rect FrameOverlay::ComputeInterestRect(const GraphicsLayer* graphics_layer, - const gfx::Rect&) const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - DCHECK(!RuntimeEnabledFeatures::CullRectUpdateEnabled()); - return gfx::Rect(gfx::Point(), Size()); -} - -gfx::Rect FrameOverlay::PaintableRegion( - const GraphicsLayer* graphics_layer) const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - DCHECK(RuntimeEnabledFeatures::CullRectUpdateEnabled()); - return gfx::Rect(gfx::Point(), Size()); -} - -void FrameOverlay::PaintContents(const GraphicsLayer* graphics_layer, - GraphicsContext& context, - GraphicsLayerPaintingPhase phase, - const gfx::Rect& interest_rect) const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - DCHECK_EQ(graphics_layer, layer_); - DCHECK_EQ(DefaultPropertyTreeState(), layer_->GetPropertyTreeState()); - Paint(context); -} - -void FrameOverlay::GraphicsLayersDidChange() { - frame_->View()->SetPaintArtifactCompositorNeedsUpdate(); -} - -PaintArtifactCompositor* FrameOverlay::GetPaintArtifactCompositor() { - return frame_->View()->GetPaintArtifactCompositor(); -} - void FrameOverlay::ServiceScriptedAnimations( base::TimeTicks monotonic_frame_begin_time) { delegate_->ServiceScriptedAnimations(monotonic_frame_begin_time); } -String FrameOverlay::DebugName(const GraphicsLayer*) const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - return "Frame Overlay Content Layer"; -} - void FrameOverlay::Trace(Visitor* visitor) const { visitor->Trace(frame_); - visitor->Trace(layer_); - GraphicsLayerClient::Trace(visitor); DisplayItemClient::Trace(visitor); }
diff --git a/third_party/blink/renderer/core/frame/frame_overlay.h b/third_party/blink/renderer/core/frame/frame_overlay.h index 7198ba7..5d392ac6 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay.h +++ b/third_party/blink/renderer/core/frame/frame_overlay.h
@@ -30,9 +30,8 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_FRAME_OVERLAY_H_ #include <memory> +#include "base/time/time.h" #include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer_client.h" #include "third_party/blink/renderer/platform/graphics/paint/display_item_client.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -40,10 +39,10 @@ class GraphicsContext; class LocalFrame; +class PropertyTreeState; // Manages a layer that is overlaid on a WebLocalFrame's content. class CORE_EXPORT FrameOverlay : public GarbageCollected<FrameOverlay>, - public GraphicsLayerClient, public DisplayItemClient { public: class Delegate { @@ -73,11 +72,6 @@ // For CompositeAfterPaint. void Paint(GraphicsContext&) const; - GraphicsLayer* GetGraphicsLayer() const { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - return layer_; - } - // FrameOverlay is always the same size as the viewport. gfx::Size Size() const; @@ -90,18 +84,6 @@ // DisplayItemClient. String DebugName() const final { return "FrameOverlay"; } - // GraphicsLayerClient implementation. Not needed for CompositeAfterPaint. - bool NeedsRepaint(const GraphicsLayer&) const override { return true; } - gfx::Rect ComputeInterestRect(const GraphicsLayer*, - const gfx::Rect&) const override; - gfx::Rect PaintableRegion(const GraphicsLayer*) const override; - void PaintContents(const GraphicsLayer*, - GraphicsContext&, - GraphicsLayerPaintingPhase, - const gfx::Rect& interest_rect) const override; - void GraphicsLayersDidChange() override; - PaintArtifactCompositor* GetPaintArtifactCompositor() override; - String DebugName(const GraphicsLayer*) const override; void Trace(Visitor*) const override; PropertyTreeState DefaultPropertyTreeState() const; @@ -109,7 +91,6 @@ private: Member<LocalFrame> frame_; std::unique_ptr<FrameOverlay::Delegate> delegate_; - Member<GraphicsLayer> layer_; #if DCHECK_IS_ON() bool is_destroyed_ = false;
diff --git a/third_party/blink/renderer/core/frame/frame_overlay_test.cc b/third_party/blink/renderer/core/frame/frame_overlay_test.cc index 91dc93a..ccaa13b 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay_test.cc +++ b/third_party/blink/renderer/core/frame/frame_overlay_test.cc
@@ -105,23 +105,8 @@ Property(&SkPaint::getColor, SK_ColorYELLOW))); auto* builder = MakeGarbageCollected<PaintRecordBuilder>(); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - frame_overlay->Paint(builder->Context()); - builder->EndRecording()->Playback(&canvas); - } else { - auto* graphics_layer = frame_overlay->GetGraphicsLayer(); - EXPECT_FALSE(graphics_layer->IsHitTestable()); - EXPECT_EQ(PropertyTreeState::Root(), - graphics_layer->GetPropertyTreeState()); - HeapVector<PreCompositedLayerInfo> pre_composited_layers; - PaintController::CycleScope cycle_scope; - graphics_layer->PaintRecursively(builder->Context(), pre_composited_layers, - cycle_scope); - ASSERT_EQ(1u, pre_composited_layers.size()); - SkiaPaintCanvas(&canvas).drawPicture( - graphics_layer->GetPaintController().GetPaintArtifact().GetPaintRecord( - PropertyTreeState::Root())); - } + frame_overlay->Paint(builder->Context()); + builder->EndRecording()->Playback(&canvas); frame_overlay->Destroy(); } @@ -164,61 +149,11 @@ PaintController paint_controller(PaintController::kTransient); GraphicsContext context(paint_controller); - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - frame_overlay->Paint(context); - paint_controller.CommitNewDisplayItems(); - check_paint_results(paint_controller); - } else { - auto* graphics_layer = frame_overlay->GetGraphicsLayer(); - EXPECT_FALSE(graphics_layer->IsHitTestable()); - EXPECT_EQ(state, graphics_layer->GetPropertyTreeState()); - HeapVector<PreCompositedLayerInfo> pre_composited_layers; - PaintController::CycleScope cycle_scope; - graphics_layer->PaintRecursively(context, pre_composited_layers, - cycle_scope); - check_paint_results(graphics_layer->GetPaintController()); - } + frame_overlay->Paint(context); + paint_controller.CommitNewDisplayItems(); + check_paint_results(paint_controller); frame_overlay->Destroy(); } -TEST_P(FrameOverlayTest, LayerOrder) { - // This test doesn't apply in CompositeAfterPaint. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - auto* frame_overlay1 = CreateSolidYellowOverlay(); - auto* frame_overlay2 = CreateSolidYellowOverlay(); - frame_overlay1->UpdatePrePaint(); - frame_overlay2->UpdatePrePaint(); - - auto* parent_layer = GetWebView() - ->MainFrameImpl() - ->GetFrameView() - ->GetLayoutView() - ->Compositor() - ->PaintRootGraphicsLayer(); - ASSERT_EQ(3u, parent_layer->Children().size()); - EXPECT_EQ(parent_layer, frame_overlay1->GetGraphicsLayer()->Parent()); - EXPECT_EQ(parent_layer->Children()[1], frame_overlay1->GetGraphicsLayer()); - EXPECT_EQ(parent_layer, frame_overlay2->GetGraphicsLayer()->Parent()); - EXPECT_EQ(parent_layer->Children()[2], frame_overlay2->GetGraphicsLayer()); - - auto* extra_layer = - MakeGarbageCollected<GraphicsLayer>(parent_layer->Client()); - parent_layer->AddChild(extra_layer); - - frame_overlay1->UpdatePrePaint(); - frame_overlay2->UpdatePrePaint(); - ASSERT_EQ(4u, parent_layer->Children().size()); - EXPECT_EQ(parent_layer, frame_overlay1->GetGraphicsLayer()->Parent()); - EXPECT_EQ(parent_layer->Children()[2], frame_overlay1->GetGraphicsLayer()); - EXPECT_EQ(parent_layer, frame_overlay2->GetGraphicsLayer()->Parent()); - EXPECT_EQ(parent_layer->Children()[3], frame_overlay2->GetGraphicsLayer()); - - extra_layer->Destroy(); - frame_overlay1->Destroy(); - frame_overlay2->Destroy(); -} - } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc index 1c487b3..324322b9 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.cc +++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -1372,6 +1372,13 @@ return 0; LocalFrame* frame = GetFrame(); + + // FencedFrames should return innerHeight to prevent passing + // arbitrary data through the window height. + if (frame->IsInFencedFrameTree()) { + return innerHeight(); + } + Page* page = frame->GetPage(); if (!page) return 0; @@ -1390,6 +1397,13 @@ return 0; LocalFrame* frame = GetFrame(); + + // FencedFrames should return innerWidth to prevent passing + // arbitrary data through the window width. + if (frame->IsInFencedFrameTree()) { + return innerWidth(); + } + Page* page = frame->GetPage(); if (!page) return 0;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index ef6038f..8a9a66f 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -4641,21 +4641,6 @@ observer->OnMediaSizeChanged(size); } -void HTMLMediaElement::DidBufferUnderflow() { - for (auto& observer : media_player_observer_remote_set_->Value()) - observer->OnBufferUnderflow(); -} - -void HTMLMediaElement::DidSeek() { - // Send the seek updates to the browser process only once per second. - if (last_seek_update_time_.is_null() || - (base::TimeTicks::Now() - last_seek_update_time_ >= base::Seconds(1))) { - last_seek_update_time_ = base::TimeTicks::Now(); - for (auto& observer : media_player_observer_remote_set_->Value()) - observer->OnSeek(); - } -} - media::mojom::blink::MediaPlayerHost& HTMLMediaElement::GetMediaPlayerHostRemote() { // It is an error to call this before having access to the document's frame.
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h index 1f61830..9dc34064 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.h +++ b/third_party/blink/renderer/core/html/media/html_media_element.h
@@ -528,8 +528,6 @@ void DidDisableAudioOutputSinkChanges() override; void DidUseAudioServiceChange(bool uses_audio_service) override; void DidPlayerSizeChange(const gfx::Size& size) override; - void DidBufferUnderflow() override; - void DidSeek() override; // Returns a reference to the mojo remote for the MediaPlayerHost interface, // requesting it first from the BrowserInterfaceBroker if needed. It is an @@ -798,9 +796,6 @@ // playback raters other than 1.0. bool preserves_pitch_ = true; - // Keeps track of when the player seek event was sent to the browser process. - base::TimeTicks last_seek_update_time_; - Member<AudioTrackList> audio_tracks_; Member<VideoTrackList> video_tracks_; Member<TextTrackList> text_tracks_;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element_test.cc b/third_party/blink/renderer/core/html/media/html_media_element_test.cc index 921bf9d2..e05b342 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element_test.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element_test.cc
@@ -185,13 +185,6 @@ void OnAudioOutputSinkChangingDisabled() override {} - void OnBufferUnderflow() override { - received_buffer_underflow_ = true; - run_loop_->Quit(); - } - - void OnSeek() override {} - // Getters used from HTMLMediaElementTest. bool received_media_playing() const { return received_media_playing_; } @@ -214,8 +207,6 @@ return received_uses_audio_service_.value() == uses_audio_service; } - bool received_buffer_underflow() const { return received_buffer_underflow_; } - private: std::unique_ptr<base::RunLoop> run_loop_; bool received_media_playing_{false}; @@ -224,7 +215,6 @@ absl::optional<OnMetadataChangedResult> received_metadata_changed_result_; gfx::Size received_media_size_{0, 0}; absl::optional<bool> received_uses_audio_service_; - bool received_buffer_underflow_{false}; }; class TestMediaPlayerHost final : public media::mojom::blink::MediaPlayerHost { @@ -421,15 +411,6 @@ uses_audio_service); } - void NotifyBufferUnderflowEvent() { - media_->DidBufferUnderflow(); - media_player_observer().WaitUntilReceivedMessage(); - } - - bool ReceivedMessageBufferUnderflowEvent() { - return media_player_observer().received_buffer_underflow(); - } - bool WasPlayerDestroyed() const { return !media_player_weak_; } // Create a dummy page holder with the given security origin. @@ -1173,13 +1154,6 @@ EXPECT_TRUE(ReceivedMessageUseAudioServiceChanged(true)); } -TEST_P(HTMLMediaElementTest, SendBufferOverflowToObserver) { - WaitForPlayer(); - - NotifyBufferUnderflowEvent(); - EXPECT_TRUE(ReceivedMessageBufferUnderflowEvent()); -} - TEST_P(HTMLMediaElementTest, ControlsVisibilityUserChoiceOverridesControlsAttr) { // Enable scripts to prevent controls being shown due to no scripts.
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc index f72f22e..f061849 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -997,12 +997,9 @@ bool InspectorOverlayAgent::IsInspectorLayer(const cc::Layer* layer) const { if (!frame_overlay_) return false; - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - return layer == static_cast<const InspectorPageOverlayDelegate*>( - frame_overlay_->GetDelegate()) - ->GetLayer(); - } - return layer == &frame_overlay_->GetGraphicsLayer()->CcLayer(); + return layer == static_cast<const InspectorPageOverlayDelegate*>( + frame_overlay_->GetDelegate()) + ->GetLayer(); } LocalFrame* InspectorOverlayAgent::GetFrame() const {
diff --git a/third_party/blink/renderer/core/page/validation_message_overlay_delegate.h b/third_party/blink/renderer/core/page/validation_message_overlay_delegate.h index 00d6bce5..e9ed369 100644 --- a/third_party/blink/renderer/core/page/validation_message_overlay_delegate.h +++ b/third_party/blink/renderer/core/page/validation_message_overlay_delegate.h
@@ -7,6 +7,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/frame/frame_overlay.h" +#include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/text/text_direction.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index cbfdb54e..470d3c0 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -217,7 +217,7 @@ Member<GraphicsLayer> CompositedLayerMapping::CreateGraphicsLayer( CompositingReasons reasons, SquashingDisallowedReasons squashing_disallowed_reasons) { - auto* graphics_layer = MakeGarbageCollected<GraphicsLayer>(*this); + auto* graphics_layer = MakeGarbageCollected<GraphicsLayer>(); graphics_layer->SetCompositingReasons(reasons); graphics_layer->SetSquashingDisallowedReasons(squashing_disallowed_reasons); @@ -1742,57 +1742,6 @@ return false; } -gfx::Rect CompositedLayerMapping::ComputeInterestRect( - const GraphicsLayer* graphics_layer, - const gfx::Rect& previous_interest_rect) const { - DCHECK(!RuntimeEnabledFeatures::CullRectUpdateEnabled()); - - // Use the previous interest rect if it covers the whole layer. - gfx::Rect whole_layer_rect(graphics_layer->Size()); - if (!NeedsRepaint(*graphics_layer) && - previous_interest_rect == whole_layer_rect) - return previous_interest_rect; - - if (graphics_layer != graphics_layer_ && - graphics_layer != non_scrolling_squashing_layer_ && - graphics_layer != scrolling_contents_layer_) - return whole_layer_rect; - - gfx::Rect new_interest_rect = RecomputeInterestRect(graphics_layer); - if (NeedsRepaint(*graphics_layer) || - InterestRectChangedEnoughToRepaint( - previous_interest_rect, new_interest_rect, graphics_layer->Size())) - return new_interest_rect; - return previous_interest_rect; -} - -gfx::Rect CompositedLayerMapping::PaintableRegion( - const GraphicsLayer* graphics_layer) const { - DCHECK(RuntimeEnabledFeatures::CullRectUpdateEnabled()); - const auto& fragment = - OwningLayer().GetLayoutObject().PrimaryStitchingFragment(); - CullRect cull_rect = - graphics_layer == scrolling_contents_layer_ || - (graphics_layer == foreground_layer_ && scrolling_contents_layer_) - ? fragment.GetContentsCullRect() - : fragment.GetCullRect(); - gfx::Rect layer_rect(graphics_layer->Size()); - if (cull_rect.IsInfinite()) - return layer_rect; - cull_rect.Move(-graphics_layer->GetOffsetFromTransformNode()); - return IntersectRects(cull_rect.Rect(), layer_rect); -} - -LayoutSize CompositedLayerMapping::SubpixelAccumulation() const { - return owning_layer_->SubpixelAccumulation().ToLayoutSize(); -} - -bool CompositedLayerMapping::NeedsRepaint( - const GraphicsLayer& graphics_layer) const { - return IsScrollableAreaLayerWhichNeedsRepaint(&graphics_layer) || - owning_layer_->SelfOrDescendantNeedsRepaint(); -} - bool CompositedLayerMapping::AdjustForCompositedScrolling( const GraphicsLayer* graphics_layer, gfx::Vector2d& offset) const { @@ -1814,117 +1763,6 @@ return false; } -static constexpr PaintLayerFlags PaintLayerFlagsFromGraphicsLayerPaintingPhase( - GraphicsLayerPaintingPhase graphics_layer_painting_phase) { - PaintLayerFlags paint_layer_flags = 0; - if (graphics_layer_painting_phase & kGraphicsLayerPaintBackground) - paint_layer_flags |= kPaintLayerPaintingCompositingBackgroundPhase; - else - paint_layer_flags |= kPaintLayerPaintingSkipRootBackground; - if (graphics_layer_painting_phase & kGraphicsLayerPaintForeground) - paint_layer_flags |= kPaintLayerPaintingCompositingForegroundPhase; - if (graphics_layer_painting_phase & kGraphicsLayerPaintMask) - paint_layer_flags |= kPaintLayerPaintingCompositingMaskPhase; - if (graphics_layer_painting_phase & kGraphicsLayerPaintOverflowContents) - paint_layer_flags |= kPaintLayerPaintingOverflowContents; - if (graphics_layer_painting_phase & kGraphicsLayerPaintCompositedScroll) - paint_layer_flags |= kPaintLayerPaintingCompositingScrollingPhase; - if (graphics_layer_painting_phase & kGraphicsLayerPaintDecoration) - paint_layer_flags |= kPaintLayerPaintingCompositingDecorationPhase; - return paint_layer_flags; -} - -// Always paint all phases for squashed layers. -static constexpr PaintLayerFlags kPaintLayerFlagsForSquashedLayer = - PaintLayerFlagsFromGraphicsLayerPaintingPhase( - kGraphicsLayerPaintAllWithOverflowClip); - -void CompositedLayerMapping::PaintContents( - const GraphicsLayer* graphics_layer, - GraphicsContext& context, - GraphicsLayerPaintingPhase graphics_layer_painting_phase, - const gfx::Rect& interest_rect_arg) const { - gfx::Rect interest_rect = RuntimeEnabledFeatures::CullRectUpdateEnabled() - ? PaintableRegion(graphics_layer) - : interest_rect_arg; - - FramePaintTiming frame_paint_timing(context, GetLayoutObject().GetFrame()); - -#if DCHECK_IS_ON() - // FIXME: once the state machine is ready, this can be removed and we can - // refer to that instead. - if (Page* page = GetLayoutObject().GetFrame()->GetPage()) - page->SetIsPainting(true); -#endif - - DCHECK(owning_layer_->GetLayoutObject() - .GetFrameView() - ->LocalFrameTreeAllowsThrottling()); - - DEVTOOLS_TIMELINE_TRACE_EVENT_WITH_CATEGORIES( - "devtools.timeline,rail", "Paint", inspector_paint_event::Data, - owning_layer_->GetLayoutObject().GetFrame(), - &owning_layer_->GetLayoutObject(), - owning_layer_->GetLayoutObject().LocalToAbsoluteQuad( - FloatQuad(interest_rect), - kTraverseDocumentBoundaries | kUseGeometryMapperMode), - graphics_layer->CcLayer().id()); - - PaintLayerFlags paint_layer_flags = - PaintLayerFlagsFromGraphicsLayerPaintingPhase( - graphics_layer_painting_phase); - - if (graphics_layer == graphics_layer_ || - graphics_layer == foreground_layer_ || graphics_layer == mask_layer_ || - graphics_layer == scrolling_contents_layer_ || - graphics_layer == decoration_outline_layer_) { - if (BackgroundPaintsOntoScrollingContentsLayer()) { - if (graphics_layer == scrolling_contents_layer_) - paint_layer_flags &= ~kPaintLayerPaintingSkipRootBackground; - else if (!BackgroundPaintsOntoGraphicsLayer()) - paint_layer_flags |= kPaintLayerPaintingSkipRootBackground; - } - - GraphicsLayerPaintInfo paint_info; - paint_info.paint_layer = owning_layer_; - paint_info.composited_bounds = CompositedBounds(); - paint_info.offset_from_layout_object = - graphics_layer->OffsetFromLayoutObject(); - AdjustForCompositedScrolling(graphics_layer, - paint_info.offset_from_layout_object); - - // We have to use the same root as for hit testing, because both methods - // can compute and cache clipRects. - DoPaintTask(paint_info, *graphics_layer, paint_layer_flags, context, - interest_rect); - - if (graphics_layer == scrolling_contents_layer_ && - !squashed_layers_in_scrolling_contents_.IsEmpty()) { - // We have squashed_layers_in_scrolling_contents_ only if owning_layer_ - // is not a stacking context, thus doesn't have foreground_layer_. - // (Otherwise we would need to squash into foreground_layer_.) - DCHECK(!foreground_layer_); - for (auto& squashed_layer : squashed_layers_in_scrolling_contents_) { - DoPaintTask(*squashed_layer, *graphics_layer, - kPaintLayerFlagsForSquashedLayer, context, interest_rect); - } - } - } else if (graphics_layer == non_scrolling_squashing_layer_) { - DCHECK_EQ(kPaintLayerFlagsForSquashedLayer, paint_layer_flags); - for (auto& squashed_layer : non_scrolling_squashed_layers_) { - DoPaintTask(*squashed_layer, *graphics_layer, paint_layer_flags, context, - interest_rect); - } - } else if (IsScrollableAreaLayer(graphics_layer)) { - PaintScrollableArea(graphics_layer, context, interest_rect); - } - -#if DCHECK_IS_ON() - if (Page* page = GetLayoutObject().GetFrame()->GetPage()) - page->SetIsPainting(false); -#endif -} - void CompositedLayerMapping::PaintScrollableArea( const GraphicsLayer* graphics_layer, GraphicsContext& context, @@ -1975,32 +1813,6 @@ return false; } -bool CompositedLayerMapping::ShouldSkipPaintingSubtree() const { - return GetLayoutObject().GetFrame()->ShouldThrottleRendering() || - owning_layer_->IsUnderSVGHiddenContainer() || - DisplayLockUtilities::LockedAncestorPreventingPaint(GetLayoutObject()); -} - -bool CompositedLayerMapping::IsTrackingRasterInvalidations() const { - return GetLayoutObject() - .GetFrame() - ->LocalFrameRoot() - .View() - ->IsTrackingRasterInvalidations(); -} - -void CompositedLayerMapping::GraphicsLayersDidChange() { - LocalFrameView* frame_view = GetLayoutObject().GetFrameView(); - DCHECK(frame_view); - frame_view->SetPaintArtifactCompositorNeedsUpdate(); -} - -PaintArtifactCompositor* CompositedLayerMapping::GetPaintArtifactCompositor() { - LocalFrameView* frame_view = GetLayoutObject().GetFrameView(); - DCHECK(frame_view); - return frame_view->GetPaintArtifactCompositor(); -} - void CompositedLayerMapping::Trace(Visitor* visitor) const { visitor->Trace(owning_layer_); visitor->Trace(graphics_layer_); @@ -2014,16 +1826,8 @@ visitor->Trace(non_scrolling_squashing_layer_); visitor->Trace(non_scrolling_squashed_layers_); visitor->Trace(squashed_layers_in_scrolling_contents_); - GraphicsLayerClient::Trace(visitor); } -#if DCHECK_IS_ON() -void CompositedLayerMapping::VerifyNotPainting() { - DCHECK(!GetLayoutObject().GetFrame()->GetPage() || - !GetLayoutObject().GetFrame()->GetPage()->IsPainting()); -} -#endif - bool CompositedLayerMapping::UpdateSquashingLayerAssignmentInternal( HeapVector<Member<GraphicsLayerPaintInfo>>& squashed_layers, PaintLayer& squashed_layer, @@ -2186,11 +1990,4 @@ return name; } -const ScrollableArea* CompositedLayerMapping::GetScrollableAreaForTesting( - const GraphicsLayer* layer) const { - if (layer == scrolling_contents_layer_) - return owning_layer_->GetScrollableArea(); - return nullptr; -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h index bf7c535..eff740c 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h
@@ -34,7 +34,6 @@ #include "third_party/blink/renderer/core/paint/paint_layer_painting_info.h" #include "third_party/blink/renderer/platform/geometry/float_point_3d.h" #include "third_party/blink/renderer/platform/graphics/graphics_layer.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer_client.h" #include "third_party/blink/renderer/platform/graphics/graphics_types.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "ui/gfx/geometry/point_f.h" @@ -94,14 +93,13 @@ // - Otherwise the PaintLayer doesn't own or directly reference any // CompositedLayerMapping. class CORE_EXPORT CompositedLayerMapping final - : public GarbageCollected<CompositedLayerMapping>, - public GraphicsLayerClient { + : public GarbageCollected<CompositedLayerMapping> { public: // |Destroy()| should be called when the object is no longer used. explicit CompositedLayerMapping(PaintLayer&); CompositedLayerMapping(const CompositedLayerMapping&) = delete; CompositedLayerMapping& operator=(const CompositedLayerMapping&) = delete; - ~CompositedLayerMapping() override; + virtual ~CompositedLayerMapping(); void Destroy(); PaintLayer& OwningLayer() const { return *owning_layer_; } @@ -174,26 +172,7 @@ void UpdateElementId(); - // GraphicsLayerClient interface - gfx::Rect ComputeInterestRect( - const GraphicsLayer*, - const gfx::Rect& previous_interest_rect) const override; - gfx::Rect PaintableRegion(const GraphicsLayer*) const override; - LayoutSize SubpixelAccumulation() const final; - bool NeedsRepaint(const GraphicsLayer&) const override; - void PaintContents(const GraphicsLayer*, - GraphicsContext&, - GraphicsLayerPaintingPhase, - const gfx::Rect& interest_rect) const override; - bool ShouldSkipPaintingSubtree() const override; - bool IsTrackingRasterInvalidations() const override; - void GraphicsLayersDidChange() override; - PaintArtifactCompositor* GetPaintArtifactCompositor() override; - void Trace(Visitor*) const override; - -#if DCHECK_IS_ON() - void VerifyNotPainting() override; -#endif + virtual void Trace(Visitor*) const; PhysicalRect ContentsBox() const; @@ -242,10 +221,7 @@ } #endif - String DebugName(const GraphicsLayer*) const override; - - const ScrollableArea* GetScrollableAreaForTesting( - const GraphicsLayer*) const override; + String DebugName(const GraphicsLayer*) const; PhysicalOffset ContentOffsetInCompositingLayer() const;
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc index 2762f35..14b58793 100644 --- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc +++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
@@ -586,8 +586,6 @@ void DidDisableAudioOutputSinkChanges() override {} void DidUseAudioServiceChange(bool uses_audio_service) override {} void DidPlayerSizeChange(const gfx::Size& size) override {} - void DidBufferUnderflow() override {} - void DidSeek() override {} Features GetFeatures() override { return Features(); }
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 0f99a72..56e7d4b8 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1882,7 +1882,6 @@ "testing/empty_web_media_player.cc", "testing/empty_web_media_player.h", "testing/fake_display_item_client.h", - "testing/fake_graphics_layer_client.h", "testing/find_cc_layer.cc", "testing/find_cc_layer.h", "testing/font_test_helpers.cc",
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc index 8a78be2..36caac3 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -31,7 +31,6 @@ #include "third_party/blink/renderer/platform/graphics/paint/paint_artifact.h" #include "third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.h" #include "third_party/blink/renderer/platform/testing/fake_display_item_client.h" -#include "third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h" #include "third_party/blink/renderer/platform/testing/layer_tree_host_embedder.h" #include "third_party/blink/renderer/platform/testing/paint_property_test_helpers.h" #include "third_party/blink/renderer/platform/testing/paint_test_configurations.h" @@ -4568,43 +4567,6 @@ EXPECT_FALSE(scroll_node->is_composited); } -TEST_P(PaintArtifactCompositorTest, PreCompositedLayerNonCompositedScrolling) { - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - - FakeGraphicsLayerClient& client = - *(MakeGarbageCollected<FakeGraphicsLayerClient>()); - Member<GraphicsLayer> graphics_layer = - MakeGarbageCollected<GraphicsLayer>(client); - auto parent_scroll_translation = CreateScrollTranslation( - t0(), 10, 20, gfx::Rect(0, 0, 100, 100), gfx::Size(200, 200), - CompositingReason::kRootScroller); - PropertyTreeState layer_state(*parent_scroll_translation, c0(), e0()); - graphics_layer->SetLayerState(layer_state, gfx::Vector2d()); - auto scroll_translation = CreateScrollTranslation( - *parent_scroll_translation, 10, 20, gfx::Rect(0, 0, 150, 150), - gfx::Size(200, 200), CompositingReason::kNone); - - TestPaintArtifact artifact; - CreateScrollableChunk(artifact, *scroll_translation, c0(), e0()); - HeapVector<PreCompositedLayerInfo> pre_composited_layers = { - {PaintChunkSubset(artifact.Build()), graphics_layer}}; - GetPaintArtifactCompositor().SetNeedsUpdate(); - GetPaintArtifactCompositor().Update( - pre_composited_layers, PaintArtifactCompositor::ViewportProperties(), {}, - {}); - - EXPECT_EQ(1u, LayerCount()); - EXPECT_EQ(&graphics_layer->CcLayer(), LayerAt(0)); - EXPECT_EQ(gfx::Rect(0, 0, 150, 150), - graphics_layer->CcLayer().non_fast_scrollable_region().bounds()); - EXPECT_EQ(parent_scroll_translation->CcNodeId( - graphics_layer->CcLayer().property_tree_sequence_number()), - graphics_layer->CcLayer().scroll_tree_index()); - - graphics_layer->Destroy(); -} - TEST_P(PaintArtifactCompositorTest, RepaintIndirectScrollHitTest) { CompositorElementId scroll_element_id = ScrollElementId(2); auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(),
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.cc b/third_party/blink/renderer/platform/graphics/graphics_layer.cc index fd31e38..648571f 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.cc +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
@@ -66,9 +66,8 @@ namespace blink { -GraphicsLayer::GraphicsLayer(GraphicsLayerClient& client) - : client_(&client), - draws_content_(false), +GraphicsLayer::GraphicsLayer() + : draws_content_(false), paints_hit_test_(false), contents_visible_(true), hit_testable_(false), @@ -81,14 +80,6 @@ raster_invalidation_function_( base::BindRepeating(&GraphicsLayer::InvalidateRaster, base::Unretained(this))) { - // TODO(crbug.com/1033240): Debugging information for the referenced bug. - // Remove when it is fixed. - CHECK(client_); - -#if DCHECK_IS_ON() - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - client.VerifyNotPainting(); -#endif layer_ = cc::PictureLayer::Create(this); layer_->SetIsDrawable(draws_content_ && contents_visible_); layer_->SetHitTestable(hit_testable_); @@ -106,10 +97,6 @@ CcLayer().ClearClient(); contents_layer_ = nullptr; -#if DCHECK_IS_ON() - client_->VerifyNotPainting(); -#endif - RemoveAllChildren(); RemoveFromParent(); DCHECK(!parent_); @@ -259,10 +246,6 @@ parent_->children_.EraseAt(parent_->children_.ReverseFind(this)); SetParent(nullptr); } - - // cc::Layers are created and removed in PaintArtifactCompositor so ensure it - // is notified that something has changed. - client_->GraphicsLayersDidChange(); } void GraphicsLayer::SetOffsetFromLayoutObject(const gfx::Vector2d& offset) { @@ -293,10 +276,6 @@ ForAllGraphicsLayers( *this, [&](GraphicsLayer& layer) -> bool { - if (layer.Client().ShouldSkipPaintingSubtree()) { - layer.ClearPaintStateRecursively(); - return false; - } layer.Paint(pre_composited_layers, benchmark_mode, &cycle_scope); repainted |= layer.repainted_; return true; @@ -339,8 +318,6 @@ const gfx::Rect* interest_rect) { repainted_ = false; - DCHECK(!client_->ShouldSkipPaintingSubtree()); - if (!PaintsContentOrHitTest()) { if (IsHitTestable()) { pre_composited_layers.push_back( @@ -362,12 +339,6 @@ DCHECK(layer_state_) << "No layer state for GraphicsLayer: " << DebugName(); gfx::Rect new_interest_rect; - if (!RuntimeEnabledFeatures::CullRectUpdateEnabled()) { - new_interest_rect = interest_rect ? *interest_rect - : client_->ComputeInterestRect( - this, previous_interest_rect_); - } - auto& paint_controller = GetPaintController(); if (cycle_scope) cycle_scope->AddController(paint_controller); @@ -380,7 +351,6 @@ PaintController::ScopedBenchmarkMode scoped_benchmark_mode(paint_controller, benchmark_mode); bool cached = !paint_controller.ShouldForcePaintForBenchmark() && - !client_->NeedsRepaint(*this) && // TODO(wangxianzhu): This will be replaced by subsequence // caching when unifying PaintController. paint_controller.ClientCacheIsValid(*this) && @@ -396,7 +366,6 @@ paint_controller.SetShouldComputeContentsOpaque( ShouldCreateLayersAfterPaint()); previous_interest_rect_ = new_interest_rect; - client_->PaintContents(this, context, painting_phase_, new_interest_rect); paint_controller.CommitNewDisplayItems(); DVLOG(2) << "Painted GraphicsLayer: " << DebugName() << " paintable region: " << PaintableRegion().ToString(); @@ -405,17 +374,6 @@ PaintChunkSubset chunks(paint_controller.GetPaintArtifactShared()); pre_composited_layers.push_back(PreCompositedLayerInfo{chunks, this}); - if (ShouldCreateLayersAfterPaint()) { - if (auto* paint_artifact_compositor = - client_->GetPaintArtifactCompositor()) { - // This is checked even when |cached| is true because the paint controller - // may be fully cached while the PaintChunks within are marked as not - // cacheable. - paint_artifact_compositor->SetNeedsFullUpdateAfterPaintIfNeeded( - *previous_chunks, chunks); - } - } - if (cached && !needs_check_raster_invalidation_ && paint_controller.GetBenchmarkMode() != PaintBenchmarkMode::kForceRasterInvalidationAndConvert) { @@ -471,9 +429,7 @@ } } -void GraphicsLayer::NotifyChildListChange() { - client_->GraphicsLayersDidChange(); -} +void GraphicsLayer::NotifyChildListChange() {} void GraphicsLayer::UpdateLayerIsDrawable() { // For the rest of the accelerated compositor code, there is no reason to make @@ -535,7 +491,7 @@ if (VLOG_IS_ON(3)) return true; #endif - return Client().IsTrackingRasterInvalidations(); + return false; } void GraphicsLayer::UpdateTrackingRasterInvalidations() { @@ -576,12 +532,6 @@ } String GraphicsLayer::DebugName(const cc::Layer* layer) const { - if (layer == contents_layer_.get()) - return "ContentsLayer for " + client_->DebugName(this); - - if (layer == layer_.get()) - return client_->DebugName(this); - NOTREACHED(); return ""; } @@ -610,8 +560,6 @@ if (draws_content == draws_content_) return; - // This may affect which layers the client collects. - client_->GraphicsLayersDidChange(); // This flag will be updated when the layer is repainted. should_create_layers_after_paint_ = false; @@ -638,8 +586,6 @@ void GraphicsLayer::SetPaintsHitTest(bool paints_hit_test) { if (paints_hit_test_ == paints_hit_test) return; - // This may affect which layers the client collects. - client_->GraphicsLayersDidChange(); // This flag will be updated when the layer is repainted. should_create_layers_after_paint_ = false; paints_hit_test_ = paints_hit_test; @@ -648,8 +594,6 @@ void GraphicsLayer::SetHitTestable(bool should_hit_test) { if (hit_testable_ == should_hit_test) return; - // This may affect which layers the client collects. - client_->GraphicsLayersDidChange(); hit_testable_ = should_hit_test; CcLayer().SetHitTestable(should_hit_test); } @@ -674,7 +618,6 @@ contents_rect_ = rect; UpdateContentsLayerBounds(); - client_->GraphicsLayersDidChange(); } void GraphicsLayer::SetPaintingPhase(GraphicsLayerPaintingPhase phase) { @@ -709,7 +652,6 @@ } CcLayer().SetSubtreePropertyChanged(); - client_->GraphicsLayersDidChange(); } void GraphicsLayer::SetContentsLayerState( @@ -729,13 +671,10 @@ } ContentsLayer()->SetSubtreePropertyChanged(); - client_->GraphicsLayersDidChange(); } gfx::Rect GraphicsLayer::PaintableRegion() const { - return RuntimeEnabledFeatures::CullRectUpdateEnabled() - ? client_->PaintableRegion(this) - : previous_interest_rect_; + return previous_interest_rect_; } scoped_refptr<cc::DisplayItemList> GraphicsLayer::PaintContentsToDisplayList() { @@ -755,7 +694,6 @@ } void GraphicsLayer::Trace(Visitor* visitor) const { - visitor->Trace(client_); visitor->Trace(children_); visitor->Trace(parent_); DisplayItemClient::Trace(visitor);
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.h b/third_party/blink/renderer/platform/graphics/graphics_layer.h index 56acc5f..ffd62aed 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.h +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.h
@@ -63,6 +63,7 @@ namespace blink { +class GraphicsLayer; class PaintController; class RasterInvalidationTracking; class RasterInvalidator; @@ -78,14 +79,12 @@ private cc::ContentLayerClient { public: // |Destroy()| shouold be called when the object is no longer used. - explicit GraphicsLayer(GraphicsLayerClient&); + explicit GraphicsLayer(); GraphicsLayer(const GraphicsLayer&) = delete; GraphicsLayer& operator=(const GraphicsLayer&) = delete; ~GraphicsLayer() override; void Destroy(); - GraphicsLayerClient& Client() const { return *client_; } - void SetCompositingReasons(CompositingReasons reasons) { compositing_reasons_ = reasons; } @@ -186,7 +185,7 @@ void SetElementId(const CompositorElementId&); // DisplayItemClient methods - String DebugName() const final { return client_->DebugName(this); } + String DebugName() const final { return ""; } DOMNodeId OwnerNodeId() const final { return owner_node_id_; } // LayerAsJSONClient implementation. @@ -270,8 +269,6 @@ RasterInvalidator& EnsureRasterInvalidator(); void InvalidateRaster(const gfx::Rect&); - Member<GraphicsLayerClient> client_; - // Offset from the owning layoutObject gfx::Vector2d offset_from_layout_object_;
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer_client.h b/third_party/blink/renderer/platform/graphics/graphics_layer_client.h index ca20056..66126ab 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer_client.h +++ b/third_party/blink/renderer/platform/graphics/graphics_layer_client.h
@@ -26,23 +26,8 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GRAPHICS_LAYER_CLIENT_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GRAPHICS_LAYER_CLIENT_H_ -#include "base/dcheck_is_on.h" -#include "third_party/blink/renderer/platform/geometry/layout_size.h" -#include "third_party/blink/renderer/platform/heap/handle.h" -#include "third_party/blink/renderer/platform/platform_export.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" - -namespace gfx { -class Rect; -} - namespace blink { -class GraphicsContext; -class GraphicsLayer; -class ScrollableArea; -class PaintArtifactCompositor; - enum GraphicsLayerPaintingPhaseFlags { kGraphicsLayerPaintBackground = (1 << 0), kGraphicsLayerPaintForeground = (1 << 1), @@ -56,53 +41,6 @@ }; typedef unsigned GraphicsLayerPaintingPhase; -class PLATFORM_EXPORT GraphicsLayerClient : public GarbageCollectedMixin { - public: - virtual ~GraphicsLayerClient() = default; - - // Used only when CullRectUpdate is not enabled. - virtual gfx::Rect ComputeInterestRect( - const GraphicsLayer*, - const gfx::Rect& previous_interest_rect) const = 0; - // Used when CullRectUpdate is enabled. - virtual gfx::Rect PaintableRegion(const GraphicsLayer*) const = 0; - - virtual LayoutSize SubpixelAccumulation() const { return LayoutSize(); } - // Returns whether the client needs to be repainted with respect to the given - // graphics layer. - virtual bool NeedsRepaint(const GraphicsLayer&) const = 0; - virtual void PaintContents(const GraphicsLayer*, - GraphicsContext&, - GraphicsLayerPaintingPhase, - const gfx::Rect& interest_rect) const = 0; - - virtual bool ShouldSkipPaintingSubtree() const { return false; } - - virtual bool IsTrackingRasterInvalidations() const { return false; } - - virtual void GraphicsLayersDidChange() {} - - virtual PaintArtifactCompositor* GetPaintArtifactCompositor() = 0; - - virtual String DebugName(const GraphicsLayer*) const = 0; - - virtual const ScrollableArea* GetScrollableAreaForTesting( - const GraphicsLayer*) const { - return nullptr; - } - -#if DCHECK_IS_ON() - // CompositedLayerMapping overrides this to verify that it is not - // currently painting contents. An ASSERT fails, if it is. - // This is executed in GraphicsLayer construction and destruction - // to verify that we don't create or destroy GraphicsLayers - // while painting. - virtual void VerifyNotPainting() {} -#endif - - void Trace(Visitor*) const override {} -}; - } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GRAPHICS_LAYER_CLIENT_H_
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc index 6b761e54..5e261c8 100644 --- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc +++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
@@ -1060,11 +1060,6 @@ if (watch_time_reporter_) watch_time_reporter_->OnSeeking(); - // Send the seek updates only when the seek pipeline hasn't started, - // OnPipelineSeeked is not called yet. - if (!seeking_) - client_->DidSeek(); - // TODO(sandersd): Move `seeking_` to PipelineController. // TODO(sandersd): Do we want to reset the idle timer here? delegate_->SetIdle(delegate_id_, false); @@ -2281,7 +2276,6 @@ !seeking_) { underflow_timer_ = std::make_unique<base::ElapsedTimer>(); watch_time_reporter_->OnUnderflow(); - client_->DidBufferUnderflow(); if (playback_events_recorder_) playback_events_recorder_->OnBuffering();
diff --git a/third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h b/third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h deleted file mode 100644 index 5bc2a35..0000000 --- a/third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h +++ /dev/null
@@ -1,68 +0,0 @@ -// Copyright 2016 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_PLATFORM_TESTING_FAKE_GRAPHICS_LAYER_CLIENT_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_FAKE_GRAPHICS_LAYER_CLIENT_H_ - -#include "third_party/blink/renderer/platform/graphics/graphics_layer_client.h" -#include "ui/gfx/geometry/rect.h" - -namespace blink { - -// A simple GraphicsLayerClient implementation suitable for use in unit tests. -class FakeGraphicsLayerClient - : public GarbageCollected<FakeGraphicsLayerClient>, - public GraphicsLayerClient { - public: - // GraphicsLayerClient implementation. - gfx::Rect ComputeInterestRect(const GraphicsLayer*, - const gfx::Rect&) const override { - return gfx::Rect(); - } - gfx::Rect PaintableRegion(const GraphicsLayer*) const override { - return gfx::Rect(); - } - PaintArtifactCompositor* GetPaintArtifactCompositor() override { - return nullptr; - } - String DebugName(const GraphicsLayer*) const override { return String(); } - bool IsTrackingRasterInvalidations() const override { - return is_tracking_raster_invalidations_; - } - bool NeedsRepaint(const GraphicsLayer&) const override { - return needs_repaint_; - } - void PaintContents(const GraphicsLayer* layer, - GraphicsContext& context, - GraphicsLayerPaintingPhase phase, - const gfx::Rect& rect) const override { - if (painter_) - painter_(layer, context, phase, rect); - } - - void SetIsTrackingRasterInvalidations(bool is_tracking_raster_invalidations) { - is_tracking_raster_invalidations_ = is_tracking_raster_invalidations; - } - - void SetNeedsRepaint(bool needs_repaint) { needs_repaint_ = needs_repaint; } - - using Painter = std::function<void(const GraphicsLayer*, - GraphicsContext&, - GraphicsLayerPaintingPhase, - const gfx::Rect&)>; - void SetPainter(const Painter& painter) { painter_ = painter; } - - void Trace(Visitor* visitor) const override { - GraphicsLayerClient::Trace(visitor); - } - - private: - Painter painter_ = nullptr; - bool is_tracking_raster_invalidations_ = false; - bool needs_repaint_ = false; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_FAKE_GRAPHICS_LAYER_CLIENT_H_
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index a94af8e..d9afa09 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -936,7 +936,6 @@ crbug.com/1035582 paint/invalidation/overflow/float-overflow-right.html [ Failure ] crbug.com/1035582 virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations.html [ Failure ] crbug.com/1035582 virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance.html [ Failure ] -crbug.com/1035582 http/tests/devtools/sources/debugger-breakpoints/disable-breakpoints.js [ Failure ] crbug.com/1035582 paint/invalidation/forms/checkbox-focus-by-mouse-then-keydown.html [ Failure ] crbug.com/1035582 paint/invalidation/forms/radio-focus-by-mouse-then-keydown.html [ Failure ] crbug.com/1035582 editing/input/linux_rtl_composition_underline.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 0244f755..92bbb4e 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1722,6 +1722,7 @@ crbug.com/1158554 external/wpt/css/css-conditional/css-supports-042.xht [ Failure ] # @container +crbug.com/829028 external/wpt/css/css-contain/container-queries/inline-multicol-inside-container-crash.html [ Crash ] crbug.com/1273913 external/wpt/css/css-contain/container-queries/pseudo-elements-002.tentative.html [ Failure ] crbug.com/829028 external/wpt/css/css-contain/contain-inline-size-multicol.html [ Failure ]
diff --git a/third_party/blink/web_tests/WebGPUExpectations b/third_party/blink/web_tests/WebGPUExpectations index 1555e556..17ace2d 100644 --- a/third_party/blink/web_tests/WebGPUExpectations +++ b/third_party/blink/web_tests/WebGPUExpectations
@@ -467,6 +467,10 @@ # (NVIDIA-only) Started failing when the test was added. crbug.com/tint/1287 [ Linux ] wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,shader_io,shared_structs:shared_between_stages:* [ Failure ] +# Missing several necessary Vulkan extensions on GTX 1660 machines. +crbug.com/dawn/1213 [ Linux ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:offsets_and_sizes_copy_depth_stencil:* [ Crash Failure ] +crbug.com/dawn/1213 [ Linux ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:rowsPerImage_and_bytesPerRow_depth_stencil:* [ Crash Failure ] + ### ### Windows (D3D12) specific ###
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index f248f37..809b340c 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -235764,7 +235764,7 @@ [] ], "support": { - "testcommon.js": [ + "cq-testcommon.js": [ "2eaca1dd091cbf7c3a406fa02c2696d7a9c258e4", [] ] @@ -347313,6 +347313,13 @@ {} ] ], + "border-radius-css-text.html": [ + "f8311bae808623cd4c083e7c3b9374aa32375931", + [ + null, + {} + ] + ], "inheritance.sub.html": [ "01bb8422991ee48da525087d5462c380c5eb8b84", [ @@ -348841,392 +348848,392 @@ ], "container-queries": { "animation-container-size.html": [ - "909e75b2f3edfb33e8b29554b7509a3e27b97347", + "846281ba7a455a581ceaa83157a1d8ec2af41928", [ null, {} ] ], "animation-container-type-dynamic.html": [ - "d885cd70d1105b6ddaac55a3a55fe26db0b9ae01", + "c09665424ac9143b09f4c0ab785a9d407e2fbb11", [ null, {} ] ], "animation-nested-animation.html": [ - "79c13309ecdf0b98abbb37f94b0823adef2aed8e", + "68b258bbd4da104cd368fa5c5b6e3af2ccd1e410", [ null, {} ] ], "animation-nested-transition.html": [ - "85f5358d1d31d689c1f3f97dec8c3c367e2040d4", + "110a3bd91167c83b283135dc7376662677f65bd1", [ null, {} ] ], "aspect-ratio-feature-evaluation.html": [ - "4a0916dd740c257879d79b8db4ffabf19e0c9f8b", + "f2919e509122f9a7204cc0af1ca50efb0b639c87", [ null, {} ] ], "at-container-parsing.html": [ - "f6c27ece810074ce1286001fa79adaab6cefca8a", + "f49a382cadb01714594be9646253bef255ed8735", [ null, {} ] ], "auto-scrollbars.html": [ - "2dea807fc5d0857f95a409d3d5afbe9ed5a9b90e", + "19dbd350abec4c6a45ef8ba7f2ae0f2b7fa806d7", [ null, {} ] ], "backdrop-invalidation.html": [ - "47d41fdb814007c3c45f6b1243af1437e5da9530", + "acb5b2b1408240452589e539fc7a977a815ef619", [ null, {} ] ], "conditional-container-status.html": [ - "c082a08aae9d1a6a97f44634a26c06f27dbbc13e", + "cdeaf4187d7551f0633fadf56b8c5dec24a785cd", [ null, {} ] ], "container-computed.html": [ - "97c5cf5d5025e9bd742dca1071f66d600187a856", + "1bd063ab78c88a01fa4bb49de115be06e942d1c3", [ null, {} ] ], "container-for-shadow-dom.tentative.html": [ - "54e31ef3c5d2a27273824c63c80f6426b503e097", + "aee25f86d70d13b2fe6898cb9ea21ab5f8b98c6f", [ null, {} ] ], "container-inheritance.html": [ - "7bdbcdc99470109827fec911d2132dd2a5700f08", + "efc09983c0ddc97c393351633b7bf680f5ed4aae", [ null, {} ] ], "container-name-computed.html": [ - "01ebb8b6fedd80c33e3a77e3a96de85b1e570608", + "79361d73088faae3efd868ec165fd9ec1fb3d42e", [ null, {} ] ], "container-name-invalidation.html": [ - "4dfd24c82f3bacc61355c1195b7899c60185c8be", + "796884e1560507338f052350db2ff7f173a2aa73", [ null, {} ] ], "container-name-parsing.html": [ - "810a0c5da85aaeb6aadea7fee7d6ae9f416f6371", + "4fc6a1757f4266123463db9d3b156495e0a3fc46", [ null, {} ] ], "container-parsing.html": [ - "d9c1b2d13f1b3c88072479e4e5bd85bbf845f029", + "e18b282e0280f51e3d8b15eb6b9b571c3affea37", [ null, {} ] ], "container-selection.html": [ - "b08df66cdacec5e9d9a822494b5a26be3f9c216e", + "a797fe47470090e57a9c5ee561de01d95db5b288", [ null, {} ] ], "container-size-invalidation.html": [ - "b7a5d65e43f93429b564d7662668991ba1f05178", + "7008d4a7157769b53e349304b82e1470aa205805", [ null, {} ] ], "container-type-computed.html": [ - "7b3e71830abc401bdc3198d48a57b5e0039f8d6b", + "cd5f1cbb789e2eee7c8cb239b7285d04e04f6823", [ null, {} ] ], "container-type-containment.html": [ - "42a42eacb266914daf3ee893f016ad94c1df3989", + "66500a6a71c12087fc02cc292cabdf50314962a7", [ null, {} ] ], "container-type-invalidation.html": [ - "209c77f569c3ca90b6aa61238a0510d04fe4f50c", + "178c50ff1b20ad34e114fb3935b80885042bdf1c", [ null, {} ] ], "container-type-layout-invalidation.html": [ - "60b8d10b4b150dae548e86dbb9f8e73e87717e88", + "3103de81f7989de283be355b47b3a137c12dd3b4", [ null, {} ] ], "container-type-parsing.html": [ - "63953897c9b022b9b022d7e138f9d82e16dd890c", + "2ed93c20225b8b181e4f487b8d1be5be35bbfc65", [ null, {} ] ], "container-units-animation.html": [ - "2841309208321a344691cbd1036e0f823655c795", + "75178bb99950cc0054d4df5c69838eb343a85492", [ null, {} ] ], "container-units-basic.html": [ - "abe3eaf8c5e4260ea4c19f424532f5fc1565bd8c", + "09f662438d768be8e9b39bb8ce37f0b2c344ad86", [ null, {} ] ], "container-units-computational-independence.html": [ - "42c9e6ecc949d48980f385ba5bdb024a020c9b62", + "5f22a290a0677bdd56077f6b25552242b7c6c945", [ null, {} ] ], "container-units-invalidation.html": [ - "2ddc2756e7121915ec53fb0ae54fc1d9eafd884f", + "257573a9269f2add840bb66466f12a05a094ed4e", [ null, {} ] ], "container-units-selection.html": [ - "ef05ba8f650f8a619b5531ee6ab8f940576cf099", + "861381345f9e63e01ca5c655b0dc95c6c02881d2", [ null, {} ] ], "container-units-typed-om.html": [ - "6f3d7585c54a89e4a404b8a761f5c50114d92bee", + "9baf12d1c9059e58fb8103a8baa0d1d9997a4deb", [ null, {} ] ], "counters-flex-circular.html": [ - "31741e5c5b4a5caf7f6e31bd9378c7f9ed418e36", + "3bee28796b58f9465fecb9885eaaa36fbb7f0cb1", [ null, {} ] ], "display-contents.html": [ - "4be3e7956cc7ff10172bc354daddd211faa2b0b3", + "55df5df5be0cbe5ec48fd3dedc6c3e63b90f6bad", [ null, {} ] ], "display-none.html": [ - "8341b364641728fb5dd1ed51a29eccdd59e0f227", + "cdd614c52a22ec2d353c79637a2892c0d1c9e21b", [ null, {} ] ], "font-relative-units-dynamic.html": [ - "f50614c4e76f3c694b7411597b95e1fbc844765e", + "0c7786f7e6e928745814d8657056f62dd85c34f3", [ null, {} ] ], "font-relative-units.html": [ - "670629dd037d562ed29bd11c0162bbf29743c778", + "cad44d580a092d51d10ade096a8179b037a51b5a", [ null, {} ] ], "get-animations.html": [ - "4c7489c38d86da599cf30037d3b7688e50009832", + "ea95bb9800352b92c16328c632cece6b1f9ecf13", [ null, {} ] ], "iframe-invalidation.html": [ - "09adf7050059325043ad5f6c2f9e598451c13049", + "8fc81a7cac53b85b72710570f5bb6b2f0fd94e78", [ null, {} ] ], "ineligible-containment.html": [ - "c041acd5b9d1399ea3f15bfd359ce1a48db81606", + "5077508d19d77c7a2772f617581aee5d0473aa34", [ null, {} ] ], "inline-size-and-min-width.html": [ - "8d72729b81bbd65e988f94573fb0698635a625c3", + "7d4ca6a57a758d9f10b8fe1259e48a895298e8d0", [ null, {} ] ], "inline-size-containment-vertical-rl.html": [ - "cfc0206e357f9c4dee1f0eb44051e0916544b9e6", + "ec19467c10eacfdddbe720d4faacf69cb86dbb44", [ null, {} ] ], "inline-size-containment.html": [ - "d600fa098abda84f762596ee29ab21ef9e74ea21", + "2a450537404f8935aec9ac893a247c95488c7a3e", [ null, {} ] ], "orthogonal-wm-container-query.html": [ - "3147a429ab2993282680f0377b3c4a79d9eb627a", + "30e58f857cd28e524bfa5b4c420f4b268904a4e4", [ null, {} ] ], "pseudo-elements-001.html": [ - "35a6759c3902458a6e29fbde5900a1ea2819becf", + "c5fd15f40b060f5ad3bd04895f6e0dd191000177", [ null, {} ] ], "pseudo-elements-003.tentative.html": [ - "68fd06fa3afd35d9751bc059d50443bc20b07357", + "7d03dc04b9c5281eb336e8efa36e7973526f9b4d", [ null, {} ] ], "query-evaluation.html": [ - "e8952b28fbb8eb4be7e953eb3116ebe28ddc586d", + "50ae75d4c0ac80af84dfe0a120283f3513d7bdd4", [ null, {} ] ], "reattach-container-with-dirty-child.html": [ - "ab4cc229322dafe07ede0de19c6ae5fb5c423f6c", + "0cdf5716a61c0713c16e9ec02383455dc64b190d", [ null, {} ] ], "size-container-no-principal-box.html": [ - "c26dfdd1c33ebbb14b149a7a929d3ae67b3f5b03", + "cc409b4597e8e2caa25ef4e20d2909fe5564bb7a", [ null, {} ] ], "size-feature-evaluation.html": [ - "763ac196fbe31e0e22c37de599d0f922701a3bec", + "e558d8316985ceb258d87d9dda83217974b5b3d1", [ null, {} ] ], "style-change-in-container.html": [ - "d2c6ff3cbcf35278bb4648871bb90f6454344bb9", + "82a830cc502713d49ae3001aa76f37c27b5f6e4a", [ null, {} ] ], "top-layer-dialog-container.html": [ - "f3799fe185813d294b5992e2e8710a1cc838d6b4", + "a61c35a37e60a1df00cef272ddee95cd88833a5e", [ null, {} ] ], "top-layer-dialog.html": [ - "54ba22ee4ddf4227519c15e42267e1fa603d6259", + "0983d49a937d468c8374153bfea88e47cd331cdb", [ null, {} ] ], "top-layer-nested-dialog.html": [ - "34904706939b273782a3db179f074d69c54f2eba", + "5649ad4b0e4af027fde209f37d297af9bc9160c4", [ null, {} ] ], "transition-scrollbars.html": [ - "816ae0683d12447b341714fdbc886e6ce3e01381", + "33734eb8b0501f7c583f06439cdc1c9a0a241436", [ null, {} ] ], "transition-style-change-event.html": [ - "b5ae21ffe7687ce4e4e9136a4e6ef3f977d1f403", + "f10e58c26e36d7cd154b5897a50b8f4c1bac8f32", [ null, {} ] ], "unsupported-axis.html": [ - "757b62d56555dddf16df9d9cee26421b0964c2fb", + "9ab91f81eaa9566739178c28210255f5d5413799", [ null, {} ] ], "viewport-units-dynamic.html": [ - "72b1c4be6f73fe86ad73f5c760fefe41745c4c7b", + "092c4e4bee49a08dbd2b0a3549f4bef68a0128a7", [ null, {} ] ], "viewport-units.html": [ - "6cf1d20416da2bbfbfc890edea38ecb76623bf6a", + "68546258ca521a21c24b2411cc992c3c571d8c18", [ null, {} @@ -373743,7 +373750,7 @@ ] ], "focus-display-none-001.html": [ - "fe5716cc41c4a622159395ba26da3a7598cfcec8", + "63bf4465eae10cea61864f301ba94adcbd8eb854", [ null, {} @@ -374155,7 +374162,7 @@ ] ], "focus-within-display-none-001.html": [ - "a15f031fa2c0587bb6fc78ce3d70cf1742566d2d", + "3f96fb267de4b089f7bb5fb5c0effcfd2e9052b5", [ null, {} @@ -435374,7 +435381,7 @@ }, "processing-model": { "focus-fixup-rule-one-no-dialogs.html": [ - "d8171abc715990a9e752c2d974acdfd7ecd34fc2", + "31b191938402a4c10ef5c42e6dcde2b292695279", [ null, {}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/border-radius-css-text.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/border-radius-css-text.html new file mode 100644 index 0000000..f8311bae8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/border-radius-css-text.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Backgrounds and Borders Module Level 3: border-radius in cssText</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#border-radius"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<div id="test"></div> +<script> +test(() => { + const element = document.getElementById("test"); + assert_equals(element.style.cssText, "", "cssText is initially empty"); + + element.style.borderRadius = "10px"; + assert_equals(element.style.cssText, "border-radius: 10px;"); + + element.style.borderTopLeftRadius = "20px"; + assert_equals(element.style.cssText, "border-radius: 20px 10px 10px;"); + + element.style.borderBottomLeftRadius = "30px"; + assert_equals(element.style.cssText, "border-radius: 20px 10px 10px 30px;"); +}, "Setting border-radius does not expand to longhand properties in cssText."); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-multicol-inside-container-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-multicol-inside-container-crash.html new file mode 100644 index 0000000..d8ec414 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-multicol-inside-container-crash.html
@@ -0,0 +1,21 @@ +<!doctype html> +<title>CSS Container Queries Test: Inline multicol inside size container - crash</title> +<link rel="help" href="https://drafts.csswg.org/css-contain-3/#size-container"> +<link rel="help" href="https://crbug.com/829028"> +<style> + #container { + container-type: size; + width: 200px; + height: 100px; + } + @container size(width <= 200px) { + #multicol { + column-count: 2; + column-gap: 0; + } + } +</style> +<p>Test passes if it doesn't crash.</p> +<div id="container"> + <span id="multicol"><div></div></span> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/multicol-inside-container.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/multicol-inside-container.html new file mode 100644 index 0000000..0c00734 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/multicol-inside-container.html
@@ -0,0 +1,28 @@ +<!doctype html> +<title>CSS Container Queries Test: Multicol inside size container</title> +<link rel="help" href="https://drafts.csswg.org/css-contain-3/#size-container"> +<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html"> +<style> + #container { + container-type: size; + width: 200px; + height: 100px; + } + @container size(width <= 200px) { + #multicol { + column-count: 2; + column-gap: 0; + } + } + #green { + display: inline-block; + width: 100%; + height: 100px; + background-color: green; + vertical-align: bottom; + } +</style> +<p>Test passes if there is a filled green square.</p> +<div id="container"> + <div id="multicol"><div id="green"></div></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-display-none-001.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-display-none-001.html index fe5716c..63bf446 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/focus-display-none-001.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-display-none-001.html
@@ -3,7 +3,7 @@ <title>Selectors Level 4: focus</title> <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> <link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-pseudo"> -<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule-one"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule"> <meta name="assert" content="Checks ':focus' pseudo-class after 'display: none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-within-display-none-001.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-within-display-none-001.html index a15f031f..3f96fb26 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/focus-within-display-none-001.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-within-display-none-001.html
@@ -3,7 +3,7 @@ <title>Selectors Level 4: focus-within</title> <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> <link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-within-pseudo"> -<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule-one"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule"> <meta name="assert" content="Checks ':focus-within' pseudo-class after 'display: none'."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/html/interaction/focus/processing-model/focus-fixup-rule-one-no-dialogs.html b/third_party/blink/web_tests/external/wpt/html/interaction/focus/processing-model/focus-fixup-rule-one-no-dialogs.html index d8171abc..31b1919 100644 --- a/third_party/blink/web_tests/external/wpt/html/interaction/focus/processing-model/focus-fixup-rule-one-no-dialogs.html +++ b/third_party/blink/web_tests/external/wpt/html/interaction/focus/processing-model/focus-fixup-rule-one-no-dialogs.html
@@ -2,7 +2,7 @@ <meta charset="utf-8"> <title>Focus fixup rule one (no <dialog>s involved)</title> <link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> -<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule-one"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule"> <link rel="help" href="https://html.spec.whatwg.org/multipage/forms.html#attr-fieldset-disabled"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/urlpattern/resources/urlpatterntestdata.json b/third_party/blink/web_tests/external/wpt/urlpattern/resources/urlpatterntestdata.json index f097edb..93ef6d1 100644 --- a/third_party/blink/web_tests/external/wpt/urlpattern/resources/urlpatterntestdata.json +++ b/third_party/blink/web_tests/external/wpt/urlpattern/resources/urlpatterntestdata.json
@@ -2479,5 +2479,91 @@ "expected_match": { "pathname": { "input": "foobarbaz", "groups": { "0": "foo", "1": "barbaz" }} } + }, + { + "pattern": [{ "pathname": "{:foo}(.*)" }], + "inputs": [{ "pathname": "foobarbaz" }], + "expected_match": { + "pathname": { "input": "foobarbaz", "groups": { "foo": "f", "0": "oobarbaz" }} + } + }, + { + "pattern": [{ "pathname": "{:foo}(barbaz)" }], + "inputs": [{ "pathname": "foobarbaz" }], + "expected_match": { + "pathname": { "input": "foobarbaz", "groups": { "foo": "foo", "0": "barbaz" }} + } + }, + { + "pattern": [{ "pathname": "{:foo}{(.*)}" }], + "inputs": [{ "pathname": "foobarbaz" }], + "expected_obj": { + "pathname": "{:foo}(.*)" + }, + "expected_match": { + "pathname": { "input": "foobarbaz", "groups": { "foo": "f", "0": "oobarbaz" }} + } + }, + { + "pattern": [{ "pathname": "{:foo}{(.*)bar}" }], + "inputs": [{ "pathname": "foobarbaz" }], + "expected_obj": { + "pathname": ":foo{(.*)bar}" + }, + "expected_match": null + }, + { + "pattern": [{ "pathname": "{:foo}{bar(.*)}" }], + "inputs": [{ "pathname": "foobarbaz" }], + "expected_obj": { + "pathname": ":foo{bar(.*)}" + }, + "expected_match": { + "pathname": { "input": "foobarbaz", "groups": { "foo": "foo", "0": "baz" }} + } + }, + { + "pattern": [{ "pathname": "{:foo}:bar(.*)" }], + "inputs": [{ "pathname": "foobarbaz" }], + "expected_obj": { + "pathname": ":foo:bar(.*)" + }, + "expected_match": { + "pathname": { "input": "foobarbaz", "groups": { "foo": "f", "bar": "oobarbaz" }} + } + }, + { + "pattern": [{ "pathname": "{:foo}?(.*)" }], + "inputs": [{ "pathname": "foobarbaz" }], + "expected_obj": { + "pathname": ":foo?*" + }, + "expected_match": { + "pathname": { "input": "foobarbaz", "groups": { "foo": "f", "0": "oobarbaz" }} + } + }, + { + "pattern": [{ "pathname": "{:foo\\bar}" }], + "inputs": [{ "pathname": "foobar" }], + "expected_match": { + "pathname": { "input": "foobar", "groups": { "foo": "foo" }} + } + }, + { + "pattern": [{ "pathname": "{:foo\\.bar}" }], + "inputs": [{ "pathname": "foo.bar" }], + "expected_obj": { + "pathname": "{:foo.bar}" + }, + "expected_match": { + "pathname": { "input": "foo.bar", "groups": { "foo": "foo" }} + } + }, + { + "pattern": [{ "pathname": "{:foo(foo)bar}" }], + "inputs": [{ "pathname": "foobar" }], + "expected_match": { + "pathname": { "input": "foobar", "groups": { "foo": "foo" }} + } } ]
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png index a0005890..f89ed93 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png index f5f0fd2e..8736e02 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png index 2a828885..ebfcbf0 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png index 6283ca4..9989ff0 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js index bdb79dd6..c24fff55 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js
@@ -86,6 +86,9 @@ "navigator.share" : "00000000-0000-0000-0000-00000000002B", "background-fetch" : "00000000-0000-0000-0000-00000000002C", + + "window.outersize" : "00000000-0000-0000-0000-00000000002D", + "window.innersize" : "00000000-0000-0000-0000-00000000002E", // Add keys above this list, incrementing the key UUID in hexadecimal }
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/window-outer-dimensions-inner.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/window-outer-dimensions-inner.html new file mode 100644 index 0000000..4a8b9c3 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/window-outer-dimensions-inner.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<script src="utils.js"></script> +<title>Fenced frame content to report the result of prerendering</title> + +<body> + <script> + async function report() { // Needed in order to use top-level await. + // This file is meant to run in a <fencedframe>. It reports its dimensions + // back to the outermost page, which in turn checks for correctness. + const window_outer_size_key = KEYS["window.outersize"]; + const window_inner_size_key = KEYS["window.innersize"]; + + const url = new URL(location.href); + const dimension = url.searchParams.get("dimension"); + const extra_children = url.searchParams.get("extra_children"); + + if (extra_children == "0") { + let outer_result = (dimension == "width") ? + window.outerWidth : window.outerHeight; + + let inner_result = (dimension == "width") ? + window.innerWidth : window.innerHeight; + + writeValueToServer(window_outer_size_key, outer_result); + writeValueToServer(window_inner_size_key, inner_result); + } else { + const iframe = document.createElement('iframe'); + iframe.src = "window-outer-dimensions-inner.html?dimension=" + + dimension + "&extra_children=" + (parseInt(extra_children) - 1); + document.body.append(iframe); + } + + } + report(); + </script> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/window-outer-dimensions-inner.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/window-outer-dimensions-inner.html.headers new file mode 100644 index 0000000..6247f6d --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/window-outer-dimensions-inner.html.headers
@@ -0,0 +1 @@ +Supports-Loading-Mode: fenced-frame \ No newline at end of file
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/window-outer-dimensions.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/window-outer-dimensions.html new file mode 100644 index 0000000..041ceb8 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/window-outer-dimensions.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<title>Test window.prompt</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="resources/utils.js"></script> + +<body> + <script> + async function runTest(dimension, extra_children) { + const window_outer_size_key = KEYS["window.outersize"]; + const window_inner_size_key = KEYS["window.innersize"]; + + const window_outer_size_from_top_frame = (dimension == "width" ? + window.outerWidth : window.outerHeight).toString(); + + const new_frame = attachFencedFrame( + "resources/window-outer-dimensions-inner.html?dimension=" + dimension + + "&extra_children=" + extra_children + ); + + // Get the outer and inner width/height from either the top level + // fencedframe or the nested iframe. + const result_outer = await nextValueFromServer(window_outer_size_key); + const result_inner = await nextValueFromServer(window_inner_size_key); + + assert_not_equals(result_outer, + window_outer_size_from_top_frame, + "Outer " + dimension + " not read in fenced frame" + + " tree."); + + assert_equals(result_outer, + result_inner, + "Fencedframe's outer/inner " + dimension + " match."); + } + + promise_test(async () => { + return runTest("width", 0); + }, "window.outerWidth"); + + promise_test(async () => { + return runTest("height", 0); + }, "window.outerHeight"); + + promise_test(async () => { + return runTest("width", 1); + }, "window.outerWidth nested iframe"); + + promise_test(async () => { + return runTest("height", 1); + }, "window.outerHeight nested iframe"); + </script> +</body>
diff --git a/third_party/distributed_point_functions/fuzz/dpf_fuzzer.cc b/third_party/distributed_point_functions/fuzz/dpf_fuzzer.cc index ced86b2..3fb1111 100644 --- a/third_party/distributed_point_functions/fuzz/dpf_fuzzer.cc +++ b/third_party/distributed_point_functions/fuzz/dpf_fuzzer.cc
@@ -241,8 +241,16 @@ // Always evaluate on alpha. evaluation_points.push_back(alpha); + int32_t previous_log_domain_size = 0; for (int i = level_step - 1; i < static_cast<int>(num_levels); i += level_step) { + // If any gap in the log_domain_sizes used in successive evaluations is + // larger than 62, validation will fail in `EvaluateAndCheckLevel`. + int32_t current_log_domain_size = parameters[i].log_domain_size(); + if (current_log_domain_size - previous_log_domain_size > 62) + return 0; + previous_log_domain_size = current_log_domain_size; + switch (parameters[i].value_type().integer().bitsize()) { case 8: EvaluateAndCheckLevel<uint8_t>(i, evaluation_points, alpha, beta, ctx0,
diff --git a/third_party/liburlpattern/BUILD.gn b/third_party/liburlpattern/BUILD.gn index 0a5fc1b..0023669 100644 --- a/third_party/liburlpattern/BUILD.gn +++ b/third_party/liburlpattern/BUILD.gn
@@ -39,6 +39,7 @@ "//base/test:run_all_unittests", "//testing/gtest", "//third_party/abseil-cpp:absl", + "//third_party/icu:icu", ] # Note, also update the local modifications in README.chromium.
diff --git a/third_party/liburlpattern/pattern.cc b/third_party/liburlpattern/pattern.cc index 7affb5a..885417b 100644 --- a/third_party/liburlpattern/pattern.cc +++ b/third_party/liburlpattern/pattern.cc
@@ -7,6 +7,7 @@ #include "third_party/abseil-cpp/absl/base/macros.h" #include "third_party/abseil-cpp/absl/strings/str_format.h" +#include "third_party/icu/source/common/unicode/utf8.h" #include "third_party/liburlpattern/utils.h" namespace liburlpattern { @@ -73,6 +74,14 @@ ABSL_ASSERT(value.empty()); } +bool Part::HasCustomName() const { + // Determine if the part name was custom, like `:foo`, or an + // automatically assigned numeric value. Since custom group + // names follow javascript identifier rules the first character + // cannot be a digit, so that is all we need to check here. + return !name.empty() && !std::isdigit(name[0]); +} + Pattern::Pattern(std::vector<Part> part_list, Options options, std::string segment_wildcard_regex) @@ -95,7 +104,7 @@ for (size_t i = 0; i < part_list_.size(); ++i) { const Part& part = part_list_[i]; - // + if (part.type == PartType::kFixed) { // A simple fixed string part. if (part.modifier == Modifier::kNone) { @@ -112,20 +121,26 @@ continue; } - // Determine if the part needs a grouping like `{ ... }`. This is only - // necessary when using a non-automatic prefix or any suffix. + bool custom_name = part.HasCustomName(); + + // Determine if the part needs a grouping like `{ ... }`. This is + // necessary when the group: + // + // 1. is using a non-automatic prefix or any suffix. + // 2. followed by a matching group that may be represented by a + // `(...)` expression. This is necessary to avoid the following `(...)` + // being mistakenly interpretted as the custom regexp for this + // named group; like `:foo(...)`. + const Part* next_part = + (i + 1) < part_list_.size() ? &part_list_[i + 1] : nullptr; bool needs_grouping = !part.suffix.empty() || (!part.prefix.empty() && (part.prefix.size() != 1 || - options_.prefix_list.find(part.prefix[0]) == std::string::npos)); - - // Determine if the part name was custom, like `:foo`, or an - // automatically assigned numeric value. Since custom group - // names follow javascript identifier rules the first character - // cannot be a digit, so that is all we need to check here. - ABSL_ASSERT(!part.name.empty()); - bool custom_name = !std::isdigit(part.name[0]); + options_.prefix_list.find(part.prefix[0]) == std::string::npos)) || + (custom_name && part.modifier == Modifier::kNone && next_part && + next_part->type != PartType::kFixed && next_part->prefix.empty() && + next_part->suffix.empty() && !next_part->HasCustomName()); // This is a full featured part. We must generate a string that looks // like: @@ -177,6 +192,21 @@ } } + // If the matching group is a simple `:foo` custom name with the default + // segment wildcard, then we must check for a trailing suffix that could + // be interpreted as a trailing part of the name itself. In these cases + // we must escape the beginning of the suffix in order to separate it + // from the end of the custom name; e.g. `:foo\\bar` instead of `:foobar`. + if (part.type == PartType::kSegmentWildcard && custom_name && + !part.suffix.empty()) { + UChar32 codepoint = -1; + U8_GET(reinterpret_cast<const uint8_t*>(part.suffix.data()), 0, 0, + static_cast<int>(part.suffix.size()), codepoint); + if (IsNameCodepoint(codepoint, /*first_codepoint=*/false)) { + result += "\\"; + } + } + EscapePatternStringAndAppend(part.suffix, result); if (needs_grouping)
diff --git a/third_party/liburlpattern/pattern.h b/third_party/liburlpattern/pattern.h index 67f46b1..f522f44c 100644 --- a/third_party/liburlpattern/pattern.h +++ b/third_party/liburlpattern/pattern.h
@@ -85,6 +85,10 @@ std::string suffix, Modifier modifier); Part() = default; + + // Returns true if the `name` member is a custom name; e.g. for a `:foo` + // group. + bool HasCustomName() const; }; COMPONENT_EXPORT(LIBURLPATTERN)
diff --git a/third_party/liburlpattern/pattern_unittest.cc b/third_party/liburlpattern/pattern_unittest.cc index 950619cc..74a53cdf 100644 --- a/third_party/liburlpattern/pattern_unittest.cc +++ b/third_party/liburlpattern/pattern_unittest.cc
@@ -342,6 +342,47 @@ RunPatternStringTest("{(foo)a}(.*)", "{(foo)a}(.*)"); } +TEST(PatternStringTest, NamedGroupInGroupingFollowedByWildcard) { + RunPatternStringTest("{:foo}(.*)", "{:foo}(.*)"); +} + +TEST(PatternStringTest, NamedGroupInGroupingFollowedByRegexp) { + RunPatternStringTest("{:foo}(bar)", "{:foo}(bar)"); +} + +TEST(PatternStringTest, NamedGroupInGroupingFollowedByWildcardInGrouping) { + RunPatternStringTest("{:foo}{(.*)}", "{:foo}(.*)"); +} + +TEST(PatternStringTest, NamedGroupInGroupingFollowedByWildcardWithSuffix) { + RunPatternStringTest("{:foo}{(.*)bar}", ":foo{(.*)bar}"); +} + +TEST(PatternStringTest, NamedGroupInGroupingFollowedByWildcardWithPrefix) { + RunPatternStringTest("{:foo}{bar(.*)}", ":foo{bar(.*)}"); +} + +TEST(PatternStringTest, NamedGroupInGroupingFollowedByWildcardWithCustomName) { + RunPatternStringTest("{:foo}:bar(.*)", ":foo:bar(.*)"); +} + +TEST(PatternStringTest, + NamedGroupInGroupingWithOptionalModifierFollowedByWildcard) { + RunPatternStringTest("{:foo}?(.*)", ":foo?*"); +} + +TEST(PatternStringTest, NamedGroupWithEscapedValidNameSuffix) { + RunPatternStringTest("{:foo\\bar}", "{:foo\\bar}"); +} + +TEST(PatternStringTest, NamedGroupWithEscapedInvalidNameSuffix) { + RunPatternStringTest("{:foo\\.bar}", "{:foo.bar}"); +} + +TEST(PatternStringTest, NamedGroupWithCustomRegexpAndValidNameSuffix) { + RunPatternStringTest("{:foo(baz)bar}", "{:foo(baz)bar}"); +} + struct DirectMatchCase { absl::string_view input; bool expected_match = true;
diff --git a/third_party/liburlpattern/tokenize.cc b/third_party/liburlpattern/tokenize.cc index c1b1f93c..cbc38dc 100644 --- a/third_party/liburlpattern/tokenize.cc +++ b/third_party/liburlpattern/tokenize.cc
@@ -9,6 +9,7 @@ #include "third_party/abseil-cpp/absl/strings/str_format.h" #include "third_party/icu/source/common/unicode/uchar.h" #include "third_party/icu/source/common/unicode/utf8.h" +#include "third_party/liburlpattern/utils.h" // The following code is a translation from the path-to-regexp typescript at: // @@ -24,24 +25,6 @@ return c >= 0x00 && c <= 0x7f; } -bool IsNameCodepoint(UChar32 c, bool first_codepoint) { - // Require group names to follow the same character restrictions as - // javascript identifiers. This code originates from v8 at: - // - // https://source.chromium.org/chromium/chromium/src/+/master:v8/src/strings/char-predicates.cc;l=17-34;drc=be014256adea1552d4a044ef80616cdab6a7d549 - // - // We deviate from js identifiers, however, in not support the backslash - // character. This is mainly used in js identifiers to allow escaped - // unicode sequences to be written in ascii. The js engine, however, - // should take care of this long before we reach this level of code. So - // we don't need to handle it here. - if (first_codepoint) { - return u_hasBinaryProperty(c, UCHAR_ID_START) || c == '$' || c == '_'; - } - return u_hasBinaryProperty(c, UCHAR_ID_CONTINUE) || c == '$' || c == '_' || - c == 0x200c || c == 0x200d; -} - class Tokenizer { public: Tokenizer(absl::string_view pattern, TokenizePolicy policy)
diff --git a/third_party/liburlpattern/utils.cc b/third_party/liburlpattern/utils.cc index c9955e1d..5f7f2d69 100644 --- a/third_party/liburlpattern/utils.cc +++ b/third_party/liburlpattern/utils.cc
@@ -52,4 +52,22 @@ return result; } +bool IsNameCodepoint(UChar32 c, bool first_codepoint) { + // Require group names to follow the same character restrictions as + // javascript identifiers. This code originates from v8 at: + // + // https://source.chromium.org/chromium/chromium/src/+/master:v8/src/strings/char-predicates.cc;l=17-34;drc=be014256adea1552d4a044ef80616cdab6a7d549 + // + // We deviate from js identifiers, however, in not support the backslash + // character. This is mainly used in js identifiers to allow escaped + // unicode sequences to be written in ascii. The js engine, however, + // should take care of this long before we reach this level of code. So + // we don't need to handle it here. + if (first_codepoint) { + return u_hasBinaryProperty(c, UCHAR_ID_START) || c == '$' || c == '_'; + } + return u_hasBinaryProperty(c, UCHAR_ID_CONTINUE) || c == '$' || c == '_' || + c == 0x200c || c == 0x200d; +} + } // namespace liburlpattern
diff --git a/third_party/liburlpattern/utils.h b/third_party/liburlpattern/utils.h index 02826b5..201f7f99 100644 --- a/third_party/liburlpattern/utils.h +++ b/third_party/liburlpattern/utils.h
@@ -9,6 +9,7 @@ #include <string> #include "base/component_export.h" #include "third_party/abseil-cpp/absl/strings/string_view.h" +#include "third_party/icu/source/common/unicode/uchar.h" namespace liburlpattern { @@ -36,6 +37,12 @@ void EscapePatternStringAndAppend(absl::string_view input, std::string& append_target); +// Return `true` if the given codepoint `c` is valid for a `:foo` name. The +// `first_codepoint` argument can be set if this codepoint is intended to be +// the first codepoint in a name. If its false, then the codepoint is treated +// as a trailing character. +bool IsNameCodepoint(UChar32 c, bool first_codepoint); + } // namespace liburlpattern #endif // THIRD_PARTY_LIBURLPATTERN_UTILS_H_
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py index 4cf12c6..ca6dee2 100755 --- a/tools/clang/scripts/build.py +++ b/tools/clang/scripts/build.py
@@ -280,29 +280,23 @@ def BuildLibXml2(): """Download and build libxml2""" - # libxml2-2.9.11 is the first version with cmake build files. However, - # https://gitlab.gnome.org/GNOME/libxml2/-/merge_requests/109 wasn't merged - # when 2.9.11 was released, so xmlwin32version.h.in is missing from the - # release tar gz. So we uploaded a slightly tweaked libxml2 like so: - # $ curl -O ftp://xmlsoft.org/libxml2/libxml2-2.9.11.tar.gz - # $ tar xzf libxml2-2.9.11.tar.gz - # $ WIN=include/libxml/xmlwin32version.h.in - # $ curl -o libxml2-2.9.11/$WIN \ - # https://gitlab.gnome.org/GNOME/libxml2/-/raw/v2.9.11/$WIN - # $ rm libxml2-2.9.11.tar.gz - # $ tar cf libxml2-2.9.11.tar libxml2-2.9.11 - # $ gzip -9 libxml2-2.9.11.tar - # $ gsutil cp -n -a public-read libxml2-2.9.11.tar.gz \ - # gs://chromium-browser-clang/tools + # The .tar.gz on GCS was uploaded as follows. + # The gitlab page has more up-to-date packages than http://xmlsoft.org/, + # and the official releases on xmlsoft.org are only available over ftp too. + # $ VER=v2.9.12 + # $ curl -O \ + # https://gitlab.gnome.org/GNOME/libxml2/-/archive/$VER/libxml2-$VER.tar.gz + # $ gsutil cp -n -a public-read libxml2-$VER.tar.gz \ + # gs://chromium-browser-clang/tools # TODO(thakis): Use this locally built statically linked libxml2 on all # platforms. fewer dynamic deps, and guaranteed(ish) to have same behavior # across platforms. - libxml2_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, 'libxml2-2.9.11') + libxml2_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, 'libxml2-v2.9.12') if os.path.exists(libxml2_dir): RmTree(libxml2_dir) - zip_name = 'libxml2-2.9.11.tar.gz' + zip_name = 'libxml2-v2.9.12.tar.gz' DownloadAndUnpack(CDS_URL + '/tools/' + zip_name, LLVM_BUILD_TOOLS_DIR) os.chdir(libxml2_dir) os.mkdir('build')
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index e5cc1d0..1ed7226 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -35,7 +35,7 @@ # Reverting problematic clang rolls is safe, though. # This is the output of `git describe` and is usable as a commit-ish. CLANG_REVISION = 'llvmorg-14-init-11564-g37fbf238' -CLANG_SUB_REVISION = 2 +CLANG_SUB_REVISION = 3 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION) RELEASE_VERSION = '14.0.0'
diff --git a/tools/mac/power/scenarios.py b/tools/mac/power/scenarios.py index 82885f8..0b9f95f3 100644 --- a/tools/mac/power/scenarios.py +++ b/tools/mac/power/scenarios.py
@@ -180,7 +180,7 @@ "https://google.com", "https://www.google.com/search?q=computers", "https://www.youtube.com", "https://www.youtube.com/results?search_query=computers", - "https://bit.ly/chrome-clocks-and-sleep" + "https://docs.google.com/document/d/1Ll-8Nvo6JlhzKEttst8GHWCc7_A8Hluy2fX99cy4Sfg/edit?usp=sharing" ] def __init__(self, @@ -246,7 +246,7 @@ return NavigationScenario( browser_driver, navigation_duration=datetime.timedelta(seconds=15), - navigation_cycles=140) + navigation_cycles=70) if "zero_window" == scenario_name: return ZeroWindowScenario(browser_driver, datetime.timedelta(minutes=60)) return None
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index ba5499d..e023d34 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -36065,6 +36065,8 @@ <int value="22" label="Failed - data in store is expired"/> <int value="23" label="Failed - data in store is for another user"/> <int value="24" label="Failed - cannot load stream with pending clear all"/> + <int value="25" label="Failed - already has unread content available"/> + <int value="26" label="Failed - user does not follow any web feeds"/> </enum> <enum name="FeedNoticeAcknowledgementPath"> @@ -36205,6 +36207,8 @@ tapped on the preview."/> <int value="40" label="User tapped Settings link to open feed autoplay settings."/> + <int value="41" + label="User tapped "Add to Reading List" in the context menu."/> </enum> <enum name="FeedUserCommandType"> @@ -42914,6 +42918,15 @@ <int value="-2147012851" label="WININET_E_INVALID_CA"/> <int value="-2147009295" label="ERROR_INSTALL_PACKAGE_NOT_FOUND"/> <int value="-2146959355" label="CO_E_SERVER_EXEC_FAILURE"/> + <int value="-2140143615" label="MF_INDEX_SIZE_ERR"/> + <int value="-2140143608" label="MF_NOT_FOUND_ERR"/> + <int value="-2140143607" label="MF_NOT_SUPPORTED_ERR"/> + <int value="-2140143605" label="MF_INVALID_STATE_ERR"/> + <int value="-2140143604" label="MF_SYNTAX_ERR"/> + <int value="-2140143601" label="MF_INVALID_ACCESS_ERR"/> + <int value="-2140143594" label="MF_QUOTA_EXCEEDED_ERR"/> + <int value="-2140143535" label="MF_PARSE_ERR"/> + <int value="-2140127227" label="MF_TYPE_ERR"/> <int value="-2005270527" label="DXGI_ERROR_INVALID_CALL"/> <int value="-2005270526" label="DXGI_ERROR_NOT_FOUND"/> <int value="-2005270525" label="DXGI_ERROR_MORE_DATA"/> @@ -42977,13 +42990,382 @@ <int value="-2003283956" label="DWRITE_E_NOCOLOR"/> <int value="-1606219753" label="GOOPDATE_E_NON_BLOCKING_CALL_PENDING"/> <int value="-1606219747" label="GOOPDATE_E_APP_USING_EXTERNAL_UPDATER"/> + <int value="-1072875856" label="MF_E_PLATFORM_NOT_INITIALIZED"/> + <int value="-1072875855" label="MF_E_BUFFERTOOSMALL"/> + <int value="-1072875854" label="MF_E_INVALIDREQUEST"/> + <int value="-1072875853" label="MF_E_INVALIDSTREAMNUMBER"/> + <int value="-1072875852" label="MF_E_INVALIDMEDIATYPE"/> + <int value="-1072875851" label="MF_E_NOTACCEPTING"/> + <int value="-1072875850" label="MF_E_NOT_INITIALIZED"/> + <int value="-1072875849" label="MF_E_UNSUPPORTED_REPRESENTATION"/> + <int value="-1072875847" label="MF_E_NO_MORE_TYPES"/> + <int value="-1072875846" label="MF_E_UNSUPPORTED_SERVICE"/> + <int value="-1072875845" label="MF_E_UNEXPECTED"/> + <int value="-1072875844" label="MF_E_INVALIDNAME"/> + <int value="-1072875843" label="MF_E_INVALIDTYPE"/> + <int value="-1072875842" label="MF_E_INVALID_FILE_FORMAT"/> + <int value="-1072875841" label="MF_E_INVALIDINDEX"/> + <int value="-1072875840" label="MF_E_INVALID_TIMESTAMP"/> + <int value="-1072875837" label="MF_E_UNSUPPORTED_SCHEME"/> + <int value="-1072875836" label="MF_E_UNSUPPORTED_BYTESTREAM_TYPE"/> + <int value="-1072875835" label="MF_E_UNSUPPORTED_TIME_FORMAT"/> + <int value="-1072875832" label="MF_E_NO_SAMPLE_TIMESTAMP"/> + <int value="-1072875831" label="MF_E_NO_SAMPLE_DURATION"/> + <int value="-1072875829" label="MF_E_INVALID_STREAM_DATA"/> + <int value="-1072875825" label="MF_E_RT_UNAVAILABLE"/> + <int value="-1072875824" label="MF_E_UNSUPPORTED_RATE"/> + <int value="-1072875823" label="MF_E_THINNING_UNSUPPORTED"/> + <int value="-1072875822" label="MF_E_REVERSE_UNSUPPORTED"/> + <int value="-1072875821" label="MF_E_UNSUPPORTED_RATE_TRANSITION"/> + <int value="-1072875820" label="MF_E_RATE_CHANGE_PREEMPTED"/> + <int value="-1072875819" label="MF_E_NOT_FOUND"/> + <int value="-1072875818" label="MF_E_NOT_AVAILABLE"/> + <int value="-1072875817" label="MF_E_NO_CLOCK"/> + <int value="-1072875815" label="MF_E_MULTIPLE_BEGIN"/> + <int value="-1072875814" label="MF_E_MULTIPLE_SUBSCRIBERS"/> + <int value="-1072875813" label="MF_E_TIMER_ORPHANED"/> + <int value="-1072875812" label="MF_E_STATE_TRANSITION_PENDING"/> + <int value="-1072875811" label="MF_E_UNSUPPORTED_STATE_TRANSITION"/> + <int value="-1072875810" label="MF_E_UNRECOVERABLE_ERROR_OCCURRED"/> + <int value="-1072875809" label="MF_E_SAMPLE_HAS_TOO_MANY_BUFFERS"/> + <int value="-1072875808" label="MF_E_SAMPLE_NOT_WRITABLE"/> + <int value="-1072875806" label="MF_E_INVALID_KEY"/> + <int value="-1072875805" label="MF_E_BAD_STARTUP_VERSION"/> + <int value="-1072875804" label="MF_E_UNSUPPORTED_CAPTION"/> + <int value="-1072875803" label="MF_E_INVALID_POSITION"/> + <int value="-1072875802" label="MF_E_ATTRIBUTENOTFOUND"/> + <int value="-1072875801" label="MF_E_PROPERTY_TYPE_NOT_ALLOWED"/> + <int value="-1072875800" label="MF_E_PROPERTY_TYPE_NOT_SUPPORTED"/> + <int value="-1072875799" label="MF_E_PROPERTY_EMPTY"/> + <int value="-1072875798" label="MF_E_PROPERTY_NOT_EMPTY"/> + <int value="-1072875797" label="MF_E_PROPERTY_VECTOR_NOT_ALLOWED"/> + <int value="-1072875796" label="MF_E_PROPERTY_VECTOR_REQUIRED"/> + <int value="-1072875795" label="MF_E_OPERATION_CANCELLED"/> + <int value="-1072875794" label="MF_E_BYTESTREAM_NOT_SEEKABLE"/> + <int value="-1072875793" label="MF_E_DISABLED_IN_SAFEMODE"/> + <int value="-1072875792" label="MF_E_CANNOT_PARSE_BYTESTREAM"/> + <int value="-1072875791" + label="MF_E_SOURCERESOLVER_MUTUALLY_EXCLUSIVE_FLAGS"/> + <int value="-1072875790" label="MF_E_MEDIAPROC_WRONGSTATE"/> + <int value="-1072875789" label="MF_E_RT_THROUGHPUT_NOT_AVAILABLE"/> + <int value="-1072875788" label="MF_E_RT_TOO_MANY_CLASSES"/> + <int value="-1072875787" label="MF_E_RT_WOULDBLOCK"/> + <int value="-1072875786" label="MF_E_NO_BITPUMP"/> + <int value="-1072875785" label="MF_E_RT_OUTOFMEMORY"/> + <int value="-1072875784" label="MF_E_RT_WORKQUEUE_CLASS_NOT_SPECIFIED"/> + <int value="-1072875782" label="MF_E_CANNOT_CREATE_SINK"/> + <int value="-1072875781" label="MF_E_BYTESTREAM_UNKNOWN_LENGTH"/> + <int value="-1072875780" label="MF_E_SESSION_PAUSEWHILESTOPPED"/> + <int value="-1072875778" label="MF_E_FORMAT_CHANGE_NOT_SUPPORTED"/> + <int value="-1072875777" label="MF_E_INVALID_WORKQUEUE"/> + <int value="-1072875776" label="MF_E_DRM_UNSUPPORTED"/> + <int value="-1072875775" label="MF_E_UNAUTHORIZED"/> + <int value="-1072875774" label="MF_E_OUT_OF_RANGE"/> + <int value="-1072875773" label="MF_E_INVALID_CODEC_MERIT"/> + <int value="-1072875772" label="MF_E_HW_MFT_FAILED_START_STREAMING"/> + <int value="-1072875771" label="MF_E_OPERATION_IN_PROGRESS"/> + <int value="-1072875770" label="MF_E_HARDWARE_DRM_UNSUPPORTED"/> + <int value="-1072875769" label="MF_E_DURATION_TOO_LONG"/> + <int value="-1072875768" + label="MF_E_OPERATION_UNSUPPORTED_AT_D3D_FEATURE_LEVEL"/> + <int value="-1072875767" + label="MF_E_UNSUPPORTED_MEDIATYPE_AT_D3D_FEATURE_LEVEL"/> + <int value="-1072874856" label="MF_E_ASF_PARSINGINCOMPLETE"/> + <int value="-1072874855" label="MF_E_ASF_MISSINGDATA"/> + <int value="-1072874854" label="MF_E_ASF_INVALIDDATA"/> + <int value="-1072874853" label="MF_E_ASF_OPAQUEPACKET"/> + <int value="-1072874852" label="MF_E_ASF_NOINDEX"/> + <int value="-1072874851" label="MF_E_ASF_OUTOFRANGE"/> + <int value="-1072874850" label="MF_E_ASF_INDEXNOTLOADED"/> + <int value="-1072874849" label="MF_E_ASF_TOO_MANY_PAYLOADS"/> + <int value="-1072874848" label="MF_E_ASF_UNSUPPORTED_STREAM_TYPE"/> + <int value="-1072874847" label="MF_E_ASF_DROPPED_PACKET"/> + <int value="-1072873856" label="MF_E_NO_EVENTS_AVAILABLE"/> + <int value="-1072873854" label="MF_E_INVALID_STATE_TRANSITION"/> + <int value="-1072873852" label="MF_E_END_OF_STREAM"/> + <int value="-1072873851" label="MF_E_SHUTDOWN"/> + <int value="-1072873850" label="MF_E_MP3_NOTFOUND"/> + <int value="-1072873849" label="MF_E_MP3_OUTOFDATA"/> + <int value="-1072873848" label="MF_E_MP3_NOTMP3"/> + <int value="-1072873847" label="MF_E_MP3_NOTSUPPORTED"/> + <int value="-1072873846" label="MF_E_NO_DURATION"/> + <int value="-1072873844" label="MF_E_INVALID_FORMAT"/> + <int value="-1072873843" label="MF_E_PROPERTY_NOT_FOUND"/> + <int value="-1072873842" label="MF_E_PROPERTY_READ_ONLY"/> + <int value="-1072873841" label="MF_E_PROPERTY_NOT_ALLOWED"/> + <int value="-1072873839" label="MF_E_MEDIA_SOURCE_NOT_STARTED"/> + <int value="-1072873832" label="MF_E_UNSUPPORTED_FORMAT"/> + <int value="-1072873831" label="MF_E_MP3_BAD_CRC"/> + <int value="-1072873830" label="MF_E_NOT_PROTECTED"/> + <int value="-1072873829" label="MF_E_MEDIA_SOURCE_WRONGSTATE"/> + <int value="-1072873828" label="MF_E_MEDIA_SOURCE_NO_STREAMS_SELECTED"/> + <int value="-1072873827" label="MF_E_CANNOT_FIND_KEYFRAME_SAMPLE"/> + <int value="-1072873826" label="MF_E_UNSUPPORTED_CHARACTERISTICS"/> + <int value="-1072873825" label="MF_E_NO_AUDIO_RECORDING_DEVICE"/> + <int value="-1072873824" label="MF_E_AUDIO_RECORDING_DEVICE_IN_USE"/> + <int value="-1072873823" label="MF_E_AUDIO_RECORDING_DEVICE_INVALIDATED"/> + <int value="-1072873822" label="MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED"/> + <int value="-1072873821" label="MF_E_VIDEO_RECORDING_DEVICE_PREEMPTED"/> + <int value="-1072872856" label="MF_E_NETWORK_RESOURCE_FAILURE"/> + <int value="-1072872855" label="MF_E_NET_WRITE"/> + <int value="-1072872854" label="MF_E_NET_READ"/> + <int value="-1072872853" label="MF_E_NET_REQUIRE_NETWORK"/> + <int value="-1072872852" label="MF_E_NET_REQUIRE_ASYNC"/> + <int value="-1072872851" label="MF_E_NET_BWLEVEL_NOT_SUPPORTED"/> + <int value="-1072872850" label="MF_E_NET_STREAMGROUPS_NOT_SUPPORTED"/> + <int value="-1072872849" label="MF_E_NET_MANUALSS_NOT_SUPPORTED"/> + <int value="-1072872848" label="MF_E_NET_INVALID_PRESENTATION_DESCRIPTOR"/> + <int value="-1072872847" label="MF_E_NET_CACHESTREAM_NOT_FOUND"/> + <int value="-1072872844" label="MF_E_NET_REQUIRE_INPUT"/> + <int value="-1072872843" label="MF_E_NET_REDIRECT"/> + <int value="-1072872842" label="MF_E_NET_REDIRECT_TO_PROXY"/> + <int value="-1072872841" label="MF_E_NET_TOO_MANY_REDIRECTS"/> + <int value="-1072872840" label="MF_E_NET_TIMEOUT"/> + <int value="-1072872839" label="MF_E_NET_CLIENT_CLOSE"/> + <int value="-1072872838" label="MF_E_NET_BAD_CONTROL_DATA"/> + <int value="-1072872837" label="MF_E_NET_INCOMPATIBLE_SERVER"/> + <int value="-1072872836" label="MF_E_NET_UNSAFE_URL"/> + <int value="-1072872835" label="MF_E_NET_CACHE_NO_DATA"/> + <int value="-1072872834" label="MF_E_NET_EOL"/> + <int value="-1072872833" label="MF_E_NET_BAD_REQUEST"/> + <int value="-1072872832" label="MF_E_NET_INTERNAL_SERVER_ERROR"/> + <int value="-1072872831" label="MF_E_NET_SESSION_NOT_FOUND"/> + <int value="-1072872830" label="MF_E_NET_NOCONNECTION"/> + <int value="-1072872829" label="MF_E_NET_CONNECTION_FAILURE"/> + <int value="-1072872828" label="MF_E_NET_INCOMPATIBLE_PUSHSERVER"/> + <int value="-1072872827" label="MF_E_NET_SERVER_ACCESSDENIED"/> + <int value="-1072872826" label="MF_E_NET_PROXY_ACCESSDENIED"/> + <int value="-1072872825" label="MF_E_NET_CANNOTCONNECT"/> + <int value="-1072872824" label="MF_E_NET_INVALID_PUSH_TEMPLATE"/> + <int value="-1072872823" label="MF_E_NET_INVALID_PUSH_PUBLISHING_POINT"/> + <int value="-1072872822" label="MF_E_NET_BUSY"/> + <int value="-1072872821" label="MF_E_NET_RESOURCE_GONE"/> + <int value="-1072872820" label="MF_E_NET_ERROR_FROM_PROXY"/> + <int value="-1072872819" label="MF_E_NET_PROXY_TIMEOUT"/> + <int value="-1072872818" label="MF_E_NET_SERVER_UNAVAILABLE"/> + <int value="-1072872817" label="MF_E_NET_TOO_MUCH_DATA"/> + <int value="-1072872816" label="MF_E_NET_SESSION_INVALID"/> + <int value="-1072872815" label="MF_E_OFFLINE_MODE"/> + <int value="-1072872814" label="MF_E_NET_UDP_BLOCKED"/> + <int value="-1072872813" label="MF_E_NET_UNSUPPORTED_CONFIGURATION"/> + <int value="-1072872812" label="MF_E_NET_PROTOCOL_DISABLED"/> + <int value="-1072872811" label="MF_E_NET_COMPANION_DRIVER_DISCONNECT"/> + <int value="-1072871856" label="MF_E_ALREADY_INITIALIZED"/> + <int value="-1072871855" label="MF_E_BANDWIDTH_OVERRUN"/> + <int value="-1072871854" label="MF_E_LATE_SAMPLE"/> + <int value="-1072871853" label="MF_E_FLUSH_NEEDED"/> + <int value="-1072871852" label="MF_E_INVALID_PROFILE"/> + <int value="-1072871851" label="MF_E_INDEX_NOT_COMMITTED"/> + <int value="-1072871850" label="MF_E_NO_INDEX"/> + <int value="-1072871849" label="MF_E_CANNOT_INDEX_IN_PLACE"/> + <int value="-1072871848" label="MF_E_MISSING_ASF_LEAKYBUCKET"/> + <int value="-1072871847" label="MF_E_INVALID_ASF_STREAMID"/> + <int value="-1072870856" label="MF_E_STREAMSINK_REMOVED"/> + <int value="-1072870854" label="MF_E_STREAMSINKS_OUT_OF_SYNC"/> + <int value="-1072870853" label="MF_E_STREAMSINKS_FIXED"/> + <int value="-1072870852" label="MF_E_STREAMSINK_EXISTS"/> + <int value="-1072870851" label="MF_E_SAMPLEALLOCATOR_CANCELED"/> + <int value="-1072870850" label="MF_E_SAMPLEALLOCATOR_EMPTY"/> + <int value="-1072870849" label="MF_E_SINK_ALREADYSTOPPED"/> + <int value="-1072870848" label="MF_E_ASF_FILESINK_BITRATE_UNKNOWN"/> + <int value="-1072870847" label="MF_E_SINK_NO_STREAMS"/> + <int value="-1072870845" label="MF_E_METADATA_TOO_LONG"/> + <int value="-1072870844" label="MF_E_SINK_NO_SAMPLES_PROCESSED"/> + <int value="-1072870843" label="MF_E_SINK_HEADERS_NOT_FOUND"/> + <int value="-1072869856" label="MF_E_VIDEO_REN_NO_PROCAMP_HW"/> + <int value="-1072869855" label="MF_E_VIDEO_REN_NO_DEINTERLACE_HW"/> + <int value="-1072869854" label="MF_E_VIDEO_REN_COPYPROT_FAILED"/> + <int value="-1072869853" label="MF_E_VIDEO_REN_SURFACE_NOT_SHARED"/> + <int value="-1072869852" label="MF_E_VIDEO_DEVICE_LOCKED"/> + <int value="-1072869851" label="MF_E_NEW_VIDEO_DEVICE"/> + <int value="-1072869850" label="MF_E_NO_VIDEO_SAMPLE_AVAILABLE"/> + <int value="-1072869756" label="MF_E_NO_AUDIO_PLAYBACK_DEVICE"/> + <int value="-1072869755" label="MF_E_AUDIO_PLAYBACK_DEVICE_IN_USE"/> + <int value="-1072869754" label="MF_E_AUDIO_PLAYBACK_DEVICE_INVALIDATED"/> + <int value="-1072869753" label="MF_E_AUDIO_SERVICE_NOT_RUNNING"/> + <int value="-1072869752" label="MF_E_AUDIO_BUFFER_SIZE_ERROR"/> + <int value="-1072869751" label="MF_E_AUDIO_CLIENT_WRAPPER_SPOOF_ERROR"/> + <int value="-1072868850" label="MF_E_TOPO_INVALID_OPTIONAL_NODE"/> + <int value="-1072868847" label="MF_E_TOPO_CANNOT_FIND_DECRYPTOR"/> + <int value="-1072868846" label="MF_E_TOPO_CODEC_NOT_FOUND"/> + <int value="-1072868845" label="MF_E_TOPO_CANNOT_CONNECT"/> + <int value="-1072868844" label="MF_E_TOPO_UNSUPPORTED"/> + <int value="-1072868843" label="MF_E_TOPO_INVALID_TIME_ATTRIBUTES"/> + <int value="-1072868842" label="MF_E_TOPO_LOOPS_IN_TOPOLOGY"/> + <int value="-1072868841" label="MF_E_TOPO_MISSING_PRESENTATION_DESCRIPTOR"/> + <int value="-1072868840" label="MF_E_TOPO_MISSING_STREAM_DESCRIPTOR"/> + <int value="-1072868839" label="MF_E_TOPO_STREAM_DESCRIPTOR_NOT_SELECTED"/> + <int value="-1072868838" label="MF_E_TOPO_MISSING_SOURCE"/> + <int value="-1072868837" label="MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED"/> + <int value="-1072864852" label="MF_E_SEQUENCER_UNKNOWN_SEGMENT_ID"/> + <int value="-1072864850" label="MF_E_NO_SOURCE_IN_CACHE"/> + <int value="-1072861856" label="MF_E_TRANSFORM_TYPE_NOT_SET"/> + <int value="-1072861855" label="MF_E_TRANSFORM_STREAM_CHANGE"/> + <int value="-1072861854" label="MF_E_TRANSFORM_INPUT_REMAINING"/> + <int value="-1072861853" label="MF_E_TRANSFORM_PROFILE_MISSING"/> + <int value="-1072861852" label="MF_E_TRANSFORM_PROFILE_INVALID_OR_CORRUPT"/> + <int value="-1072861851" label="MF_E_TRANSFORM_PROFILE_TRUNCATED"/> + <int value="-1072861850" label="MF_E_TRANSFORM_PROPERTY_PID_NOT_RECOGNIZED"/> + <int value="-1072861849" label="MF_E_TRANSFORM_PROPERTY_VARIANT_TYPE_WRONG"/> + <int value="-1072861848" label="MF_E_TRANSFORM_PROPERTY_NOT_WRITEABLE"/> + <int value="-1072861847" + label="MF_E_TRANSFORM_PROPERTY_ARRAY_VALUE_WRONG_NUM_DIM"/> + <int value="-1072861846" label="MF_E_TRANSFORM_PROPERTY_VALUE_SIZE_WRONG"/> + <int value="-1072861845" label="MF_E_TRANSFORM_PROPERTY_VALUE_OUT_OF_RANGE"/> + <int value="-1072861844" label="MF_E_TRANSFORM_PROPERTY_VALUE_INCOMPATIBLE"/> + <int value="-1072861843" + label="MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_OUTPUT_MEDIATYPE"/> + <int value="-1072861842" + label="MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_INPUT_MEDIATYPE"/> + <int value="-1072861841" + label="MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION"/> + <int value="-1072861840" + label="MF_E_TRANSFORM_CONFLICTS_WITH_OTHER_CURRENTLY_ENABLED_FEATURES"/> + <int value="-1072861838" label="MF_E_TRANSFORM_NEED_MORE_INPUT"/> + <int value="-1072861837" + label="MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_SPKR_CONFIG"/> + <int value="-1072861836" + label="MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING"/> + <int value="-1072861834" label="MF_E_UNSUPPORTED_D3D_TYPE"/> + <int value="-1072861833" label="MF_E_TRANSFORM_ASYNC_LOCKED"/> + <int value="-1072861832" label="MF_E_TRANSFORM_CANNOT_INITIALIZE_ACM_DRIVER"/> + <int value="-1072861831" label="MF_E_TRANSFORM_STREAM_INVALID_RESOLUTION"/> + <int value="-1072861830" label="MF_E_TRANSFORM_ASYNC_MFT_NOT_SUPPORTED"/> + <int value="-1072861828" label="MF_E_TRANSFORM_EXATTRIBUTE_NOT_SUPPORTED"/> + <int value="-1072860856" label="MF_E_LICENSE_INCORRECT_RIGHTS"/> <int value="-1072860855" label="MF_E_LICENSE_OUTOFDATE"/> + <int value="-1072860854" label="MF_E_LICENSE_REQUIRED"/> + <int value="-1072860853" label="MF_E_DRM_HARDWARE_INCONSISTENT"/> + <int value="-1072860852" label="MF_E_NO_CONTENT_PROTECTION_MANAGER"/> + <int value="-1072860851" label="MF_E_LICENSE_RESTORE_NO_RIGHTS"/> + <int value="-1072860850" label="MF_E_BACKUP_RESTRICTED_LICENSE"/> + <int value="-1072860849" + label="MF_E_LICENSE_RESTORE_NEEDS_INDIVIDUALIZATION"/> + <int value="-1072860847" label="MF_E_COMPONENT_REVOKED"/> + <int value="-1072860846" label="MF_E_TRUST_DISABLED"/> + <int value="-1072860845" label="MF_E_WMDRMOTA_NO_ACTION"/> + <int value="-1072860844" label="MF_E_WMDRMOTA_ACTION_ALREADY_SET"/> + <int value="-1072860843" label="MF_E_WMDRMOTA_DRM_HEADER_NOT_AVAILABLE"/> + <int value="-1072860842" + label="MF_E_WMDRMOTA_DRM_ENCRYPTION_SCHEME_NOT_SUPPORTED"/> + <int value="-1072860841" label="MF_E_WMDRMOTA_ACTION_MISMATCH"/> + <int value="-1072860840" label="MF_E_WMDRMOTA_INVALID_POLICY"/> + <int value="-1072860839" label="MF_E_POLICY_UNSUPPORTED"/> + <int value="-1072860838" label="MF_E_OPL_NOT_SUPPORTED"/> + <int value="-1072860837" label="MF_E_TOPOLOGY_VERIFICATION_FAILED"/> + <int value="-1072860836" label="MF_E_SIGNATURE_VERIFICATION_FAILED"/> + <int value="-1072860835" label="MF_E_DEBUGGING_NOT_ALLOWED"/> + <int value="-1072860834" label="MF_E_CODE_EXPIRED"/> + <int value="-1072860833" label="MF_E_GRL_VERSION_TOO_LOW"/> + <int value="-1072860832" label="MF_E_GRL_RENEWAL_NOT_FOUND"/> + <int value="-1072860831" label="MF_E_GRL_EXTENSIBLE_ENTRY_NOT_FOUND"/> + <int value="-1072860830" label="MF_E_KERNEL_UNTRUSTED"/> + <int value="-1072860829" label="MF_E_PEAUTH_UNTRUSTED"/> + <int value="-1072860827" label="MF_E_NON_PE_PROCESS"/> + <int value="-1072860825" label="MF_E_REBOOT_REQUIRED"/> + <int value="-1072860822" label="MF_E_GRL_INVALID_FORMAT"/> + <int value="-1072860821" label="MF_E_GRL_UNRECOGNIZED_FORMAT"/> + <int value="-1072860820" label="MF_E_ALL_PROCESS_RESTART_REQUIRED"/> + <int value="-1072860819" label="MF_E_PROCESS_RESTART_REQUIRED"/> + <int value="-1072860818" label="MF_E_USERMODE_UNTRUSTED"/> + <int value="-1072860817" label="MF_E_PEAUTH_SESSION_NOT_STARTED"/> + <int value="-1072860816" label="MF_E_INSUFFICIENT_BUFFER"/> + <int value="-1072860815" label="MF_E_PEAUTH_PUBLICKEY_REVOKED"/> + <int value="-1072860814" label="MF_E_GRL_ABSENT"/> + <int value="-1072860812" label="MF_E_PE_UNTRUSTED"/> + <int value="-1072860811" label="MF_E_PEAUTH_NOT_STARTED"/> + <int value="-1072860810" label="MF_E_INCOMPATIBLE_SAMPLE_PROTECTION"/> + <int value="-1072860809" label="MF_E_PE_SESSIONS_MAXED"/> + <int value="-1072860808" + label="MF_E_HIGH_SECURITY_LEVEL_CONTENT_NOT_ALLOWED"/> + <int value="-1072860807" label="MF_E_TEST_SIGNED_COMPONENTS_NOT_ALLOWED"/> + <int value="-1072860806" label="MF_E_ITA_UNSUPPORTED_ACTION"/> + <int value="-1072860805" label="MF_E_ITA_ERROR_PARSING_SAP_PARAMETERS"/> + <int value="-1072860804" label="MF_E_POLICY_MGR_ACTION_OUTOFBOUNDS"/> + <int value="-1072860803" label="MF_E_BAD_OPL_STRUCTURE_FORMAT"/> + <int value="-1072860802" + label="MF_E_ITA_UNRECOGNIZED_ANALOG_VIDEO_PROTECTION_GUID"/> + <int value="-1072860801" label="MF_E_NO_PMP_HOST"/> + <int value="-1072860800" label="MF_E_ITA_OPL_DATA_NOT_INITIALIZED"/> + <int value="-1072860799" label="MF_E_ITA_UNRECOGNIZED_ANALOG_VIDEO_OUTPUT"/> + <int value="-1072860798" label="MF_E_ITA_UNRECOGNIZED_DIGITAL_VIDEO_OUTPUT"/> + <int value="-1072860797" + label="MF_E_RESOLUTION_REQUIRES_PMP_CREATION_CALLBACK"/> + <int value="-1072860796" label="MF_E_INVALID_AKE_CHANNEL_PARAMETERS"/> + <int value="-1072860795" label="MF_E_CONTENT_PROTECTION_SYSTEM_NOT_ENABLED"/> + <int value="-1072860794" label="MF_E_UNSUPPORTED_CONTENT_PROTECTION_SYSTEM"/> + <int value="-1072860793" label="MF_E_DRM_MIGRATION_NOT_SUPPORTED"/> + <int value="-1072860792" label="MF_E_HDCP_AUTHENTICATION_FAILURE"/> + <int value="-1072860791" label="MF_E_HDCP_LINK_FAILURE"/> + <int value="-1072849856" label="MF_E_CLOCK_INVALID_CONTINUITY_KEY"/> + <int value="-1072849855" label="MF_E_CLOCK_NO_TIME_SOURCE"/> + <int value="-1072849854" label="MF_E_CLOCK_STATE_ALREADY_SET"/> + <int value="-1072849853" label="MF_E_CLOCK_NOT_SIMPLE"/> + <int value="-1072848856" label="MF_E_NO_MORE_DROP_MODES"/> + <int value="-1072848855" label="MF_E_NO_MORE_QUALITY_LEVELS"/> + <int value="-1072848854" label="MF_E_DROPTIME_NOT_SUPPORTED"/> + <int value="-1072848853" label="MF_E_QUALITYKNOB_WAIT_LONGER"/> + <int value="-1072848852" label="MF_E_QM_INVALIDSTATE"/> + <int value="-1072847856" label="MF_E_TRANSCODE_NO_CONTAINERTYPE"/> + <int value="-1072847855" label="MF_E_TRANSCODE_PROFILE_NO_MATCHING_STREAMS"/> + <int value="-1072847854" label="MF_E_TRANSCODE_NO_MATCHING_ENCODER"/> + <int value="-1072847853" label="MF_E_TRANSCODE_INVALID_PROFILE"/> + <int value="-1072846856" label="MF_E_ALLOCATOR_NOT_INITIALIZED"/> + <int value="-1072846855" label="MF_E_ALLOCATOR_NOT_COMMITED"/> + <int value="-1072846854" label="MF_E_ALLOCATOR_ALREADY_COMMITED"/> + <int value="-1072846853" label="MF_E_STREAM_ERROR"/> + <int value="-1072846852" label="MF_E_INVALID_STREAM_STATE"/> + <int value="-1072846851" label="MF_E_HW_STREAM_NOT_CONNECTED"/> + <int value="-1072845856" label="MF_E_NO_CAPTURE_DEVICES_AVAILABLE"/> + <int value="-1072845855" label="MF_E_CAPTURE_SINK_OUTPUT_NOT_SET"/> + <int value="-1072845854" label="MF_E_CAPTURE_SINK_MIRROR_ERROR"/> + <int value="-1072845853" label="MF_E_CAPTURE_SINK_ROTATE_ERROR"/> + <int value="-1072845852" label="MF_E_CAPTURE_ENGINE_INVALID_OP"/> + <int value="-1072845851" label="MF_E_CAPTURE_ENGINE_ALL_EFFECTS_REMOVED"/> + <int value="-1072845850" + label="MF_E_CAPTURE_SOURCE_NO_INDEPENDENT_PHOTO_STREAM_PRESENT"/> + <int value="-1072845849" label="MF_E_CAPTURE_SOURCE_NO_VIDEO_STREAM_PRESENT"/> + <int value="-1072845848" label="MF_E_CAPTURE_SOURCE_NO_AUDIO_STREAM_PRESENT"/> + <int value="-1072845847" + label="MF_E_CAPTURE_SOURCE_DEVICE_EXTENDEDPROP_OP_IN_PROGRESS"/> + <int value="-1072845846" label="MF_E_CAPTURE_PROPERTY_SET_DURING_PHOTO"/> + <int value="-1072845845" label="MF_E_CAPTURE_NO_SAMPLES_IN_QUEUE"/> + <int value="-1072845844" label="MF_E_HW_ACCELERATED_THUMBNAIL_NOT_SUPPORTED"/> + <int value="-1072845843" label="MF_E_UNSUPPORTED_CAPTURE_DEVICE_PRESENT"/> + <int value="-1072844856" + label="MF_E_TIMELINECONTROLLER_UNSUPPORTED_SOURCE_TYPE"/> + <int value="-1072844855" label="MF_E_TIMELINECONTROLLER_NOT_ALLOWED"/> + <int value="-1072844854" label="MF_E_TIMELINECONTROLLER_CANNOT_ATTACH"/> + <int value="-1072843856" + label="MF_E_MEDIA_EXTENSION_APPSERVICE_CONNECTION_FAILED"/> + <int value="-1072843855" + label="MF_E_MEDIA_EXTENSION_APPSERVICE_REQUEST_FAILED"/> + <int value="-1072843854" + label="MF_E_MEDIA_EXTENSION_PACKAGE_INTEGRITY_CHECK_FAILED"/> + <int value="-1072843853" + label="MF_E_MEDIA_EXTENSION_PACKAGE_LICENSE_INVALID"/> <int value="-805306212" label="STATUS_DEVICE_DATA_ERROR"/> <int value="-805305979" label="STATUS_IO_DEVICE_ERROR"/> <int value="0" label="S_OK"/> + <int value="866008" label="MF_S_MULTIPLE_BEGIN"/> + <int value="866045" label="MF_S_ACTIVATE_REPLACED"/> + <int value="870978" label="MF_S_SINK_NOT_FINALIZED"/> + <int value="876973" label="MF_S_SEQUENCER_CONTEXT_CANCELED"/> + <int value="876975" label="MF_S_SEQUENCER_SEGMENT_AT_END_OF_STREAM"/> + <int value="879989" label="MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT"/> + <int value="880976" label="MF_S_PROTECTION_NOT_REQUIRED"/> + <int value="881000" label="MF_S_WAIT_FOR_POLICY_SET"/> + <int value="881001" label="MF_S_VIDEO_DISABLED_WITH_UNKNOWN_SOFTWARE_OUTPUT"/> + <int value="881011" label="MF_S_PE_TRUSTED"/> + <int value="891972" label="MF_S_CLOCK_STOPPED"/> + <int value="891973" label="MF_E_CLOCK_AUDIO_DEVICE_POSITION_UNEXPECTED"/> + <int value="891974" label="MF_E_CLOCK_AUDIO_RENDER_POSITION_UNEXPECTED"/> + <int value="891975" label="MF_E_CLOCK_AUDIO_RENDER_TIME_UNEXPECTED"/> <int value="143196161" label="AUDCLNT_S_BUFFER_EMPTY"/> <int value="143196162" label="AUDCLNT_S_THREAD_ALREADY_REGISTERED"/> <int value="143196163" label="AUDCLNT_S_POSITION_STALLED"/> + <int value="1074608792" label="MF_S_ASF_PARSEINPROGRESS"/> + <int value="1074610802" label="MF_I_MANUAL_PROXY"/> </enum> <enum name="HstsInfo"> @@ -45132,6 +45514,12 @@ <int value="8" label="PWA selected and preferred"/> </enum> +<enum name="IntentPickerIconEvent"> + <int value="0" label="Intent picker icon shown in Omnibox"/> + <int value="1" label="Intent picker icon clicked in Omnibox"/> + <int value="2" label="Intent picker dialog shown automatically"/> +</enum> + <enum name="InterceptionType"> <int value="0" label="Not intercepted"/> <int value="1" label="Other"/> @@ -49628,6 +50016,7 @@ <int value="-1624854957" label="enable-es3-apis"/> <int value="-1624593106" label="NewTabPageBackgrounds:enabled"/> <int value="-1624412478" label="OptimizationGuideModelDownloading:disabled"/> + <int value="-1623394051" label="NtpRealboxTailSuggest:disabled"/> <int value="-1623003151" label="SafeBrowsingkRealTimeUrlLookupEnterpriseGaEndpoint:disabled"/> <int value="-1621963267" label="EnableAssistantLauncherUI:enabled"/> @@ -51677,6 +52066,7 @@ <int value="-114807608" label="TerminalSystemApp:disabled"/> <int value="-114768488" label="ImmersiveFullscreen:enabled"/> <int value="-113855291" label="RelatedSearchesUi:enabled"/> + <int value="-112707644" label="pervasive-system-accent-color"/> <int value="-112459802" label="WebXrRenderPath:enabled"/> <int value="-112335255" label="FormControlsRefresh:enabled"/> <int value="-111160804" label="ChromeShareLongScreenshot:disabled"/> @@ -53815,6 +54205,7 @@ <int value="1473157145" label="EcheSWAResizing:enabled"/> <int value="1473838479" label="EnableVirtualKeyboardMdUi:disabled"/> <int value="1473967338" label="OmniboxShortBookmarkSuggestions:enabled"/> + <int value="1474433736" label="NtpRealboxTailSuggest:enabled"/> <int value="1474861626" label="disable-multi-mirroring"/> <int value="1475210901" label="AvatarToolbarButton:disabled"/> <int value="1478075250" label="QuickAnswersTextAnnotator:disabled"/> @@ -78412,6 +78803,34 @@ <int value="2" label="App"/> </enum> +<enum name="SharingDesktopScreenshotAction"> +<!-- + SharingScreenshotAction must be kept in sync with SharingScreenshotAction defined + in /chrome/browser/ui/webui/image_editor/image_editor.mojom +--> + + <int value="0" label="Crop tool selected"/> + <int value="1" label="Text tool selected"/> + <int value="2" label="Draw tool selected"/> + <int value="3" label="Circle tool selected"/> + <int value="4" label="Rectangle tool selected"/> + <int value="5" label="Line tool selected"/> + <int value="6" label="Arrow tool selected"/> + <int value="7" label="Emoji tool selected"/> + <int value="8" label="Highlight tool selected"/> + <int value="9" label="Zoom in selected"/> + <int value="10" label="Zoom out selected"/> + <int value="11" label="Screenshot Copied"/> + <int value="12" label="Screenshot Saved"/> + <int value="13" label="Screenshot Shared"/> + <int value="14" label="Text tool: color changed"/> + <int value="15" label="Text tool: font changed"/> + <int value="16" label="Text tool: size changed"/> + <int value="17" label="Draw tool: size changed"/> + <int value="18" label="Draw tool: color changed"/> + <int value="19" label="Highlight tool: color changed"/> +</enum> + <enum name="SharingDeviceRegistrationResult"> <int value="0" label="Operation is successful"/> <int value="1" label="Failed with Sync not ready"/>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml index 7242b1ee..cd17875 100644 --- a/tools/metrics/histograms/metadata/chromeos/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -986,6 +986,16 @@ </token> </histogram> +<histogram name="ChromeOS.Intents.IntentPickerIconEvent" + enum="IntentPickerIconEvent" expires_after="2022-06-01"> + <owner>tsergeant@chromium.org</owner> + <owner>chromeos-apps-foundation-team@google.com</owner> + <summary> + Records events associated with the intent picker icon in the omnibox. + Recorded when the icon is shown or interacted with. + </summary> +</histogram> + <histogram name="ChromeOS.IsLacrosBrowser" enum="Boolean" expires_after="never"> <!-- expires-never: Used to identify lacros binary in metrics backend. --> @@ -1379,6 +1389,24 @@ </summary> </histogram> +<histogram name="ChromeOS.SecurityAnomalyUploadSuccess" enum="Boolean" + expires_after="2022-04-03"> + <owner>jorgelo@chromium.org</owner> + <owner>chromeos-security-core@google.com</owner> + <summary> + Records the result (boolean success or failure) of attempting to report a + Chrome OS system as anomalous via the crash reporting service. + + Reporting is only attempted if one or more anomalies are detected (see the + previous histogram's description for the types of anomalies considered), + *and* once per boot, even if reporting fails. + + So this histogram will be recorded at most once per boot, and only if a + system is detected as anomalous (i.e. presents any of the tracked + anomalies.) + </summary> +</histogram> + <histogram name="ChromeOS.Settings.Accessibility.FullscreenMagnifierFocusFollowing" enum="BooleanToggled" expires_after="2022-10-29">
diff --git a/tools/metrics/histograms/metadata/data/histograms.xml b/tools/metrics/histograms/metadata/data/histograms.xml index 9978b71..1dbab2e 100644 --- a/tools/metrics/histograms/metadata/data/histograms.xml +++ b/tools/metrics/histograms/metadata/data/histograms.xml
@@ -654,6 +654,9 @@ <histogram name="LiteVideo.CanApplyLiteVideo.HintCache.HasHint" enum="BooleanAvailable" expires_after="M96"> + <obsolete> + Expired 12/2021. + </obsolete> <owner>mcrouse@chromium.org</owner> <owner>rajendrant@chromium.org</owner> <summary> @@ -665,6 +668,9 @@ <histogram name="LiteVideo.CanApplyLiteVideo.UserBlocklist" enum="LiteVideoBlocklistReason" expires_after="M96"> + <obsolete> + Expired 12/2021. + </obsolete> <owner>mcrouse@chromium.org</owner> <owner>rajendrant@chromium.org</owner> <summary> @@ -677,6 +683,9 @@ <histogram name="LiteVideo.HintAgent.ActiveThrottleSize" units="count" expires_after="M96"> + <obsolete> + Expired 12/2021. + </obsolete> <owner>rajendrant@chromium.org</owner> <owner>mcrouse@chromium.org</owner> <summary> @@ -687,6 +696,9 @@ <histogram name="LiteVideo.HintAgent.HasHint" units="boolean" expires_after="2022-02-20"> + <obsolete> + Expired 12/2021. + </obsolete> <owner>rajendrant@chromium.org</owner> <owner>mcrouse@chromium.org</owner> <summary> @@ -697,6 +709,9 @@ <histogram name="LiteVideo.LiteVideoDecider.OptGuideHintCacheSize" units="count" expires_after="M96"> + <obsolete> + Expired 12/2021. + </obsolete> <owner>mcrouse@chromium.org</owner> <owner>rajendrant@chromium.org</owner> <summary> @@ -707,6 +722,9 @@ <histogram name="LiteVideo.NavigationMetrics.FrameRebufferMapSize" units="count" expires_after="M96"> + <obsolete> + Expired 12/2021. + </obsolete> <owner>mcrouse@chromium.org</owner> <owner>rajendrant@chromium.org</owner> <summary> @@ -717,6 +735,9 @@ <histogram name="LiteVideo.OriginHints.ParseResult" enum="BooleanSuccess" expires_after="M96"> + <obsolete> + Expired 12/2021. + </obsolete> <owner>mcrouse@chromium.org</owner> <owner>rajendrant@chromium.org</owner> <summary> @@ -728,6 +749,9 @@ <histogram name="LiteVideo.URLLoader.ThrottleLatency" units="ms" expires_after="M96"> + <obsolete> + Expired 12/2021. + </obsolete> <owner>rajendrant@chromium.org</owner> <owner>mcrouse@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/event/histograms.xml b/tools/metrics/histograms/metadata/event/histograms.xml index 97ce3f3..e2184591 100644 --- a/tools/metrics/histograms/metadata/event/histograms.xml +++ b/tools/metrics/histograms/metadata/event/histograms.xml
@@ -2043,6 +2043,33 @@ </summary> </histogram> +<histogram name="Event.PageShow.Persisted.Unacked.Status" units="status" + expires_after="2022-10-01"> + <owner>hajimehoshi@chromium.org</owner> + <owner>fergal@chromium.org</owner> + <summary> + When we send a PageLifecycleState update that should trigger a pageshow + event with its persisted flag set but the renderer does not ack it and then + the renderer exits, this records the status of the process. This is an enum + (base::TerminationStatus in base/process/kill.h) but the values vary by + platform so we cannot use a regular enum metric. This is temporary debugging + for https://crbug.com/1234634. + </summary> +</histogram> + +<histogram name="Event.PageShow.Persisted.Unacked.Time" units="ms" + expires_after="2022-10-01"> + <owner>hajimehoshi@chromium.org</owner> + <owner>fergal@chromium.org</owner> + <summary> + When we send a PageLifecycleState update that should trigger a pageshow + event with its persisted flag set but the renderer does not ack it and then + the renderer exits, this records the time interval between sending the + update and exiting. This is temporary debugging for + https://crbug.com/1234634. + </summary> +</histogram> + <histogram name="Event.PassiveListeners" enum="EventResultType" expires_after="2022-04-10"> <owner>dtapuska@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml index 952b021..4078295 100644 --- a/tools/metrics/histograms/metadata/navigation/histograms.xml +++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -1411,6 +1411,27 @@ </summary> </histogram> +<histogram name="Navigation.{Stage}.{FrameType}" units="ms" + expires_after="2022-05-06"> + <owner>cduvall@chromium.org</owner> + <owner>jam@chromium.org</owner> + <summary> + Measures the amount of time the {Stage} stage takes in early navigation. + Logged for any navigation that reaches the stage. + </summary> + <token key="Stage"> + <variant name="BeginNavigationImpl" + summary="NavigationRequest::BeginNavigationImpl"/> + <variant name="DidStartLoading" summary="FrameTreeNode::DidStartLoading"/> + <variant name="LoaderCreateToRequestStart" + summary="NavigationURLLoaderImpl creation to network request start"/> + <variant name="WillStartRequestToLoaderStart" + summary="NavigationRequest::WillStartRequest to + NavigationURLLoader::Start"/> + </token> + <token key="FrameType" variants="FrameTypes"/> +</histogram> + <histogram base="true" name="NavigationPredictor.ActionTaken" enum="NavigationPredictorActionTaken" expires_after="M85"> <obsolete>
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml index 42b039a..10a40e46 100644 --- a/tools/metrics/histograms/metadata/sharing/histograms.xml +++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -144,6 +144,16 @@ </summary> </histogram> +<histogram name="Sharing.DesktopScreenshot.Action" + enum="SharingDesktopScreenshotAction" expires_after="M105"> + <owner>jeffreycohen@chromium.org</owner> + <owner>src/chrome/browser/share/OWNERS</owner> + <summary> + Logged when actions are taken in the sharing desktop screenshot image + editing feature. + </summary> +</histogram> + <histogram name="Sharing.DeviceInfoAvailable" enum="BooleanAvailable" expires_after="M87"> <obsolete>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index e52d9912..71b5f1a 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -7333,6 +7333,133 @@ </history> </aggregation> </metric> + <metric name="CompositorFocusedMedian"> + <summary> + CompositorFocused metrics report the throughput of frames that include + compositor thread updates. The median dropped frames within a + fixed-duration sliding window (as a percentage). So out of all + PerecentDroppedFrames of sliding windows the median will be reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="CompositorFocusedPercentile95"> + <summary> + CompositorFocused metrics report the throughput of frames that include + compositor thread updates. The 95-th percentile dropped frames within a + fixed-duration sliding window (as a percentage). So out of all + PerecentDroppedFrames of sliding windows the 95th percentile will be + reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="CompositorFocusedVariance"> + <summary> + CompositorFocused metrics report the throughput of frames that include + compositor thread updates. The variance of percent dropped frames within a + fixed-duration sliding window. So out of all PerecentDroppedFrames of + sliding windows the variance will be reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="MainFocusedMedian"> + <summary> + MainFocused metrics report the throughput of frames that include main + thread updates. The median dropped frames within a fixed-duration sliding + window (as a percentage). So out of all PerecentDroppedFrames of sliding + windows the median will be reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="MainFocusedPercentile95"> + <summary> + MainFocused metrics report the throughput of frames that include main + thread updates. The 95-th percentile dropped frames within a + fixed-duration sliding window (as a percentage). So out of all + PerecentDroppedFrames of sliding windows the 95th percentile will be + reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="MainFocusedVariance"> + <summary> + MainFocused metrics report the throughput of frames that include main + thread updates. The variance of percent dropped frames within a + fixed-duration sliding window. So out of all PerecentDroppedFrames of + sliding windows the variance will be reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="Median"> + <summary> + The median dropped frames within a fixed-duration sliding window (as a + percentage). So out of all PerecentDroppedFrames of sliding windows the + median will be reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> <metric name="Percentile95"> <summary> The 95-th percentile dropped frames within a fixed-duration sliding window @@ -7350,6 +7477,62 @@ </history> </aggregation> </metric> + <metric name="ScrollFocusedMedian"> + <summary> + ScrollFocused metrics reports the throughput with highest priority on + scroll interactions. The median dropped frames within a fixed-duration + sliding window (as a percentage) with highest priority given to scroll + throughput. So out of all PerecentDroppedFrames of sliding windows the + median will be reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="ScrollFocusedPercentile95"> + <summary> + ScrollFocused metrics reports the throughput with highest priority on + scroll interactions. The 95-th percentile dropped frames within a + fixed-duration sliding window (as a percentage). So out of all + PerecentDroppedFrames of sliding windows the 95th percentile will be + reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> + <metric name="ScrollFocusedVariance"> + <summary> + ScrollFocused metrics reports the throughput with highest priority on + scroll interactions. The variance of percent dropped frames within a + fixed-duration sliding window. So out of all PerecentDroppedFrames of + sliding windows the variance will be reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> <metric name="SmoothnessBad"> <summary> The percentage of sliding windows with bad smoothness, or a @@ -7477,6 +7660,23 @@ </history> </aggregation> </metric> + <metric name="Variance"> + <summary> + The variance of percent dropped frames within a fixed-duration sliding + window. So out of all PerecentDroppedFrames of sliding windows the + variance will be reported here. + </summary> + <aggregation> + <history> + <index fields="profile.country"/> + <index fields="profile.form_factor"/> + <index fields="profile.system_ram"/> + <statistics> + <quantiles type="std-percentiles"/> + </statistics> + </history> + </aggregation> + </metric> <metric name="WorstCase"> <summary> The maximum number of dropped frames (as a percentage) within a @@ -8987,6 +9187,9 @@ </event> <event name="LiteVideo"> + <obsolete> + Obsoleted December 2021. + </obsolete> <owner>mcrouse@chromium.org</owner> <owner>rajendrant@chromium.org</owner> <summary>
diff --git a/tools/perf/page_sets/system_health/browsing_stories.py b/tools/perf/page_sets/system_health/browsing_stories.py index 819964b..5becabd 100644 --- a/tools/perf/page_sets/system_health/browsing_stories.py +++ b/tools/perf/page_sets/system_health/browsing_stories.py
@@ -725,7 +725,9 @@ 'Doc.open': 'telemetry:reported_by_page:benchmark_begin', 'Doc.open complete': - 'telemetry:reported_by_page:benchmark_end' + 'telemetry:reported_by_page:benchmark_end', + 'open document end': + 'telemetry:reported_by_page:time_to_interactive' }; '''
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index 5654492..851eb7f7 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -345,4 +345,5 @@ <item id="publish_note_request" added_in_milestone="98" content_hash_code="01e9f0b8" os_list="android" file_path="components/content_creation/notes/core/server/notes_server_saver.cc" /> <item id="cached_image_fetcher" added_in_milestone="98" content_hash_code="06334a2d" os_list="android" file_path="components/image_fetcher/image_fetcher_bridge.cc" /> <item id="gstatic_change_password_scripts" added_in_milestone="98" content_hash_code="04d28714" os_list="android" file_path="components/password_manager/core/browser/password_scripts_fetcher_impl.cc" /> + <item id="chrome_cast_discovery_api" added_in_milestone="98" content_hash_code="0502b792" os_list="linux,windows,chromeos" file_path="chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.cc" /> </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml index b0af598c..1d3e34c1 100644 --- a/tools/traffic_annotation/summary/grouping.xml +++ b/tools/traffic_annotation/summary/grouping.xml
@@ -331,6 +331,9 @@ </sender> </group> <group name="Media"> + <sender name="Media Router"> + <traffic_annotation unique_id="chrome_cast_discovery_api"/> + </sender> <sender name="Plugins"> <traffic_annotation unique_id="plugins_resource_service"/> </sender>
diff --git a/ui/accessibility/ax_role_properties.cc b/ui/accessibility/ax_role_properties.cc index b8f90ca..5c38850 100644 --- a/ui/accessibility/ax_role_properties.cc +++ b/ui/accessibility/ax_role_properties.cc
@@ -978,6 +978,35 @@ } } +bool SupportsRequired(const ax::mojom::Role role) { + switch (role) { + case ax::mojom::Role::kButton: // Used by the file upload button. + case ax::mojom::Role::kCell: // Used only for grid. + case ax::mojom::Role::kColumnHeader: // Used only for gridheaders. + case ax::mojom::Role::kComboBoxGrouping: + case ax::mojom::Role::kCheckBox: + case ax::mojom::Role::kDate: + case ax::mojom::Role::kDateTime: + case ax::mojom::Role::kInputTime: + case ax::mojom::Role::kListBox: + case ax::mojom::Role::kRadioButton: + case ax::mojom::Role::kRadioGroup: + case ax::mojom::Role::kRowHeader: + case ax::mojom::Role::kSearchBox: + case ax::mojom::Role::kSlider: + case ax::mojom::Role::kSpinButton: + case ax::mojom::Role::kSwitch: + case ax::mojom::Role::kTextField: + case ax::mojom::Role::kTextFieldWithComboBox: + case ax::mojom::Role::kToggleButton: + case ax::mojom::Role::kTree: + case ax::mojom::Role::kTreeGrid: + return true; + default: + return false; + } +} + bool SupportsToggle(const ax::mojom::Role role) { switch (role) { case ax::mojom::Role::kCheckBox:
diff --git a/ui/accessibility/ax_role_properties.h b/ui/accessibility/ax_role_properties.h index a20dc55..ec4ded7 100644 --- a/ui/accessibility/ax_role_properties.h +++ b/ui/accessibility/ax_role_properties.h
@@ -227,6 +227,10 @@ // Returns true if the provided role can have an orientation. AX_BASE_EXPORT bool SupportsOrientation(const ax::mojom::Role role); +// Returns true if the provided role can have the required attribute, +// e.g. <div contenteditable aria-required></div> or <input required> +AX_BASE_EXPORT bool SupportsRequired(const ax::mojom::Role role); + // Returns true if the provided role supports toggle. AX_BASE_EXPORT bool SupportsToggle(const ax::mojom::Role role);
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.mm b/ui/accessibility/platform/ax_platform_node_cocoa.mm index d53f0f4..25cabe0 100644 --- a/ui/accessibility/platform/ax_platform_node_cocoa.mm +++ b/ui/accessibility/platform/ax_platform_node_cocoa.mm
@@ -802,10 +802,7 @@ [axAttributes addObject:NSAccessibilityDetailsElementsAttribute]; } - // Anything focusable or any control: - if (_node->HasIntAttribute(ax::mojom::IntAttribute::kRestriction) || - _node->HasIntAttribute(ax::mojom::IntAttribute::kInvalidState) || - _node->HasState(ax::mojom::State::kFocusable)) { + if (ui::SupportsRequired(role)) { [axAttributes addObject:NSAccessibilityRequiredAttributeChrome]; }
diff --git a/ui/android/java/res/values-night/colors.xml b/ui/android/java/res/values-night/colors.xml index 2f0e2ce..2ae6e11 100644 --- a/ui/android/java/res/values-night/colors.xml +++ b/ui/android/java/res/values-night/colors.xml
@@ -28,7 +28,6 @@ <color name="default_bg_color">@color/default_bg_color_baseline</color> <color name="default_bg_color_baseline">@color/default_bg_color_dark</color> <color name="default_bg_color_secondary">@color/default_bg_color_secondary_dark</color> - <color name="default_bg_color_elev_0">@color/default_bg_color_dark</color> <color name="default_bg_color_elev_1">@color/default_bg_color_dark_elev_1</color> <color name="default_bg_color_elev_2">@color/default_bg_color_dark_elev_2</color> <color name="default_bg_color_elev_3">@color/default_bg_color_dark_elev_3</color>
diff --git a/ui/android/java/res/values/attrs.xml b/ui/android/java/res/values/attrs.xml index f4a5793c..0814dcd 100644 --- a/ui/android/java/res/values/attrs.xml +++ b/ui/android/java/res/values/attrs.xml
@@ -23,9 +23,6 @@ <!-- Used in SwitchMaterial thumb tint list for the disabled state. --> <attr name="colorFixedOnSurfaceAlpha38OverSurface" format="color"/> - <!-- Semantic names that will support dynamic colors but not yet. --> - <attr name="default_bg_color" format="color"/> - <!-- Splintered semantic names that support dynamic colors. --> <attr name="default_bg_color_dynamic" format="color"/> <attr name="divider_line_bg_color_dynamic" format="color"/>
diff --git a/ui/android/java/res/values/semantic_colors_adaptive.xml b/ui/android/java/res/values/semantic_colors_adaptive.xml index 01de6c5..c2aecf5 100644 --- a/ui/android/java/res/values/semantic_colors_adaptive.xml +++ b/ui/android/java/res/values/semantic_colors_adaptive.xml
@@ -44,7 +44,6 @@ <!-- TODO(https://crbug.com/1210689): These all need to ultimately be removed because they do not work with dynamic colors. --> - <color name="default_bg_color_elev_0" tools:ignore="UnusedResources">@color/default_bg_color_light</color> <color name="default_bg_color_elev_1" tools:ignore="UnusedResources">@color/default_bg_color_light_elev_1</color> <color name="default_bg_color_elev_2" tools:ignore="UnusedResources">@color/default_bg_color_light_elev_2</color> <color name="default_bg_color_elev_3" tools:ignore="UnusedResources">@color/default_bg_color_light_elev_3</color>
diff --git a/ui/base/data_transfer_policy/data_transfer_endpoint.h b/ui/base/data_transfer_policy/data_transfer_endpoint.h index 75815e0..eb97de2 100644 --- a/ui/base/data_transfer_policy/data_transfer_endpoint.h +++ b/ui/base/data_transfer_policy/data_transfer_endpoint.h
@@ -40,6 +40,8 @@ // if the data read is not allowed.) class COMPONENT_EXPORT(UI_BASE_DATA_TRANSFER_POLICY) DataTransferEndpoint { public: + // In case DataTransferEndpoint is constructed from a RenderFrameHost object, + // please use the origin of its main frame. explicit DataTransferEndpoint(const url::Origin& origin, bool notify_if_restricted = true); // This constructor shouldn't be used if |type| == EndpointType::kUrl.
diff --git a/ui/color/BUILD.gn b/ui/color/BUILD.gn index e47770d..78b9159 100644 --- a/ui/color/BUILD.gn +++ b/ui/color/BUILD.gn
@@ -20,11 +20,22 @@ ] public_deps = [ - "//base:base", - "//skia:skia", + "//base", + "//skia", ] } +component("color_switches") { + sources = [ + "color_switches.cc", + "color_switches.h", + ] + + defines = [ "IS_COLOR_SWITCHES_IMPL" ] + + public_deps = [ "//base" ] +} + component("color") { sources = [ "color_mixer.cc", @@ -46,8 +57,8 @@ public_deps = [ ":color_headers", - "//base:base", - "//skia:skia", + "//base", + "//skia", "//ui/gfx:color_utils", ] @@ -147,5 +158,9 @@ ] } else if (is_win) { sources += [ "win/native_color_mixers_win.cc" ] + deps += [ + ":accent_color_observer", + ":color_switches", + ] } }
diff --git a/ui/color/color_switches.cc b/ui/color/color_switches.cc new file mode 100644 index 0000000..833bd80 --- /dev/null +++ b/ui/color/color_switches.cc
@@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/color/color_switches.h" + +#include "build/build_config.h" + +namespace switches { + +#if defined(OS_WIN) +// Use the system accent color as the Chrome UI accent color. +const char kPervasiveSystemAccentColor[] = "pervasive-system-accent-color"; +#endif + +} // namespace switches
diff --git a/ui/color/color_switches.h b/ui/color/color_switches.h new file mode 100644 index 0000000..5e295287 --- /dev/null +++ b/ui/color/color_switches.h
@@ -0,0 +1,20 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_COLOR_COLOR_SWITCHES_H_ +#define UI_COLOR_COLOR_SWITCHES_H_ + +#include "base/component_export.h" +#include "build/build_config.h" + +namespace switches { + +#if defined(OS_WIN) +COMPONENT_EXPORT(COLOR_SWITCHES) +extern const char kPervasiveSystemAccentColor[]; +#endif + +} // namespace switches + +#endif // UI_COLOR_COLOR_SWITCHES_H_
diff --git a/ui/color/color_transform.h b/ui/color/color_transform.h index 47847a3..2be823c 100644 --- a/ui/color/color_transform.h +++ b/ui/color/color_transform.h
@@ -117,13 +117,13 @@ COMPONENT_EXPORT(COLOR) ColorTransform SetAlpha(ColorTransform transform, SkAlpha alpha); -// A transform that computes the Google color that matches the hue of `color` -// and contrasts well enough against `background_color` to meet `min_contrast`. -// If `color` isn't very saturated, grey will be used instead. +// A transform that gets a Google color that matches the hue of `color` and +// contrasts similarly against `background_color`, subject to being at least +// `min_contrast`. If `color` isn't very saturated, grey will be used instead. COMPONENT_EXPORT(COLOR) ColorTransform PickGoogleColor(ColorTransform color, ColorTransform background_color, - float min_contrast); + float min_contrast = 0.0f); #if defined(OS_MAC) COMPONENT_EXPORT(COLOR)
diff --git a/ui/color/win/native_color_mixers_win.cc b/ui/color/win/native_color_mixers_win.cc index 7d494515..a343a96 100644 --- a/ui/color/win/native_color_mixers_win.cc +++ b/ui/color/win/native_color_mixers_win.cc
@@ -6,12 +6,15 @@ #include <windows.h> +#include "base/command_line.h" #include "ui/color/color_id.h" #include "ui/color/color_mixer.h" #include "ui/color/color_provider.h" #include "ui/color/color_recipe.h" #include "ui/color/color_set.h" +#include "ui/color/color_switches.h" #include "ui/color/color_transform.h" +#include "ui/color/win/accent_color_observer.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/color_utils.h" @@ -27,6 +30,16 @@ // these. ColorMixer& mixer = provider->AddMixer(); + // Use the system accent color as the Chrome accent color, if desired. + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kPervasiveSystemAccentColor)) { + const auto accent_color = AccentColorObserver::Get()->accent_color(); + if (accent_color.has_value()) { + mixer[kColorAccent] = + PickGoogleColor({accent_color.value()}, kColorPrimaryBackground); + } + } + if (!high_contrast) return;
diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc index 1ce9a69..1b7e2fa2 100644 --- a/ui/compositor/test/in_process_context_factory.cc +++ b/ui/compositor/test/in_process_context_factory.cc
@@ -366,8 +366,7 @@ } auto scheduler = std::make_unique<viz::DisplayScheduler>( begin_frame_source.get(), compositor->task_runner().get(), - display_output_surface->capabilities().max_frames_pending, - display_output_surface->capabilities().max_frames_pending_120hz, + display_output_surface->capabilities().pending_swap_params, /*hint_session_factory=*/nullptr); data->SetDisplay(std::make_unique<viz::Display>(
diff --git a/ui/display/manager/display_manager.h b/ui/display/manager/display_manager.h index 73936196..9fc078ae 100644 --- a/ui/display/manager/display_manager.h +++ b/ui/display/manager/display_manager.h
@@ -652,6 +652,7 @@ DisplayIdList hardware_mirroring_display_id_list_; // Stores external displays that were in mirror mode before. + // These are display ids without output index. std::set<int64_t> external_display_mirror_info_; // This is set to true when the display prefs have been loaded from local
diff --git a/ui/file_manager/file_manager/foreground/css/common.css b/ui/file_manager/file_manager/foreground/css/common.css index bb4a45c..e7f33b6 100644 --- a/ui/file_manager/file_manager/foreground/css/common.css +++ b/ui/file_manager/file_manager/foreground/css/common.css
@@ -364,9 +364,10 @@ .cr-dialog-container.files-ng #suggest-app-dialog .cr-dialog-close, .cr-dialog-container.files-ng #default-task-dialog .cr-dialog-close { - background: url(../images/common/ic_close.svg); - background-position: center; - background-repeat: no-repeat; + -webkit-mask-image: url(../images/common/ic_close.svg); + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + background-color: var(--cros-icon-color-primary); cursor: pointer; display: inline-block; height: 32px;
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css index ff585aaf..45d6c02 100644 --- a/ui/file_manager/file_manager/foreground/css/file_manager.css +++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -1796,7 +1796,7 @@ bar when it's not needed. Max height is set to fit 8 items before showing scroll bar. */ body.files-ng #default-tasks-list { - border-top: solid 1px rgba(0, 0, 0, 14%); + border-top: solid 1px var(--cros-separator-color); height: 240px; margin: 16px -16px; margin-bottom: 12px; @@ -1847,14 +1847,15 @@ body.files-ng #default-tasks-list:focus > li[selected], body.files-ng #default-tasks-list > li[selected] { - background-color: var(--google-blue-50); + background-color: var(--cros-highlight-color); outline: none; } body.files-ng #default-tasks-list li[selected]::after { - background-image: url(../images/common/ic_selected.svg); - background-position: right; - background-repeat: no-repeat; + -webkit-mask-image: url(../images/common/ic_selected.svg); + -webkit-mask-position: right; + -webkit-mask-repeat: no-repeat; + background-color: var(--cros-icon-color-selection); content: ' '; height: 40px; position: absolute;