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#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h"
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <climits>
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/logging.h"
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/prefs/pref_service.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_split.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/utf_string_conversions.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/profiles/profile.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/autofill/chrome_autofill_client.h"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/generated_credit_card_bubble_view.h"
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/browser_finder.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/browser_navigator.h"
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/browser_window.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/location_bar.h"
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h"
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/pref_names.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_details.h"
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_entry.h"
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/web_contents.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h"
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "grit/theme_resources.h"
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/l10n/l10n_util.h"
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/resource/resource_bundle.h"
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochDEFINE_WEB_CONTENTS_USER_DATA_KEY(
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    autofill::GeneratedCreditCardBubbleController);
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill {
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace {
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic const int kMaxGeneratedCardTimesToShow = INT_MAX;
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic const base::char16 kRangeSeparator = '|';
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic const char kWalletGeneratedCardLearnMoreLink[] =
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "http://support.google.com/wallet/bin/answer.py?hl=en&answer=2740044";
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochGeneratedCreditCardBubbleController* GetOrCreate(content::WebContents* wc) {
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GeneratedCreditCardBubbleController::CreateForWebContents(wc);
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return GeneratedCreditCardBubbleController::FromWebContents(wc);
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool TextRange::operator==(const TextRange& other) const {
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return other.range == range && other.is_link == is_link;
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochGeneratedCreditCardBubbleController::GeneratedCreditCardBubbleController(
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* web_contents)
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : WebContentsObserver(web_contents),
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      web_contents_(web_contents),
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      title_text_(l10n_util::GetStringUTF16(
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          IDS_AUTOFILL_GENERATED_CREDIT_CARD_BUBBLE_TITLE)),
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      should_show_anchor_(true),
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      weak_ptr_factory_(this) {}
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochGeneratedCreditCardBubbleController::~GeneratedCreditCardBubbleController() {
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // In the case that the tab is closed, the controller can be deleted while
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // bubble is showing. Always calling |Hide()| ensures that the bubble closes.
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Hide();
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::RegisterUserPrefs(
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_prefs::PrefRegistrySyncable* registry) {
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  registry->RegisterIntegerPref(
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ::prefs::kAutofillGeneratedCardBubbleTimesShown,
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      0,
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::Show(
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& fronting_card_name,
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& backing_card_name) {
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetOrCreate(contents)->SetupAndShow(fronting_card_name, backing_card_name);
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::DidNavigateMainFrame(
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const content::LoadCommittedDetails& details,
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const content::FrameNavigateParams& params) {
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!details.entry)
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Don't destory the bubble due to reloads, form submits, or redirects right
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // after the dialog succeeds. Merchants often navigate to a confirmation page.
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::PageTransition transition = details.entry->GetTransitionType();
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (transition == ui::PAGE_TRANSITION_FORM_SUBMIT ||
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      transition == ui::PAGE_TRANSITION_RELOAD ||
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PageTransitionIsRedirect(transition)) {
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  should_show_anchor_ = false;
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UpdateAnchor();
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  web_contents()->RemoveUserData(UserDataKey());
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // |this| is now deleted.
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool GeneratedCreditCardBubbleController::IsHiding() const {
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return bubble_ && bubble_->IsHiding();
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochgfx::Image GeneratedCreditCardBubbleController::AnchorIcon() const {
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!should_show_anchor_)
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return gfx::Image();
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return ui::ResourceBundle::GetSharedInstance().GetImageNamed(IDR_WALLET_ICON);
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst base::string16& GeneratedCreditCardBubbleController::TitleText() const {
119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return title_text_;
120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst base::string16& GeneratedCreditCardBubbleController::ContentsText()
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const {
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return contents_text_;
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst std::vector<TextRange>& GeneratedCreditCardBubbleController::
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ContentsTextRanges() const {
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return contents_text_ranges_;
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::OnAnchorClicked() {
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Show(true);
134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::OnLinkClicked() {
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Open a new tab to the Online Wallet help link.
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  chrome::NavigateParams params(
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      chrome::FindBrowserWithWebContents(web_contents()),
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(kWalletGeneratedCardLearnMoreLink),
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PAGE_TRANSITION_AUTO_BOOKMARK);
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  params.disposition = NEW_FOREGROUND_TAB;
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  chrome::Navigate(&params);
144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Hide();
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<GeneratedCreditCardBubbleController>
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GeneratedCreditCardBubbleController::GetWeakPtr() {
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return weak_ptr_factory_.GetWeakPtr();
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<GeneratedCreditCardBubbleView>
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GeneratedCreditCardBubbleController::CreateBubble() {
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return GeneratedCreditCardBubbleView::Create(GetWeakPtr());
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<GeneratedCreditCardBubbleView>
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GeneratedCreditCardBubbleController::bubble() {
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return bubble_;
161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool GeneratedCreditCardBubbleController::CanShow() const {
164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return web_contents() == browser->tab_strip_model()->GetActiveWebContents();
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool GeneratedCreditCardBubbleController::ShouldDisplayBubbleInitially() const {
169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Profile* profile = Profile::FromBrowserContext(
170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      web_contents_->GetBrowserContext());
171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int times_shown = profile->GetPrefs()->GetInteger(
172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ::prefs::kAutofillGeneratedCardBubbleTimesShown);
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return times_shown < kMaxGeneratedCardTimesToShow;
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::SetupAndShow(
177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& fronting_card_name,
178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& backing_card_name) {
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!fronting_card_name.empty());
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!backing_card_name.empty());
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  fronting_card_name_ = fronting_card_name;
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  backing_card_name_ = backing_card_name;
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Clear any generated state or from the last |SetupAndShow()| call.
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  contents_text_.clear();
187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  contents_text_ranges_.clear();
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::string16 to_split = l10n_util::GetStringFUTF16(
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      IDS_AUTOFILL_GENERATED_CREDIT_CARD_BUBBLE_CONTENTS,
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      fronting_card_name_,
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      backing_card_name_);
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Split the full text on '|' to highlight certain parts. For example, "sly"
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // and "jumped" would be bolded in "The |sly| fox |jumped| over the lazy dog".
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<base::string16> pieces;
197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::SplitStringDontTrim(to_split, kRangeSeparator, &pieces);
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  while (!pieces.empty()) {
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::string16 piece = pieces.front();
201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Every second piece should be bolded. Because |base::SplitString*()|
203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // leaves an empty "" even if '|' is the first character, this is guaranteed
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // to work for "|highlighting| starts here". Ignore empty pieces because
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // there's nothing to highlight.
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!piece.empty() && pieces.size() % 2 == 0) {
207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const size_t start = contents_text_.size();
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TextRange bold_text;
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      bold_text.range = gfx::Range(start, start + piece.size());
210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      bold_text.is_link = false;
211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      contents_text_ranges_.push_back(bold_text);
212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Append the piece whether it's bolded or not and move on to the next one.
215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    contents_text_.append(piece);
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    pieces.erase(pieces.begin(), pieces.begin() + 1);
217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Add a "Learn more" link at the end of the header text if it's a generated
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // card bubble.
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::string16 learn_more = l10n_util::GetStringUTF16(IDS_LEARN_MORE);
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  contents_text_.append(base::ASCIIToUTF16(" ") + learn_more);
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const size_t header_size = contents_text_.size();
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TextRange end_link;
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  end_link.range = gfx::Range(header_size - learn_more.size(), header_size);
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  end_link.is_link = true;
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  contents_text_ranges_.push_back(end_link);
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  UpdateAnchor();
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (ShouldDisplayBubbleInitially())
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Show(false);
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::Show(bool was_anchor_click) {
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Hide();
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!CanShow())
239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bubble_ = CreateBubble();
242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!bubble_) {
243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // TODO(dbeam): Make a bubble on all applicable platforms.
244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bubble_->Show();
248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!was_anchor_click) {
250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // If the bubble was an automatically created "you generated a card" bubble,
251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // count it as a show. If the user clicked the omnibox icon, don't count it.
252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    PrefService* prefs = Profile::FromBrowserContext(
253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        web_contents()->GetBrowserContext())->GetPrefs();
254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    prefs->SetInteger(::prefs::kAutofillGeneratedCardBubbleTimesShown,
255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        prefs->GetInteger(::prefs::kAutofillGeneratedCardBubbleTimesShown) + 1);
256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::UpdateAnchor() {
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (browser && browser->window() && browser->window()->GetLocationBar())
262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    browser->window()->GetLocationBar()->UpdateGeneratedCreditCardView();
263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GeneratedCreditCardBubbleController::Hide() {
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (bubble_ && !bubble_->IsHiding())
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bubble_->Hide();
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace autofill
271