blob: 8f3ab470ff536e8e0ba6d6095221940ce5cc58a6 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_BROWSER_WINDOW_PUBLIC_BROWSER_WINDOW_FEATURES_H_
#define CHROME_BROWSER_UI_BROWSER_WINDOW_PUBLIC_BROWSER_WINDOW_FEATURES_H_
#include <memory>
#include "base/functional/callback.h"
#include "chrome/common/buildflags.h"
#if BUILDFLAG(ENABLE_GLIC)
namespace glic {
class GlicButtonController;
class GlicIphController;
} // namespace glic
#endif
class Browser;
class BrowserInstantController;
class BrowserView;
class BrowserWindowInterface;
class ChromeLabsCoordinator;
class CookieControlsBubbleCoordinator;
class HistorySidePanelCoordinator;
class BookmarksSidePanelCoordinator;
class MemorySaverOptInIPHController;
class SidePanelCoordinator;
class SidePanelUI;
class TabMenuModelDelegate;
class TabSearchToolbarButtonController;
class TabStripModel;
class TranslateBubbleController;
class ToastController;
class ToastService;
class DownloadToolbarUIController;
class TabStripServiceRegister;
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
class PdfInfoBarController;
#endif
namespace extensions {
class ExtensionSidePanelManager;
class Mv2DisabledDialogController;
} // namespace extensions
namespace tabs {
class TabDeclutterController;
} // namespace tabs
namespace commerce {
class ProductSpecificationsEntryPointController;
} // namespace commerce
namespace tabs {
class GlicNudgeController;
}
namespace lens {
class LensOverlayEntryPointController;
class LensRegionSearchController;
} // namespace lens
namespace media_router {
class CastBrowserController;
} // namespace media_router
namespace memory_saver {
class MemorySaverBubbleController;
} // namespace memory_saver
namespace tab_groups {
class SessionServiceTabGroupSyncObserver;
class SharedTabGroupFeedbackController;
class MostRecentSharedTabUpdateStore;
} // namespace tab_groups
namespace send_tab_to_self {
class SendTabToSelfToolbarBubbleController;
} // namespace send_tab_to_self
// This class owns the core controllers for features that are scoped to a given
// browser window on desktop. It can be subclassed by tests to perform
// dependency injection.
class BrowserWindowFeatures {
public:
static std::unique_ptr<BrowserWindowFeatures> CreateBrowserWindowFeatures();
virtual ~BrowserWindowFeatures();
BrowserWindowFeatures(const BrowserWindowFeatures&) = delete;
BrowserWindowFeatures& operator=(const BrowserWindowFeatures&) = delete;
// Call this method to stub out BrowserWindowFeatures for tests.
using BrowserWindowFeaturesFactory =
base::RepeatingCallback<std::unique_ptr<BrowserWindowFeatures>()>;
static void ReplaceBrowserWindowFeaturesForTesting(
BrowserWindowFeaturesFactory factory);
// Called exactly once to initialize features. This is called prior to
// instantiating BrowserView, to allow the view hierarchy to depend on state
// in this class.
void Init(BrowserWindowInterface* browser);
// Called exactly once to initialize features that depend on the window object
// being created.
void InitPostWindowConstruction(Browser* browser);
// Called exactly once to initialize features that depend on the view
// hierarchy in BrowserView.
void InitPostBrowserViewConstruction(BrowserView* browser_view);
// Called exactly once to tear down state that depends on BrowserView.
void TearDownPreBrowserViewDestruction();
// Public accessors for features:
commerce::ProductSpecificationsEntryPointController*
product_specifications_entry_point_controller() {
return product_specifications_entry_point_controller_.get();
}
extensions::Mv2DisabledDialogController*
mv2_disabled_dialog_controller_for_testing() {
return mv2_disabled_dialog_controller_.get();
}
ChromeLabsCoordinator* chrome_labs_coordinator() {
return chrome_labs_coordinator_.get();
}
media_router::CastBrowserController* cast_browser_controller() {
return cast_browser_controller_.get();
}
HistorySidePanelCoordinator* history_side_panel_coordinator() {
return history_side_panel_coordinator_.get();
}
BookmarksSidePanelCoordinator* bookmarks_side_panel_coordinator() {
return bookmarks_side_panel_coordinator_.get();
}
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
PdfInfoBarController* pdf_infobar_controller() {
return pdf_infobar_controller_.get();
}
#endif
// TODO(crbug.com/346158959): For historical reasons, side_panel_ui is an
// abstract base class that contains some, but not all of the public interface
// of SidePanelCoordinator. One of the accessors side_panel_ui() or
// side_panel_coordinator() should be removed. For consistency with the rest
// of this class, we use lowercase_with_underscores even though the
// implementation is not inlined.
SidePanelUI* side_panel_ui();
SidePanelCoordinator* side_panel_coordinator() {
return side_panel_coordinator_.get();
}
lens::LensOverlayEntryPointController* lens_overlay_entry_point_controller() {
return lens_overlay_entry_point_controller_.get();
}
lens::LensRegionSearchController* lens_region_search_controller() {
return lens_region_search_controller_.get();
}
tabs::TabDeclutterController* tab_declutter_controller() {
return tab_declutter_controller_.get();
}
tabs::GlicNudgeController* glic_nudge_controller() {
return glic_nudge_controller_.get();
}
TabStripModel* tab_strip_model() { return tab_strip_model_; }
// Returns a pointer to the ToastController for the browser window. This can
// return nullptr for non-normal browser windows because toasts are not
// supported for those cases.
ToastController* toast_controller();
// Returns a pointer to the ToastService for the browser window. This can
// return nullptr for non-normal browser windows because toasts are not
// supported for those cases.
ToastService* toast_service() { return toast_service_.get(); }
send_tab_to_self::SendTabToSelfToolbarBubbleController*
send_tab_to_self_toolbar_bubble_controller() {
return send_tab_to_self_toolbar_bubble_controller_.get();
}
extensions::ExtensionSidePanelManager* extension_side_panel_manager() {
return extension_side_panel_manager_.get();
}
DownloadToolbarUIController* download_toolbar_ui_controller() {
return download_toolbar_ui_controller_.get();
}
tab_groups::MostRecentSharedTabUpdateStore*
most_recent_shared_tab_update_store() {
return most_recent_shared_tab_update_store_.get();
}
memory_saver::MemorySaverBubbleController* memory_saver_bubble_controller() {
return memory_saver_bubble_controller_.get();
}
tab_groups::SharedTabGroupFeedbackController*
shared_tab_group_feedback_controller() {
return shared_tab_group_feedback_controller_.get();
}
TranslateBubbleController* translate_bubble_controller() {
return translate_bubble_controller_.get();
}
TabSearchToolbarButtonController* tab_search_toolbar_button_controller() {
return tab_search_toolbar_button_controller_.get();
}
CookieControlsBubbleCoordinator* cookie_controls_bubble_coordinator() {
return cookie_controls_bubble_coordinator_.get();
}
TabMenuModelDelegate* tab_menu_model_delegate() {
return tab_menu_model_delegate_.get();
}
// Only fetch the tab_strip_service to register a pending receiver.
TabStripServiceRegister* tab_strip_service() {
return tab_strip_service_.get();
}
protected:
BrowserWindowFeatures();
// Override these methods to stub out individual feature controllers for
// testing. e.g.
// virtual std::unique_ptr<FooFeature> CreateFooFeature();
private:
// Features that are per-browser window will each have a controller. e.g.
// std::unique_ptr<FooFeature> foo_feature_;
std::unique_ptr<BrowserInstantController> instant_controller_;
std::unique_ptr<send_tab_to_self::SendTabToSelfToolbarBubbleController>
send_tab_to_self_toolbar_bubble_controller_;
std::unique_ptr<ChromeLabsCoordinator> chrome_labs_coordinator_;
std::unique_ptr<commerce::ProductSpecificationsEntryPointController>
product_specifications_entry_point_controller_;
std::unique_ptr<lens::LensOverlayEntryPointController>
lens_overlay_entry_point_controller_;
std::unique_ptr<lens::LensRegionSearchController>
lens_region_search_controller_;
std::unique_ptr<extensions::Mv2DisabledDialogController>
mv2_disabled_dialog_controller_;
std::unique_ptr<tabs::TabDeclutterController> tab_declutter_controller_;
std::unique_ptr<MemorySaverOptInIPHController>
memory_saver_opt_in_iph_controller_;
std::unique_ptr<HistorySidePanelCoordinator> history_side_panel_coordinator_;
std::unique_ptr<BookmarksSidePanelCoordinator>
bookmarks_side_panel_coordinator_;
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
std::unique_ptr<PdfInfoBarController> pdf_infobar_controller_;
#endif
std::unique_ptr<SidePanelCoordinator> side_panel_coordinator_;
std::unique_ptr<tab_groups::SessionServiceTabGroupSyncObserver>
session_service_tab_group_sync_observer_;
raw_ptr<TabStripModel> tab_strip_model_;
std::unique_ptr<ToastService> toast_service_;
// The window-scoped extension side-panel manager. There is a separate
// tab-scoped extension side-panel manager.
std::unique_ptr<extensions::ExtensionSidePanelManager>
extension_side_panel_manager_;
std::unique_ptr<media_router::CastBrowserController> cast_browser_controller_;
std::unique_ptr<DownloadToolbarUIController> download_toolbar_ui_controller_;
std::unique_ptr<tabs::GlicNudgeController> glic_nudge_controller_;
#if BUILDFLAG(ENABLE_GLIC)
std::unique_ptr<glic::GlicButtonController> glic_button_controller_;
std::unique_ptr<glic::GlicIphController> glic_iph_controller_;
#endif
std::unique_ptr<tab_groups::MostRecentSharedTabUpdateStore>
most_recent_shared_tab_update_store_;
std::unique_ptr<memory_saver::MemorySaverBubbleController>
memory_saver_bubble_controller_;
std::unique_ptr<tab_groups::SharedTabGroupFeedbackController>
shared_tab_group_feedback_controller_;
std::unique_ptr<TranslateBubbleController> translate_bubble_controller_;
std::unique_ptr<TabSearchToolbarButtonController>
tab_search_toolbar_button_controller_;
std::unique_ptr<CookieControlsBubbleCoordinator>
cookie_controls_bubble_coordinator_;
std::unique_ptr<TabMenuModelDelegate> tab_menu_model_delegate_;
// This is an experimental API that interacts with the TabStripModel.
std::unique_ptr<TabStripServiceRegister> tab_strip_service_;
};
#endif // CHROME_BROWSER_UI_BROWSER_WINDOW_PUBLIC_BROWSER_WINDOW_FEATURES_H_