Reland "Reland "Integrate CookieControlsPageActionController with the browser"" This is a reland of commit c75e239ad273212a23dee98c61573f089dea92be Confirmed this CL passes on the previously failing trybot: https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_chromeos_msan_rel_ng/8091? See diff from patchset 1 for changes. The original CL was reverted because the bubble controller was trying to remove its observation of the CookieControlsController during shutdown, but CookieControlsController was already destroyed. This CL fixes this by explicitly closing the bubble when the tab is deactivated OR detached. Original change's description: > Reland "Integrate CookieControlsPageActionController with the browser" > > This is a reland of commit 13a9813ebf42e70fb00b107e7daa7e8d727923d2 > > See diff from patchset 1 for changes. The original CL was reverted > because the bubble controller was trying to remove its observation of > the CookieControlsController during shutdown, but > CookieControlsController was already destroyed. This CL fixes this by > explicitly closing the bubble when the tab is deactivated. > > Original change's description: > > Integrate CookieControlsPageActionController with the browser > > > > CookieControlsPageActionController, which manages the migrated cookie > > controls page action path, is hooked up to the rest of the browser, > > allowing it to take effect. This change consists of: > > - Defining the browser action to trigger the page action > > - Initializing the controller in TabFeatures > > - Updating tests to use the new browser action to simulate invoking the page action > > - Enabling the migration flag in fieldtrial_testing_config.json and adding it to the about://flags option. > > > > Bug: 376283777 > > Change-Id: I4250c1c2d2193cbd02050a1591725a45d660ee6e > > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6956907 > > Commit-Queue: Kaan Alsan <alsan@chromium.org> > > Reviewed-by: Dana Fried <dfried@chromium.org> > > Cr-Commit-Position: refs/heads/main@{#1526323} > > Bug: 376283777 > Change-Id: Ia534aa62902e850ee4c1384f22af7261522b55ad > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7021969 > Reviewed-by: Dana Fried <dfried@chromium.org> > Commit-Queue: Kaan Alsan <alsan@chromium.org> > Cr-Commit-Position: refs/heads/main@{#1527679} Bug: 376283777 Change-Id: Ibec939cfe2eea668ed99cd37daa66809515ee9cb Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7030544 Reviewed-by: Dana Fried <dfried@chromium.org> Commit-Queue: Kaan Alsan <alsan@chromium.org> Cr-Commit-Position: refs/heads/main@{#1529665}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index e721b85..2c7dfa1 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1152,6 +1152,7 @@ const FeatureEntry::FeatureParam kPageActionsMigrationParams[] = { {"autofill_address", "true"}, + {"cookie_controls", "true"}, {"click_to_call", "true"}, {"collaboration_messaging", "true"}, {"discounts", "true"},
diff --git a/chrome/browser/ui/browser_actions.cc b/chrome/browser/ui/browser_actions.cc index 115f550..823c46b 100644 --- a/chrome/browser/ui/browser_actions.cc +++ b/chrome/browser/ui/browser_actions.cc
@@ -56,6 +56,7 @@ #include "chrome/browser/ui/views/file_system_access/file_system_access_bubble_controller.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/toolbar_button_provider.h" +#include "chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.h" #include "chrome/browser/ui/views/media_router/cast_browser_controller.h" #include "chrome/browser/ui/views/page_info/page_info_view_factory.h" #include "chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.h" @@ -606,6 +607,24 @@ .Build()); root_action_item_->AddChild( + actions::ActionItem::Builder( + base::BindRepeating( + [](BrowserWindowInterface* bwi, actions::ActionItem* item, + actions::ActionInvocationContext context) { + tabs::TabInterface& tab = + CHECK_DEREF(bwi->GetActiveTabInterface()); + auto* controller = + CookieControlsPageActionController::From(tab); + CHECK(controller); + controller->ExecutePageAction(bwi->GetBrowserForMigrationOnly() + ->GetBrowserView() + .toolbar_button_provider()); + }, + bwi)) + .SetActionId(kActionShowCookieControls) + .Build()); + + root_action_item_->AddChild( ChromeMenuAction( base::BindRepeating( [](BrowserWindowInterface* bwi, actions::ActionItem* item,
diff --git a/chrome/browser/ui/tabs/BUILD.gn b/chrome/browser/ui/tabs/BUILD.gn index 87508a03..b03471d1 100644 --- a/chrome/browser/ui/tabs/BUILD.gn +++ b/chrome/browser/ui/tabs/BUILD.gn
@@ -529,6 +529,7 @@ "//chrome/browser/ui/user_education", "//chrome/browser/ui/views/intent_picker:intent_picker_page_action", "//chrome/browser/ui/views/location_bar", + "//chrome/browser/ui/views/location_bar/cookie_controls", "//chrome/browser/ui/views/page_action", "//chrome/browser/ui/views/page_info", "//chrome/browser/ui/views/side_panel",
diff --git a/chrome/browser/ui/tabs/public/tab_features.h b/chrome/browser/ui/tabs/public/tab_features.h index 3557eafc..aa383d1 100644 --- a/chrome/browser/ui/tabs/public/tab_features.h +++ b/chrome/browser/ui/tabs/public/tab_features.h
@@ -15,6 +15,7 @@ class AskBeforeHttpDialogController; class CollaborationMessagingPageActionController; +class CookieControlsPageActionController; class FileSystemAccessPageActionController; class FromGWSNavigationAndKeepAliveRequestObserver; class IntentPickerViewPageActionController; @@ -421,6 +422,10 @@ std::unique_ptr<CollaborationMessagingPageActionController> collaboration_messaging_page_action_controller_; + // Manages the Cookie Controls page action. + std::unique_ptr<CookieControlsPageActionController> + cookie_controls_page_action_controller_; + #if BUILDFLAG(ENABLE_GLIC) std::unique_ptr<glic::GlicInstanceHelper> glic_instance_helper_; std::unique_ptr<glic::GlicTabIndicatorHelper> glic_tab_indicator_helper_;
diff --git a/chrome/browser/ui/tabs/tab_features.cc b/chrome/browser/ui/tabs/tab_features.cc index 7d53c8ee..5b60236f 100644 --- a/chrome/browser/ui/tabs/tab_features.cc +++ b/chrome/browser/ui/tabs/tab_features.cc
@@ -69,6 +69,7 @@ #include "chrome/browser/ui/views/commerce/price_insights_page_action_view_controller.h" #include "chrome/browser/ui/views/file_system_access/file_system_access_page_action_controller.h" #include "chrome/browser/ui/views/intent_picker/intent_picker_view_page_action_controller.h" +#include "chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.h" #include "chrome/browser/ui/views/page_action/action_ids.h" #include "chrome/browser/ui/views/page_action/page_action_controller.h" #include "chrome/browser/ui/views/page_action/page_action_properties_provider.h" @@ -215,6 +216,14 @@ std::make_unique<ManagePasswordsPageActionController>( *page_action_controller_); } + + if (IsPageActionMigrated(PageActionIconType::kCookieControls)) { + cookie_controls_page_action_controller_ = + GetUserDataFactory() + .CreateInstance<CookieControlsPageActionController>( + tab, tab, *profile, *page_action_controller_); + cookie_controls_page_action_controller_->Init(); + } } // Features that are only enabled for normal browser windows. By default most
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_coordinator.cc b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_coordinator.cc index e370aea..297ea48 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_coordinator.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_coordinator.cc
@@ -4,11 +4,13 @@ #include "chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_coordinator.h" +#include "chrome/browser/ui/actions/chrome_action_id.h" #include "chrome/browser/ui/page_action/page_action_icon_type.h" #include "chrome/browser/ui/views/frame/toolbar_button_provider.h" #include "chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_controller.h" #include "chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_impl.h" #include "chrome/browser/ui/views/page_action/page_action_icon_view.h" +#include "chrome/browser/ui/views/page_action/page_action_view.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" namespace content { @@ -46,8 +48,8 @@ bubble_view_ = bubble_view.get(); bubble_view_->View::AddObserver(this); - auto* icon_view = toolbar_button_provider->GetPageActionIconView( - PageActionIconType::kCookieControls); + auto* icon_view = + toolbar_button_provider->GetPageActionView(kActionShowCookieControls); CHECK(icon_view); bubble_view_->SetHighlightedButton(icon_view);
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_pixel_test.cc b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_pixel_test.cc index b0738da9..f7d4eeec 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_pixel_test.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_pixel_test.cc
@@ -10,8 +10,10 @@ #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/privacy_sandbox/tracking_protection_settings_factory.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/actions/chrome_action_id.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/location_bar/location_bar.h" +#include "chrome/browser/ui/page_action/page_action_icon_type.h" #include "chrome/browser/ui/test/test_browser_dialog.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/toolbar_button_provider.h" @@ -89,10 +91,9 @@ content::SetupCrossSiteRedirector(https_test_server()); ASSERT_TRUE(https_test_server()->Start()); - cookie_controls_icon_ = static_cast<CookieControlsIconView*>( - BrowserView::GetBrowserViewForBrowser(browser()) - ->toolbar_button_provider() - ->GetPageActionIconView(PageActionIconType::kCookieControls)); + cookie_controls_icon_ = BrowserView::GetBrowserViewForBrowser(browser()) + ->toolbar_button_provider() + ->GetPageActionView(kActionShowCookieControls); ASSERT_TRUE(cookie_controls_icon_); controller_ = std::make_unique<content_settings::CookieControlsController>( @@ -112,7 +113,7 @@ /*is_incognito_profile=*/true); cookie_controls_coordinator_ = - &cookie_controls_icon_->GetCoordinatorForTesting(); + CookieControlsBubbleCoordinator::From(browser()); cookie_controls_coordinator_->SetDisplayNameForTesting(u"example.com"); } @@ -143,9 +144,7 @@ "/third_party_partitioned_cookies.html"); } - CookieControlsIconView* cookie_controls_icon() { - return cookie_controls_icon_; - } + IconLabelBubbleView* cookie_controls_icon() { return cookie_controls_icon_; } net::EmbeddedTestServer* https_test_server() { return https_server_.get(); } CookieControlsBubbleViewController* view_controller() { @@ -170,7 +169,7 @@ std::unique_ptr<net::EmbeddedTestServer> https_server_; content::ContentMockCertVerifier mock_cert_verifier_; base::test::ScopedFeatureList scoped_feature_list_; - raw_ptr<CookieControlsIconView> cookie_controls_icon_; + raw_ptr<IconLabelBubbleView> cookie_controls_icon_; std::unique_ptr<content_settings::CookieControlsController> controller_; std::unique_ptr<content_settings::CookieControlsController> incognito_controller_; @@ -221,7 +220,10 @@ // needed for this test. view_controller()->OnStatusChanged(controls_state, enforcement, blocking_status, expiration); - cookie_controls_icon()->DisableUpdatesForTesting(); + if (!IsPageActionMigrated(PageActionIconType::kCookieControls)) { + static_cast<CookieControlsIconView*>(cookie_controls_icon()) + ->ExecuteForTesting(); + } } void ShowUi(const std::string& name_with_param_suffix) override { @@ -230,7 +232,15 @@ ASSERT_TRUE(cookie_controls_icon()->GetVisible()); views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, "CookieControlsBubbleViewImpl"); - cookie_controls_icon()->ExecuteForTesting(); + if (IsPageActionMigrated(PageActionIconType::kCookieControls)) { + actions::ActionManager::Get() + .FindAction(kActionShowCookieControls) + ->InvokeAction(); + } else { + static_cast<CookieControlsIconView*>(cookie_controls_icon()) + ->ExecuteForTesting(); + } + SetStatus(controls_state_, enforcement_, GetParam(), days_to_expiration_); waiter.WaitIfNeededAndGet(); @@ -334,7 +344,14 @@ ASSERT_TRUE(cookie_controls_icon()->GetVisible()); views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, "CookieControlsBubbleViewImpl"); - cookie_controls_icon()->ExecuteForTesting(); + if (IsPageActionMigrated(PageActionIconType::kCookieControls)) { + actions::ActionManager::Get() + .FindAction(kActionShowCookieControls) + ->InvokeAction(); + } else { + static_cast<CookieControlsIconView*>(cookie_controls_icon()) + ->ExecuteForTesting(); + } SetStatus(controls_state_, enforcement_); waiter.WaitIfNeededAndGet(); } @@ -354,7 +371,10 @@ view_controller()->OnStatusChanged(controls_state, enforcement, CookieBlocking3pcdStatus::kNotIn3pcd, base::Time()); - cookie_controls_icon()->DisableUpdatesForTesting(); + if (!IsPageActionMigrated(PageActionIconType::kCookieControls)) { + static_cast<CookieControlsIconView*>(cookie_controls_icon()) + ->ExecuteForTesting(); + } } protected:
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_interactive_uitest.cc index ee38ba89..facec49 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_interactive_uitest.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_interactive_uitest.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view.h" #include "chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_content_view.h" #include "chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_icon_view.h" +#include "chrome/browser/ui/views/location_bar/icon_label_bubble_view.h" #include "chrome/browser/ui/webui/feedback/feedback_dialog.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/in_process_browser_test.h" @@ -380,7 +381,7 @@ PressButton(CookieControlsContentView::kToggleButton), CheckFeedbackButtonVisible(false), CheckViewProperty(kCookieControlsIconElementId, - &CookieControlsIconView::is_animating_label, false), + &IconLabelBubbleView::is_animating_label, false), CheckStateForNoException()); } @@ -393,7 +394,7 @@ InstrumentTab(kWebContentsElementId), NavigateWebContents(kWebContentsElementId, third_party_cookie_page_url()), CheckViewProperty(kCookieControlsIconElementId, - &CookieControlsIconView::is_animating_label, true)); + &IconLabelBubbleView::is_animating_label, true)); } // Need a separate fixture to override the enabled feature list. @@ -405,8 +406,16 @@ ~CookieControlsWithIphUiTest() override = default; }; +// TODO(crbug.com/409272227): IPH tests are flaky on Linux. +#if BUILDFLAG(IS_LINUX) && defined(NDEBUG) +#define MAYBE_ShowAndDismissIphOnHighSiteEngagement \ + DISABLED_ShowAndDismissIphOnHighSiteEngagement +#else +#define MAYBE_ShowAndDismissIphOnHighSiteEngagement \ + ShowAndDismissIphOnHighSiteEngagement +#endif IN_PROC_BROWSER_TEST_F(CookieControlsWithIphUiTest, - ShowAndDismissIphOnHighSiteEngagement) { + MAYBE_ShowAndDismissIphOnHighSiteEngagement) { BlockThirdPartyCookies(); SetHighSiteEngagement(); RunTestSequence( @@ -414,7 +423,7 @@ NavigateWebContents(kWebContentsElementId, third_party_cookie_page_url()), // Check that label doesn't animate. CheckViewProperty(kCookieControlsIconElementId, - &CookieControlsIconView::is_animating_label, false), + &IconLabelBubbleView::is_animating_label, false), // Check that IPH shows, then dismiss it. InAnyContext(WaitForShow( user_education::HelpBubbleView::kHelpBubbleElementIdForTesting)), @@ -751,7 +760,7 @@ PressButton(CookieControlsContentView::kToggleButton), CheckFeedbackButtonVisible(false), CheckViewProperty(kCookieControlsIconElementId, - &CookieControlsIconView::is_animating_label, false), + &IconLabelBubbleView::is_animating_label, false), CheckUserBypassBlockedState()); }
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.cc b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.cc index 1510cdd..41f8699b 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.cc
@@ -124,6 +124,8 @@ } } // namespace +DEFINE_USER_DATA(CookieControlsPageActionController); + CookieControlsPageActionController::CookieControlsPageActionController( tabs::TabInterface& tab_interface, Profile& profile, @@ -140,7 +142,8 @@ HostContentSettingsMapFactory::GetForProfile(&profile), TrackingProtectionSettingsFactory::GetForProfile(&profile), profile.IsIncognitoProfile())), - bubble_delegate_(std::make_unique<BubbleDelegateImpl>(tab_interface)) { + bubble_delegate_(std::make_unique<BubbleDelegateImpl>(tab_interface)), + scoped_unowned_user_data_(tab_interface.GetUnownedUserDataHost(), *this) { CHECK(IsPageActionMigrated(PageActionIconType::kCookieControls)); RegisterAsPageActionObserver(page_action_controller_.get()); } @@ -148,6 +151,12 @@ CookieControlsPageActionController::~CookieControlsPageActionController() = default; +// static +CookieControlsPageActionController* CookieControlsPageActionController::From( + tabs::TabInterface& tab) { + return Get(tab.GetUnownedUserDataHost()); +} + void CookieControlsPageActionController::Init() { controller_observation_.Observe(cookie_controls_controller_.get()); @@ -164,9 +173,29 @@ [](content_settings::CookieControlsController& cookies_controller, tabs::TabInterface* tab, content::WebContents* old_contents, content::WebContents* new_contents) { - cookies_controller.Update(new_contents); + if (new_contents) { + cookies_controller.Update(new_contents); + } }, std::ref(*cookie_controls_controller_))); + + tab_deactivation_subscription_ = + tab_->RegisterWillDeactivate(base::BindRepeating( + [](content_settings::CookieControlsController& cookies_controller, + tabs::TabInterface* tab) { + cookies_controller.OnBubbleCloseTriggered(); + }, + std::ref(*cookie_controls_controller_))); + + tab_will_detach_subscription_ = tab_->RegisterWillDetach(base::BindRepeating( + [](content_settings::CookieControlsController& cookies_controller, + tabs::TabInterface* tab, + tabs::TabInterface::DetachReason detach_reason) { + if (tab->IsActivated()) { + cookies_controller.OnBubbleCloseTriggered(); + } + }, + std::ref(*cookie_controls_controller_))); } void CookieControlsPageActionController::OnPageActionChipShown( @@ -218,7 +247,8 @@ } if (!icon_status_.icon_visible || !icon_status_.should_highlight || - icon_status_.controls_state != CookieControlsState::kBlocked3pc) { + icon_status_.controls_state != CookieControlsState::kBlocked3pc || + bubble_delegate_->HasBubble()) { return; } if (icon_status_.blocking_status == CookieBlocking3pcdStatus::kNotIn3pcd) { @@ -226,7 +256,7 @@ tab_->GetBrowserWindowInterface())) { MaybeShowIPH(*user_education); } - } else if (!bubble_delegate_->HasBubble() && !IsManagedIPHActive()) { + } else if (!IsManagedIPHActive()) { page_action_controller_->OverrideText( kActionShowCookieControls, l10n_util::GetStringUTF16(
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.h b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.h index da88008..0465dc6f 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.h +++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller.h
@@ -36,6 +36,8 @@ : public content_settings::CookieControlsObserver, public page_actions::PageActionObserver { public: + DECLARE_USER_DATA(CookieControlsPageActionController); + // An interface for interacting with the Cookie Controls bubble. class BubbleDelegate { public: @@ -59,6 +61,8 @@ const CookieControlsPageActionController&) = delete; ~CookieControlsPageActionController() override; + static CookieControlsPageActionController* From(tabs::TabInterface& tab); + void Init(); // PageActionObserver @@ -112,6 +116,9 @@ CookieControlsIconStatus icon_status_; base::CallbackListSubscription will_discard_contents_subscription_; + base::CallbackListSubscription tab_deactivation_subscription_; + base::CallbackListSubscription tab_will_detach_subscription_; + base::ScopedObservation<content_settings::CookieControlsController, content_settings::CookieControlsObserver> controller_observation_{this}; @@ -119,6 +126,9 @@ // Timer used to collapse from the chip state after some time. base::OneShotTimer hide_chip_timer_; + ui::ScopedUnownedUserData<CookieControlsPageActionController> + scoped_unowned_user_data_; + base::WeakPtrFactory<CookieControlsPageActionController> weak_ptr_factory_{ this}; };
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller_unittest.cc b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller_unittest.cc index dfce0b0e..7fa4e58c 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller_unittest.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_page_action_controller_unittest.cc
@@ -112,14 +112,8 @@ {privacy_sandbox::kActUserBypassUx, {}}}, {}); - cookie_controls_page_action_controller_ = - std::make_unique<CookieControlsPageActionController>( - mock_tab_interface_, profile_, page_action_controller_); - auto mock_bubble_delegate = std::make_unique<MockBubbleDelegate>(); mock_bubble_delegate_ = mock_bubble_delegate.get(); - controller().set_bubble_delegate_for_testing( - std::move(mock_bubble_delegate)); web_contents_ = content::WebContentsTester::CreateTestWebContents(&profile_, nullptr); @@ -127,6 +121,8 @@ .WillByDefault(Return(web_contents_.get())); ON_CALL(mock_tab_interface_, GetBrowserWindowInterface()) .WillByDefault(Return(&mock_browser_window_interface_)); + ON_CALL(mock_tab_interface_, GetUnownedUserDataHost()) + .WillByDefault(ReturnRef(user_data_host_)); ON_CALL(mock_browser_window_interface_, GetUnownedUserDataHost()) .WillByDefault(ReturnRef(user_data_host_)); user_education_.emplace(&mock_browser_window_interface_); @@ -146,6 +142,12 @@ ON_CALL(*mock_bubble_delegate_, IsReloading()).WillByDefault(Return(false)); ON_CALL(*mock_bubble_delegate_, HasBubble()).WillByDefault(Return(false)); + cookie_controls_page_action_controller_ = + std::make_unique<CookieControlsPageActionController>( + mock_tab_interface_, profile_, page_action_controller_); + controller().set_bubble_delegate_for_testing( + std::move(mock_bubble_delegate)); + controller().Init(); }
diff --git a/chrome/browser/ui/views/page_action/action_ids.h b/chrome/browser/ui/views/page_action/action_ids.h index 4884fa4..3b86fce3 100644 --- a/chrome/browser/ui/views/page_action/action_ids.h +++ b/chrome/browser/ui/views/page_action/action_ids.h
@@ -15,7 +15,7 @@ // All ActionIds associated with a page action. // For now, the order of the page actions will be based on their position in // the array. -inline constexpr std::array<actions::ActionId, 15> kActionIds = { +inline constexpr std::array<actions::ActionId, 16> kActionIds = { kActionSidePanelShowLensOverlayResults, kActionShowTranslate, kActionShowMemorySaverChip, @@ -31,6 +31,7 @@ kActionAutofillMandatoryReauth, kActionFind, kActionAiMode, + kActionShowCookieControls, }; } // namespace page_actions
diff --git a/chrome/browser/ui/views/page_action/page_action_properties_provider.cc b/chrome/browser/ui/views/page_action/page_action_properties_provider.cc index 2e48dae..0dc3daa 100644 --- a/chrome/browser/ui/views/page_action/page_action_properties_provider.cc +++ b/chrome/browser/ui/views/page_action/page_action_properties_provider.cc
@@ -135,6 +135,14 @@ .element_identifier = FindBarIcon::kElementId, }, }, + { + kActionShowCookieControls, + { + .histogram_name = "CookieControls", + .type = PageActionIconType::kCookieControls, + .element_identifier = kCookieControlsIconElementId, + }, + }, }); constexpr bool CheckIgnoreFlagUsage() {
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc index 992f063..bdc23dc 100644 --- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc +++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -23,12 +23,14 @@ #include "chrome/browser/search/search.h" #include "chrome/browser/ui/actions/chrome_action_id.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_actions.h" #include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_window/public/browser_window_features.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/feature_first_run/autofill_ai_first_run_dialog.h" +#include "chrome/browser/ui/page_action/page_action_icon_type.h" #include "chrome/browser/ui/performance_controls/performance_controls_metrics.h" #include "chrome/browser/ui/singleton_tabs.h" #include "chrome/browser/ui/tabs/saved_tab_groups/most_recent_shared_tab_update_store.h" @@ -904,13 +906,21 @@ base::BindRepeating( [](ContextPtr ctx, user_education::FeaturePromoHandle promo_handle) { - auto* cookie_controls_icon_view = - views::ElementTrackerViews::GetInstance() - ->GetFirstMatchingViewAs<CookieControlsIconView>( - kCookieControlsIconElementId, - ctx->GetElementContext()); - if (cookie_controls_icon_view != nullptr) { - cookie_controls_icon_view->ShowCookieControlsBubble(); + if (IsPageActionMigrated(PageActionIconType::kCookieControls)) { + actions::ActionManager::Get() + .FindAction( + kActionShowCookieControls, + GetBrowser(ctx)->GetActions()->root_action_item()) + ->InvokeAction(); + } else { + auto* cookie_controls_icon_view = + views::ElementTrackerViews::GetInstance() + ->GetFirstMatchingViewAs<CookieControlsIconView>( + kCookieControlsIconElementId, + ctx->GetElementContext()); + if (cookie_controls_icon_view != nullptr) { + cookie_controls_icon_view->ShowCookieControlsBubble(); + } } })) .SetBubbleTitleText(IDS_COOKIE_CONTROLS_PROMO_TITLE)
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.cc b/chrome/browser/ui/web_applications/app_browser_controller.cc index d65f33b..a8198a15 100644 --- a/chrome/browser/ui/web_applications/app_browser_controller.cc +++ b/chrome/browser/ui/web_applications/app_browser_controller.cc
@@ -378,8 +378,12 @@ #endif // BUILDFLAG(IS_CHROMEOS) std::vector<actions::ActionId> types_enabled = { - kActionFind, kActionShowPasswordsBubbleOrPage, kActionShowTranslate, - kActionZoomNormal, kActionShowFileSystemAccess, + kActionFind, + kActionShowPasswordsBubbleOrPage, + kActionShowTranslate, + kActionZoomNormal, + kActionShowFileSystemAccess, + kActionShowCookieControls, }; #if DCHECK_IS_ON()
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 4c63f85..02039f4 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -17522,6 +17522,7 @@ "autofill_address": "true", "click_to_call": "true", "collaboration_messaging": "true", + "cookie_controls": "true", "discounts": "true", "file_system_access": "true", "find": "true",