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