blob: 42e6218356a3c65908ce8141daca3b862ce48a73 [file] [log] [blame]
// Copyright 2025 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_WEBUI_BROWSER_WEBUI_BROWSER_WINDOW_H_
#define CHROME_BROWSER_UI_WEBUI_BROWSER_WEBUI_BROWSER_WINDOW_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/exclusive_access/exclusive_access_context.h"
#include "chrome/browser/ui/views/side_panel/side_panel_entry_key.h"
#include "content/public/browser/web_contents.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/color/color_provider_key.h"
#include "ui/color/color_provider_source.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
namespace ui {
class TrackedElement;
} // namespace ui
namespace views {
class NativeWidget;
class WebView;
class Widget;
} // namespace views
class Browser;
class WebUIBrowserExtensionsContainer;
class WebUIBrowserModalDialogHost;
class WebUIBrowserSidePanelUI;
class WebUIBrowserUI;
class WebUIBrowserWebContentsDelegate;
class WebUILocationBar;
// A BrowserWindow implementation that uses WebUI for its primary UI. It still
// uses views::Widget for windowing management.
class WebUIBrowserWindow : public BrowserWindow,
public ExclusiveAccessContext,
public ui::ColorProviderSource,
public ui::AcceleratorProvider,
public ui::AcceleratorTarget,
public views::WidgetObserver {
public:
explicit WebUIBrowserWindow(Browser* browser);
~WebUIBrowserWindow() override;
// Returns the containing browser window for a WebContents that hosts
// WebShell.
static WebUIBrowserWindow* FromWebShellWebContents(
content::WebContents* web_contents);
// Returns the WebUIBrowserWindow for a Browser. If browser does not use
// WebUIBrowserWindow, returns nullptr.
static WebUIBrowserWindow* FromBrowser(Browser* browser);
// Returns the WebUIBrowserWindow for the given `window`.
static WebUIBrowserWindow* FromNativeWindow(gfx::NativeWindow window);
// BrowserWindow:
gfx::NativeWindow GetNativeWindow() const override;
bool IsOnCurrentWorkspace() const override;
bool IsVisibleOnScreen() const override;
void SetTopControlsShownRatio(content::WebContents* web_contents,
float ratio) override;
bool DoBrowserControlsShrinkRendererSize(
const content::WebContents* contents) const override;
ui::NativeTheme* GetNativeTheme() override;
const ui::ThemeProvider* GetThemeProvider() const override;
int GetTopControlsHeight() const override;
void SetTopControlsGestureScrollInProgress(bool in_progress) override;
std::vector<StatusBubble*> GetStatusBubbles() override;
void UpdateTitleBar() override;
void BookmarkBarStateChanged(
BookmarkBar::AnimateChangeType change_type) override;
void TemporarilyShowBookmarkBar(base::TimeDelta duration) override;
void UpdateDevTools(content::WebContents* inspected_web_contents) override;
bool CanDockDevTools() const override;
void UpdateLoadingAnimations(bool is_visible) override;
void SetStarredState(bool is_starred) override;
bool IsTabModalPopupDeprecated() const override;
void SetIsTabModalPopupDeprecated(
bool is_tab_modal_popup_deprecated) override;
void OnActiveTabChanged(content::WebContents* old_contents,
content::WebContents* new_contents,
int index,
int reason) override;
void OnTabDetached(content::WebContents* contents, bool was_active) override;
void ZoomChangedForActiveTab(bool can_show_bubble) override;
bool ShouldHideUIForFullscreen() const override;
bool IsFullscreenBubbleVisible() const override;
bool IsForceFullscreen() const override;
void SetForceFullscreen(bool force_fullscreen) override;
gfx::Size GetContentsSize() const override;
void SetContentsSize(const gfx::Size& size) override;
void UpdatePageActionIcon(PageActionIconType type) override;
autofill::AutofillBubbleHandler* GetAutofillBubbleHandler() override;
void ExecutePageActionIconForTesting(PageActionIconType type) override;
LocationBar* GetLocationBar() const override;
void SetFocusToLocationBar(bool is_user_initiated) override;
void UpdateReloadStopState(bool is_loading, bool force) override;
void UpdateToolbar(content::WebContents* contents) override;
bool UpdateToolbarSecurityState() override;
void UpdateCustomTabBarVisibility(bool visible, bool animate) override;
void SetDevToolsScrimVisibility(bool visible) override;
void ResetToolbarTabState(content::WebContents* contents) override;
void FocusToolbar() override;
ExtensionsContainer* GetExtensionsContainer() override;
void ToolbarSizeChanged(bool is_animating) override;
void TabDraggingStatusChanged(bool is_dragging) override;
void LinkOpeningFromGesture(WindowOpenDisposition disposition) override;
void FocusAppMenu() override;
void FocusBookmarksToolbar() override;
void FocusInactivePopupForAccessibility() override;
void RotatePaneFocus(bool forwards) override;
void FocusWebContentsPane() override;
bool IsBookmarkBarVisible() const override;
bool IsBookmarkBarAnimating() const override;
bool IsTabStripEditable() const override;
void SetTabStripNotEditableForTesting() override;
bool IsToolbarVisible() const override;
bool IsToolbarShowing() const override;
bool IsLocationBarVisible() const override;
SharingDialog* ShowSharingDialog(content::WebContents* contents,
SharingDialogData data) override;
void ShowUpdateChromeDialog() override;
void ShowIntentPickerBubble(
std::vector<apps::IntentPickerAppInfo> app_info,
bool show_stay_in_chrome,
bool show_remember_selection,
apps::IntentPickerBubbleType bubble_type,
const std::optional<url::Origin>& initiating_origin,
IntentPickerResponse callback) override;
void ShowBookmarkBubble(const GURL& url, bool already_bookmarked) override;
sharing_hub::ScreenshotCapturedBubble* ShowScreenshotCapturedBubble(
content::WebContents* contents,
const gfx::Image& image) override;
qrcode_generator::QRCodeGeneratorBubbleView* ShowQRCodeGeneratorBubble(
content::WebContents* contents,
const GURL& url,
bool show_back_button) override;
send_tab_to_self::SendTabToSelfBubbleView*
ShowSendTabToSelfDevicePickerBubble(content::WebContents* contents) override;
send_tab_to_self::SendTabToSelfBubbleView* ShowSendTabToSelfPromoBubble(
content::WebContents* contents,
bool show_signin_button) override;
#if BUILDFLAG(IS_CHROMEOS)
views::Button* GetSharingHubIconButton() override;
void ToggleMultitaskMenu() const override;
#else
sharing_hub::SharingHubBubbleView* ShowSharingHubBubble(
share::ShareAttempt attempt) override;
#endif // BUILDFLAG(IS_CHROMEOS)
ShowTranslateBubbleResult ShowTranslateBubble(
content::WebContents* contents,
translate::TranslateStep step,
const std::string& source_language,
const std::string& target_language,
translate::TranslateErrors error_type,
bool is_user_gesture) override;
void StartPartialTranslate(const std::string& source_language,
const std::string& target_language,
const std::u16string& text_selection) override;
void ShowOneClickSigninConfirmation(
const std::u16string& email,
base::OnceCallback<void(bool)> confirmed_callback) override;
views::View* GetTopContainer() override;
views::View* GetLensOverlayView() override;
DownloadBubbleUIController* GetDownloadBubbleUIController() override;
void ConfirmBrowserCloseWithPendingDownloads(
int download_count,
Browser::DownloadCloseType dialog_type,
base::OnceCallback<void(bool)> callback) override;
void UserChangedTheme(BrowserThemeChangeType theme_change_type) override;
void ShowAppMenu() override;
void PreHandleDragUpdate(const content::DropData& drop_data,
const gfx::PointF& point) override;
void PreHandleDragExit() override;
void HandleDragEnded() override;
content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
const input::NativeWebKeyboardEvent& event) override;
bool HandleKeyboardEvent(const input::NativeWebKeyboardEvent& event) override;
std::unique_ptr<FindBar> CreateFindBar() override;
web_modal::WebContentsModalDialogHost* GetWebContentsModalDialogHost()
override;
web_modal::WebContentsModalDialogHost* GetWebContentsModalDialogHostFor(
content::WebContents* web_contents) override;
void ShowAvatarBubbleFromAvatarButton(bool is_source_accelerator) override;
void MaybeShowProfileSwitchIPH() override;
void MaybeShowSupervisedUserProfileSignInIPH() override;
void ShowHatsDialog(
const std::string& site_id,
const std::optional<std::string>& hats_histogram_name,
const std::optional<uint64_t> hats_survey_ukm_id,
base::OnceClosure success_callback,
base::OnceClosure failure_callback,
const SurveyBitsData& product_specific_bits_data,
const SurveyStringData& product_specific_string_data) override;
ExclusiveAccessContext* GetExclusiveAccessContext() override;
std::string GetWorkspace() const override;
bool IsVisibleOnAllWorkspaces() const override;
void ShowEmojiPanel() override;
std::unique_ptr<content::EyeDropper> OpenEyeDropper(
content::RenderFrameHost* frame,
content::EyeDropperListener* listener) override;
void ShowCaretBrowsingDialog() override;
void CreateTabSearchBubble(
tab_search::mojom::TabSearchSection section,
tab_search::mojom::TabOrganizationFeature organization_feature) override;
void CloseTabSearchBubble() override;
void ShowIncognitoClearBrowsingDataDialog() override;
void ShowIncognitoHistoryDisclaimerDialog() override;
bool IsBorderlessModeEnabled() const override;
void OnWebApiWindowResizableChanged() override;
bool GetCanResize() override;
ui::mojom::WindowShowState GetWindowShowState() const override;
void ShowChromeLabs() override;
views::WebView* GetContentsWebView() override;
BrowserView* AsBrowserView() override;
// ui::BaseWindow:
void Show() override;
void ShowInactive() override;
void Hide() override;
bool IsVisible() const override;
void SetBounds(const gfx::Rect& bounds) override;
void Close() override;
void Activate() override;
void Deactivate() override;
bool IsActive() const override;
gfx::Rect GetBounds() const override;
bool IsMaximized() const override;
bool IsMinimized() const override;
bool IsFullscreen() const override; // Also in ExclusiveAccessContext.
gfx::Rect GetRestoredBounds() const override;
ui::mojom::WindowShowState GetRestoredState() const override;
void Maximize() override;
void Minimize() override;
void Restore() override;
void FlashFrame(bool flash) override;
ui::ZOrderLevel GetZOrderLevel() const override;
void SetZOrderLevel(ui::ZOrderLevel order) override;
// ui::ColorProviderSource:
const ui::ColorProvider* GetColorProvider() const override;
ui::ColorProviderKey GetColorProviderKey() const override;
ui::RendererColorMap GetRendererColorMap(
ui::ColorProviderKey::ColorMode color_mode,
ui::ColorProviderKey::ForcedColors forced_colors) const override;
// ExclusiveAccessContext:
Profile* GetProfile() override;
void EnterFullscreen(const url::Origin& origin,
ExclusiveAccessBubbleType bubble_type,
FullscreenTabParams fullscreen_tab_params) override;
void ExitFullscreen() override;
void UpdateExclusiveAccessBubble(
const ExclusiveAccessBubbleParams& params,
ExclusiveAccessBubbleHideCallback first_hide_callback) override;
bool IsExclusiveAccessBubbleDisplayed() const override;
void OnExclusiveAccessUserInput() override;
content::WebContents* GetWebContentsForExclusiveAccess() override;
bool CanUserEnterFullscreen() const override;
bool CanUserExitFullscreen() const override;
// ui::AcceleratorProvider:
bool GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) const override;
// views::WidgetObserver:
void OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& new_bounds) override;
void ShowSidePanel(SidePanelEntryKey side_panel_entry_key);
void CloseSidePanel();
WebUIBrowserUI* GetWebUIBrowserUI() const;
WebUIBrowserSidePanelUI* GetWebUIBrowserSidePanelUI();
Browser* browser() { return browser_.get(); }
views::Widget* widget() { return widget_.get(); }
gfx::Rect GetContentsBoundsInScreen() const;
ui::TrackedElement* GetExtensionsMenuButtonAnchor() const;
protected:
// BrowserWindow:
void DeleteBrowserWindow() final;
private:
class WidgetDelegate;
// Creates and returns the native widget.
// Note that this class uses CLIENT_OWNS_WIDGET ownership model whereby
// the NativeWidget owns itself (i.e. NativeWidget*::WindowDestroyed() frees
// itself) so this method returns a pointer rather than a unique_ptr.
views::NativeWidget* CreateNativeWidget();
// ui::AcceleratorTarget:
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
bool CanHandleAccelerators() const override;
// Retrieves the Chrome command ID associated with |accelerator|. The function
// returns false if |accelerator| is unknown. Otherwise |command_id| will be
// set to the Chrome command ID defined in //chrome/app/chrome_command_ids.h.
bool FindCommandIdForAccelerator(const ui::Accelerator& accelerator,
int* command_id) const;
// Load accelerators into |accelerator_table_| and |accelerator_manager_|.
void LoadAccelerators();
// Returns the appropriate ThemeInitializerSupplier based on the window type.
ui::ColorProviderKey::ThemeInitializerSupplier* GetThemeInitializerSupplier()
const;
void OnWindowCloseRequested(views::Widget::ClosedReason close_reason);
const raw_ptr<Browser> browser_;
std::unique_ptr<WebUIBrowserWebContentsDelegate> web_contents_delegate_;
std::unique_ptr<WidgetDelegate> widget_delegate_;
std::unique_ptr<views::Widget> widget_;
raw_ptr<views::WebView> web_view_ = nullptr;
std::unique_ptr<WebUILocationBar> location_bar_;
// A mapping between accelerators and Chrome command IDs as defined in
// //chrome/app/chrome_command_ids.h.
std::map<ui::Accelerator, int> accelerator_table_;
ui::AcceleratorManager accelerator_manager_;
std::unique_ptr<WebUIBrowserModalDialogHost> modal_dialog_host_;
std::unique_ptr<WebUIBrowserExtensionsContainer> extensions_container_;
};
#endif // CHROME_BROWSER_UI_WEBUI_BROWSER_WEBUI_BROWSER_WINDOW_H_