// Copyright 2013 The Chromium Authors. All rights reserved. // 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_GENERATED_CREDIT_CARD_BUBBLE_CONTROLLER_H_ #define CHROME_BROWSER_UI_AUTOFILL_GENERATED_CREDIT_CARD_BUBBLE_CONTROLLER_H_ #include <vector> #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "ui/gfx/image/image.h" #include "ui/gfx/range/range.h" namespace content { class WebContents; } namespace user_prefs { class PrefRegistrySyncable; } namespace autofill { class GeneratedCreditCardBubbleView; // A simple struct of text highlighting range information. If |is_link| is true // this portion of the text should be clickable (and trigger |OnLinkClicked()|). // If |is_link| is false, the text denoted by |range| should be bolded. struct TextRange { // The range of text this TextRange applies to (start and end). gfx::Range range; // Whether this text range should be styled like a link (e.g. clickable). bool is_link; // An equality operator for testing. bool operator==(const TextRange& other) const; }; //////////////////////////////////////////////////////////////////////////////// // // GeneratedCreditCardBubbleController // // A class to control showing and hiding a bubble after a credit card is // generated. // //////////////////////////////////////////////////////////////////////////////// class GeneratedCreditCardBubbleController : public content::WebContentsObserver, public content::WebContentsUserData<GeneratedCreditCardBubbleController> { public: virtual ~GeneratedCreditCardBubbleController(); // Registers preferences this class cares about. static void RegisterUserPrefs(user_prefs::PrefRegistrySyncable* registry); // Show a bubble to educate the user about generated (fronting) cards and how // they are used to bill their original (backing) card. static void Show(content::WebContents* contents, const base::string16& fronting_card_name, const base::string16& backing_card_name); // content::WebContentsObserver: virtual void DidNavigateMainFrame( const content::LoadCommittedDetails& details, const content::FrameNavigateParams& params) OVERRIDE; // Returns whether |bubble_| is currently in the process of hiding. bool IsHiding() const; // Returns the image that should be shown as an icon in the omnibox. gfx::Image AnchorIcon() const; // The title of the bubble. const base::string16& TitleText() const; // Text in the contents of the bubble. const base::string16& ContentsText() const; // Ranges of text styles in the bubble's main content. const std::vector<TextRange>& ContentsTextRanges() const; // Called when the anchor for this bubble is clicked. Shows a new bubble. void OnAnchorClicked(); // Called when the link at the bottom of the bubble is clicked. Opens and // navigates a new tab to an informational page and hides the bubble. void OnLinkClicked(); // The web contents that successfully submitted the Autofill dialog (causing // this bubble to show). content::WebContents* web_contents() { return web_contents_; } const content::WebContents* web_contents() const { return web_contents_; } protected: // Creates a bubble connected to |web_contents|. explicit GeneratedCreditCardBubbleController(content::WebContents* contents); // Returns a base::WeakPtr that references |this|. Exposed for testing. base::WeakPtr<GeneratedCreditCardBubbleController> GetWeakPtr(); // Creates and returns an Autofill credit card bubble. Exposed for testing. virtual base::WeakPtr<GeneratedCreditCardBubbleView> CreateBubble(); // Returns a weak reference to |bubble_|. May be invalid/NULL. virtual base::WeakPtr<GeneratedCreditCardBubbleView> bubble(); // Returns whether the bubble can currently show itself. virtual bool CanShow() const; // Whether the generated card bubble should be shown initially when showing // the anchor icon. This does not affect whether the generated card's icon // will show in the omnibox. bool ShouldDisplayBubbleInitially() const; // Exposed for testing. base::string16 fronting_card_name() const { return fronting_card_name_; } base::string16 backing_card_name() const { return backing_card_name_; } // Generates the correct bubble text and text highlighting ranges and shows a // bubble to educate the user about generated (fronting) cards and how they // are used to bill their original (backing) card. Exposed for testing. virtual void SetupAndShow(const base::string16& fronting_card_name, const base::string16& backing_card_name); private: friend class content::WebContentsUserData<GeneratedCreditCardBubbleController>; // An internal helper to show the bubble. void Show(bool was_anchor_click); // Updates the omnibox icon that |bubble_| is anchored to. void UpdateAnchor(); // Hides |bubble_| (if it exists and isn't already hiding). void Hide(); // The web contents associated with this bubble. content::WebContents* const web_contents_; // The generated credit card number and associated backing card. base::string16 fronting_card_name_; base::string16 backing_card_name_; // The title text of the bubble. const base::string16 title_text_; // Strings and ranges generated based on |backing_card_name_| and // |fronting_card_name_|. base::string16 contents_text_; std::vector<TextRange> contents_text_ranges_; // A bubble view that's created by calling either |Show*()| method; owned by // the native widget/hierarchy, not this class (though this class must outlive // |bubble_|). NULL in many cases. base::WeakPtr<GeneratedCreditCardBubbleView> bubble_; // Whether the anchor should currently be showing. bool should_show_anchor_; // A weak pointer factory for |Create()|. base::WeakPtrFactory<GeneratedCreditCardBubbleController> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(GeneratedCreditCardBubbleController); }; } // namespace autofill #endif // CHROME_BROWSER_UI_AUTOFILL_GENERATED_CREDIT_CARD_BUBBLE_CONTROLLER_H_