blob: 1bdbf20adca661d690efb381b289c5b2e08d4e23 [file] [log] [blame]
// Copyright 2012 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_TEST_BASE_TEST_BROWSER_WINDOW_H_
#define CHROME_TEST_BASE_TEST_BROWSER_WINDOW_H_
#include <memory>
#include <string>
#include <vector>
#include "base/feature_list.h"
#include "base/functional/callback_helpers.h"
#include "base/scoped_observation.h"
#include "build/build_config.h"
#include "chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/location_bar/location_bar.h"
#include "chrome/browser/ui/translate/partial_translate_bubble_model.h"
#include "chrome/browser/ui/webui/tab_search/tab_search.mojom.h"
#include "chrome/common/buildflags.h"
#include "components/user_education/common/new_badge/new_badge_controller.h"
#include "content/public/browser/web_contents.h"
#include "ui/base/mojom/window_show_state.mojom-forward.h"
#if !BUILDFLAG(IS_ANDROID)
#include "chrome/browser/apps/link_capturing/intent_picker_info.h"
#endif // !BUILDFLAG(IS_ANDROID)
class LocationBarTesting;
class OmniboxView;
namespace qrcode_generator {
class QRCodeGeneratorBubbleView;
} // namespace qrcode_generator
namespace send_tab_to_self {
class SendTabToSelfBubbleView;
} // namespace send_tab_to_self
namespace sharing_hub {
class SharingHubBubbleView;
} // namespace sharing_hub
// WARNING WARNING WARNING WARNING
// Do not use this class. See docs/chrome_browser_design_principles.md for
// details. Either write a browser test which provides both a "class Browser"
// and a "class BrowserView" (a subclass of "class BrowserWindow") or a unit
// test which should require neither.
//
// An implementation of BrowserWindow used for testing. TestBrowserWindow only
// contains a valid LocationBar, all other getters return NULL.
// However, some of them can be preset to a specific value.
// See BrowserWithTestWindowTest for an example of using this class.
class TestBrowserWindow : public BrowserWindow, public BrowserListObserver {
public:
TestBrowserWindow();
TestBrowserWindow(const TestBrowserWindow&) = delete;
TestBrowserWindow& operator=(const TestBrowserWindow&) = delete;
~TestBrowserWindow() override;
// BrowserWindow:
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;
void FlashFrame(bool flash) override {}
ui::ZOrderLevel GetZOrderLevel() const override;
void SetZOrderLevel(ui::ZOrderLevel order) override {}
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;
const ui::ColorProvider* GetColorProvider() 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 {}
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 {}
gfx::Rect GetRestoredBounds() const override;
ui::mojom::WindowShowState GetRestoredState() const override;
gfx::Rect GetBounds() const override;
gfx::Size GetContentsSize() const override;
void SetContentsSize(const gfx::Size& size) override;
bool IsMaximized() const override;
bool IsMinimized() const override;
void Maximize() override {}
void Minimize() override {}
void Restore() override {}
void OnWebApiWindowResizableChanged() override {}
bool GetCanResize() override;
ui::mojom::WindowShowState GetWindowShowState() const override;
bool ShouldHideUIForFullscreen() const override;
bool IsFullscreen() const override;
bool IsFullscreenBubbleVisible() const override;
bool IsForceFullscreen() const override;
void SetForceFullscreen(bool force_fullscreen) override {}
LocationBar* GetLocationBar() const override;
void UpdatePageActionIcon(PageActionIconType type) override {}
autofill::AutofillBubbleHandler* GetAutofillBubbleHandler() override;
void ExecutePageActionIconForTesting(PageActionIconType type) 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 {}
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;
bool IsBookmarkBarVisible() const override;
bool IsBookmarkBarAnimating() const override;
bool IsTabStripEditable() const override;
void SetTabStripNotEditableForTesting() override;
void SetIsTabStripEditable(bool is_editable);
bool IsToolbarVisible() const override;
bool IsLocationBarVisible() const override;
bool IsToolbarShowing() const override;
bool IsBorderlessModeEnabled() const override;
void ShowChromeLabs() override {}
BrowserView* AsBrowserView() override;
SharingDialog* ShowSharingDialog(content::WebContents* contents,
SharingDialogData data) override;
void ShowUpdateChromeDialog() override {}
void ShowBookmarkBubble(const GURL& url, bool already_bookmarked) override {}
qrcode_generator::QRCodeGeneratorBubbleView* ShowQRCodeGeneratorBubble(
content::WebContents* contents,
const GURL& url,
bool show_back_button) override;
#if !BUILDFLAG(IS_ANDROID)
sharing_hub::ScreenshotCapturedBubble* ShowScreenshotCapturedBubble(
content::WebContents* contents,
const gfx::Image& image) 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 {}
#endif // !define(OS_ANDROID)
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)
void ToggleMultitaskMenu() 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 {}
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 {}
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_keyboard) override {}
void MaybeShowProfileSwitchIPH() override {}
void MaybeShowSupervisedUserProfileSignInIPH() override {}
#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
BUILDFLAG(IS_LINUX)
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 {}
void ShowIncognitoClearBrowsingDataDialog() override {}
void ShowIncognitoHistoryDisclaimerDialog() override {}
#endif
ExclusiveAccessContext* GetExclusiveAccessContext() override;
std::string GetWorkspace() const override;
bool IsVisibleOnAllWorkspaces() const override;
void ShowEmojiPanel() override {}
void ShowCaretBrowsingDialog() override {}
std::unique_ptr<content::EyeDropper> OpenEyeDropper(
content::RenderFrameHost* frame,
content::EyeDropperListener* listener) override;
void SetNativeWindow(gfx::NativeWindow window);
void SetCloseCallback(base::OnceClosure close_callback);
void CreateTabSearchBubble(
tab_search::mojom::TabSearchSection section =
tab_search::mojom::TabSearchSection::kSearch,
tab_search::mojom::TabOrganizationFeature feature =
tab_search::mojom::TabOrganizationFeature::kNone) override {}
void CloseTabSearchBubble() override {}
bool IsTabModalPopupDeprecated() const override;
void SetIsTabModalPopupDeprecated(
bool is_tab_modal_popup_deprecated) override;
void set_workspace(std::string workspace) { workspace_ = workspace; }
void set_visible_on_all_workspaces(bool visible_on_all_workspaces) {
visible_on_all_workspaces_ = visible_on_all_workspaces;
}
void set_is_active(bool active) { is_active_ = active; }
void set_is_minimized(bool minimized) { is_minimized_ = minimized; }
bool IsClosed() const { return is_closed_; }
protected:
void DeleteBrowserWindow() final;
private:
class TestLocationBar : public LocationBar {
public:
TestLocationBar() : LocationBar(/*command_updater=*/nullptr) {}
TestLocationBar(const TestLocationBar&) = delete;
TestLocationBar& operator=(const TestLocationBar&) = delete;
~TestLocationBar() override = default;
// LocationBar:
void FocusLocation(bool select_all) override {}
void FocusSearch() override {}
void UpdateContentSettingsIcons() override {}
void SaveStateToContents(content::WebContents* contents) override {}
void Revert() override {}
OmniboxView* GetOmniboxView() override;
OmniboxController* GetOmniboxController() override;
LocationBarTesting* GetLocationBarForTesting() override;
LocationBarModel* GetLocationBarModel() override;
content::WebContents* GetWebContents() override;
std::optional<bubble_anchor_util::AnchorConfiguration> GetChipAnchor()
override;
void OnChanged() override {}
void OnPopupVisibilityChanged() override {}
void UpdateWithoutTabRestore() override {}
};
// BrowserListObserver:
void OnBrowserAdded(Browser* browser) override;
autofill::TestAutofillBubbleHandler autofill_bubble_handler_;
TestLocationBar location_bar_;
gfx::NativeWindow native_window_ = gfx::NativeWindow();
std::string workspace_;
bool visible_on_all_workspaces_ = false;
bool is_minimized_ = false;
bool is_active_ = false;
bool is_closed_ = false;
bool is_tab_strip_editable_ = true;
bool is_tab_modal_popup_deprecated_ = false;
base::ScopedObservation<BrowserList, BrowserListObserver>
browser_list_observer_{this};
raw_ptr<Browser> browser_;
base::OnceClosure close_callback_;
};
// Helper that handle the lifetime of TestBrowserWindow instances.
std::unique_ptr<Browser> CreateBrowserWithTestWindowForParams(
Browser::CreateParams params);
#endif // CHROME_TEST_BASE_TEST_BROWSER_WINDOW_H_