1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file. 4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef CHROME_BROWSER_UI_AUTOFILL_GENERATED_CREDIT_CARD_BUBBLE_CONTROLLER_H_ 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define CHROME_BROWSER_UI_AUTOFILL_GENERATED_CREDIT_CARD_BUBBLE_CONTROLLER_H_ 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <vector> 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/basictypes.h" 11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/compiler_specific.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/memory/weak_ptr.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string16.h" 14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/web_contents_observer.h" 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/web_contents_user_data.h" 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/image/image.h" 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/range/range.h" 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace content { 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass WebContents; 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace user_prefs { 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass PrefRegistrySyncable; 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill { 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass GeneratedCreditCardBubbleView; 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// A simple struct of text highlighting range information. If |is_link| is true 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// this portion of the text should be clickable (and trigger |OnLinkClicked()|). 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// If |is_link| is false, the text denoted by |range| should be bolded. 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstruct TextRange { 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The range of text this TextRange applies to (start and end). 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Range range; 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Whether this text range should be styled like a link (e.g. clickable). 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool is_link; 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // An equality operator for testing. 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool operator==(const TextRange& other) const; 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// GeneratedCreditCardBubbleController 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// A class to control showing and hiding a bubble after a credit card is 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// generated. 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass GeneratedCreditCardBubbleController 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : public content::WebContentsObserver, 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public content::WebContentsUserData<GeneratedCreditCardBubbleController> { 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual ~GeneratedCreditCardBubbleController(); 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Registers preferences this class cares about. 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static void RegisterUserPrefs(user_prefs::PrefRegistrySyncable* registry); 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Show a bubble to educate the user about generated (fronting) cards and how 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // they are used to bill their original (backing) card. 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static void Show(content::WebContents* contents, 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::string16& fronting_card_name, 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::string16& backing_card_name); 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // content::WebContentsObserver: 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void DidNavigateMainFrame( 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const content::LoadCommittedDetails& details, 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const content::FrameNavigateParams& params) OVERRIDE; 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Returns whether |bubble_| is currently in the process of hiding. 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool IsHiding() const; 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Returns the image that should be shown as an icon in the omnibox. 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::Image AnchorIcon() const; 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The title of the bubble. 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& TitleText() const; 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Text in the contents of the bubble. 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& ContentsText() const; 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Ranges of text styles in the bubble's main content. 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::vector<TextRange>& ContentsTextRanges() const; 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Called when the anchor for this bubble is clicked. Shows a new bubble. 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void OnAnchorClicked(); 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Called when the link at the bottom of the bubble is clicked. Opens and 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // navigates a new tab to an informational page and hides the bubble. 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void OnLinkClicked(); 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The web contents that successfully submitted the Autofill dialog (causing 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // this bubble to show). 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* web_contents() { return web_contents_; } 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const content::WebContents* web_contents() const { return web_contents_; } 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch protected: 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Creates a bubble connected to |web_contents|. 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch explicit GeneratedCreditCardBubbleController(content::WebContents* contents); 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Returns a base::WeakPtr that references |this|. Exposed for testing. 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::WeakPtr<GeneratedCreditCardBubbleController> GetWeakPtr(); 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Creates and returns an Autofill credit card bubble. Exposed for testing. 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual base::WeakPtr<GeneratedCreditCardBubbleView> CreateBubble(); 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Returns a weak reference to |bubble_|. May be invalid/NULL. 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual base::WeakPtr<GeneratedCreditCardBubbleView> bubble(); 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Returns whether the bubble can currently show itself. 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual bool CanShow() const; 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Whether the generated card bubble should be shown initially when showing 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // the anchor icon. This does not affect whether the generated card's icon 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // will show in the omnibox. 117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool ShouldDisplayBubbleInitially() const; 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Exposed for testing. 1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::string16 fronting_card_name() const { return fronting_card_name_; } 1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::string16 backing_card_name() const { return backing_card_name_; } 1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Generates the correct bubble text and text highlighting ranges and shows a 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // bubble to educate the user about generated (fronting) cards and how they 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // are used to bill their original (backing) card. Exposed for testing. 1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void SetupAndShow(const base::string16& fronting_card_name, 1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const base::string16& backing_card_name); 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private: 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch friend class 131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContentsUserData<GeneratedCreditCardBubbleController>; 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // An internal helper to show the bubble. 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void Show(bool was_anchor_click); 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Updates the omnibox icon that |bubble_| is anchored to. 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void UpdateAnchor(); 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Hides |bubble_| (if it exists and isn't already hiding). 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void Hide(); 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The web contents associated with this bubble. 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* const web_contents_; 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The generated credit card number and associated backing card. 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::string16 fronting_card_name_; 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::string16 backing_card_name_; 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The title text of the bubble. 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16 title_text_; 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Strings and ranges generated based on |backing_card_name_| and 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // |fronting_card_name_|. 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::string16 contents_text_; 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::vector<TextRange> contents_text_ranges_; 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // A bubble view that's created by calling either |Show*()| method; owned by 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // the native widget/hierarchy, not this class (though this class must outlive 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // |bubble_|). NULL in many cases. 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::WeakPtr<GeneratedCreditCardBubbleView> bubble_; 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Whether the anchor should currently be showing. 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool should_show_anchor_; 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // A weak pointer factory for |Create()|. 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::WeakPtrFactory<GeneratedCreditCardBubbleController> weak_ptr_factory_; 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DISALLOW_COPY_AND_ASSIGN(GeneratedCreditCardBubbleController); 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace autofill 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif // CHROME_BROWSER_UI_AUTOFILL_GENERATED_CREDIT_CARD_BUBBLE_CONTROLLER_H_ 174