blob: 7dd98c86def6a00dc7e76bf7bb65921efb3ce78f [file] [log] [blame]
// Copyright 2021 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_AUTOFILL_AUTOFILL_BUBBLE_CONTROLLER_BASE_H_
#define CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_BUBBLE_CONTROLLER_BASE_H_
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/autofill/bubble_controller_base.h"
#include "chrome/browser/ui/page_action/page_action_icon_type.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
namespace content {
class WebContents;
}
namespace autofill {
class AutofillBubbleBase;
// Enum for the current showing state of the bubble.
// TODO(crbug.com/445901842): Investigate if this can be removed.
enum class BubbleState {
// The bubble and the omnibox icon should be hidden.
kHidden = 0,
// Only the omnibox icon should be visible.
kShowingIcon = 1,
// The bubble and the omnibox icon should be both visible.
kShowingIconAndBubble = 2,
};
// Interface that exposes controller functionality to all autofill bubbles.
class AutofillBubbleControllerBase : public BubbleControllerBase,
public content::WebContentsObserver {
public:
explicit AutofillBubbleControllerBase(content::WebContents* web_contents);
~AutofillBubbleControllerBase() override;
// Calls the bubble manager to show the bubble if bubble manager is enabled.
// Otherwise just shows the bubble.
// `force_show` indicates to the bubble manager to show this bubble
// irrespective of its priority.
void QueueOrShowBubble(bool force_show = false);
// BubbleControllerBase:
void ShowBubble() override;
void HideBubble() override;
bool IsShowingBubble() const override;
bool IsMouseHovered() const override;
// content::WebContentsObserver:
void OnVisibilityChanged(content::Visibility visibility) override;
void WebContentsDestroyed() override;
protected:
virtual std::optional<PageActionIconType> GetPageActionIconType() = 0;
// Subclasses should implement this method to actually show the bubble and
// potentially log metrics.
virtual void DoShowBubble() = 0;
virtual void UpdatePageActionIcon();
// If the BubbleManager feature is enabled, this returns `false` if a bubble
// is already queued to be shown.
[[nodiscard]] bool MaySetUpBubble();
// Setter for `bubble_view`.
void SetBubbleView(AutofillBubbleBase& bubble_view);
// Resets the `bubble_view` and informs the bubble manager about it.
void ResetBubbleViewAndInformBubbleManager();
AutofillBubbleBase* bubble_view() const { return bubble_view_; }
private:
// Weak reference. Will be nullptr if no bubble is currently shown.
raw_ptr<AutofillBubbleBase> bubble_view_ = nullptr;
};
} // namespace autofill
#endif // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_BUBBLE_CONTROLLER_BASE_H_