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(¶ms); 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