| // 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_ |