chrome_autofill_client.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/autofill/chrome_autofill_client.h" 6 7#include "base/logging.h" 8#include "base/prefs/pref_service.h" 9#include "chrome/browser/autofill/autofill_cc_infobar_delegate.h" 10#include "chrome/browser/autofill/personal_data_manager_factory.h" 11#include "chrome/browser/infobars/infobar_service.h" 12#include "chrome/browser/password_manager/chrome_password_manager_client.h" 13#include "chrome/browser/profiles/profile.h" 14#include "chrome/browser/ui/autofill/autofill_dialog_controller.h" 15#include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h" 16#include "chrome/browser/ui/browser.h" 17#include "chrome/browser/ui/browser_finder.h" 18#include "chrome/browser/ui/browser_window.h" 19#include "chrome/browser/ui/chrome_pages.h" 20#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" 21#include "chrome/browser/webdata/web_data_service_factory.h" 22#include "chrome/common/url_constants.h" 23#include "components/autofill/content/browser/content_autofill_driver.h" 24#include "components/autofill/content/common/autofill_messages.h" 25#include "components/autofill/core/common/autofill_pref_names.h" 26#include "content/public/browser/render_view_host.h" 27#include "ui/gfx/rect.h" 28 29#if defined(OS_ANDROID) 30#include "chrome/browser/ui/android/autofill/autofill_logger_android.h" 31#endif 32 33DEFINE_WEB_CONTENTS_USER_DATA_KEY(autofill::ChromeAutofillClient); 34 35namespace autofill { 36 37ChromeAutofillClient::ChromeAutofillClient(content::WebContents* web_contents) 38 : content::WebContentsObserver(web_contents), web_contents_(web_contents) { 39 DCHECK(web_contents); 40#if defined(OS_MACOSX) && !defined(OS_IOS) 41 RegisterForKeystoneNotifications(); 42#endif // defined(OS_MACOSX) && !defined(OS_IOS) 43} 44 45ChromeAutofillClient::~ChromeAutofillClient() { 46 // NOTE: It is too late to clean up the autofill popup; that cleanup process 47 // requires that the WebContents instance still be valid and it is not at 48 // this point (in particular, the WebContentsImpl destructor has already 49 // finished running and we are now in the base class destructor). 50 DCHECK(!popup_controller_); 51#if defined(OS_MACOSX) && !defined(OS_IOS) 52 UnregisterFromKeystoneNotifications(); 53#endif // defined(OS_MACOSX) && !defined(OS_IOS) 54} 55 56void ChromeAutofillClient::TabActivated() { 57 if (dialog_controller_.get()) 58 dialog_controller_->TabActivated(); 59} 60 61PersonalDataManager* ChromeAutofillClient::GetPersonalDataManager() { 62 Profile* profile = 63 Profile::FromBrowserContext(web_contents_->GetBrowserContext()); 64 return PersonalDataManagerFactory::GetForProfile( 65 profile->GetOriginalProfile()); 66} 67 68scoped_refptr<AutofillWebDataService> ChromeAutofillClient::GetDatabase() { 69 Profile* profile = 70 Profile::FromBrowserContext(web_contents_->GetBrowserContext()); 71 return WebDataServiceFactory::GetAutofillWebDataForProfile( 72 profile, Profile::EXPLICIT_ACCESS); 73} 74 75PrefService* ChromeAutofillClient::GetPrefs() { 76 return Profile::FromBrowserContext(web_contents_->GetBrowserContext()) 77 ->GetPrefs(); 78} 79 80void ChromeAutofillClient::ShowAutofillSettings() { 81#if defined(OS_ANDROID) 82 NOTIMPLEMENTED(); 83#else 84 Browser* browser = chrome::FindBrowserWithWebContents(web_contents_); 85 if (browser) 86 chrome::ShowSettingsSubPage(browser, chrome::kAutofillSubPage); 87#endif // #if defined(OS_ANDROID) 88} 89 90void ChromeAutofillClient::ConfirmSaveCreditCard( 91 const AutofillMetrics& metric_logger, 92 const base::Closure& save_card_callback) { 93 InfoBarService* infobar_service = 94 InfoBarService::FromWebContents(web_contents_); 95 AutofillCCInfoBarDelegate::Create( 96 infobar_service, &metric_logger, save_card_callback); 97} 98 99void ChromeAutofillClient::ShowRequestAutocompleteDialog( 100 const FormData& form, 101 const GURL& source_url, 102 const ResultCallback& callback) { 103 HideRequestAutocompleteDialog(); 104 105 dialog_controller_ = AutofillDialogController::Create( 106 web_contents_, form, source_url, callback); 107 if (dialog_controller_) { 108 dialog_controller_->Show(); 109 } else { 110 callback.Run(AutofillClient::AutocompleteResultErrorDisabled, 111 base::string16(), 112 NULL); 113 NOTIMPLEMENTED(); 114 } 115} 116 117void ChromeAutofillClient::ShowAutofillPopup( 118 const gfx::RectF& element_bounds, 119 base::i18n::TextDirection text_direction, 120 const std::vector<base::string16>& values, 121 const std::vector<base::string16>& labels, 122 const std::vector<base::string16>& icons, 123 const std::vector<int>& identifiers, 124 base::WeakPtr<AutofillPopupDelegate> delegate) { 125 // Convert element_bounds to be in screen space. 126 gfx::Rect client_area = web_contents_->GetContainerBounds(); 127 gfx::RectF element_bounds_in_screen_space = 128 element_bounds + client_area.OffsetFromOrigin(); 129 130 // Will delete or reuse the old |popup_controller_|. 131 popup_controller_ = 132 AutofillPopupControllerImpl::GetOrCreate(popup_controller_, 133 delegate, 134 web_contents(), 135 web_contents()->GetNativeView(), 136 element_bounds_in_screen_space, 137 text_direction); 138 139 popup_controller_->Show(values, labels, icons, identifiers); 140} 141 142void ChromeAutofillClient::UpdateAutofillPopupDataListValues( 143 const std::vector<base::string16>& values, 144 const std::vector<base::string16>& labels) { 145 if (popup_controller_.get()) 146 popup_controller_->UpdateDataListValues(values, labels); 147} 148 149void ChromeAutofillClient::HideAutofillPopup() { 150 if (popup_controller_.get()) 151 popup_controller_->Hide(); 152 153 // Password generation popups behave in the same fashion and should also 154 // be hidden. 155 ChromePasswordManagerClient* password_client = 156 ChromePasswordManagerClient::FromWebContents(web_contents_); 157 if (password_client) 158 password_client->HidePasswordGenerationPopup(); 159} 160 161bool ChromeAutofillClient::IsAutocompleteEnabled() { 162 // For browser, Autocomplete is always enabled as part of Autofill. 163 return GetPrefs()->GetBoolean(prefs::kAutofillEnabled); 164} 165 166void ChromeAutofillClient::HideRequestAutocompleteDialog() { 167 if (dialog_controller_.get()) 168 dialog_controller_->Hide(); 169} 170 171void ChromeAutofillClient::WebContentsDestroyed() { 172 HideAutofillPopup(); 173} 174 175void ChromeAutofillClient::DetectAccountCreationForms( 176 const std::vector<autofill::FormStructure*>& forms) { 177 password_manager::PasswordGenerationManager* manager = 178 ChromePasswordManagerClient::GetGenerationManagerFromWebContents( 179 web_contents_); 180 if (manager) 181 manager->DetectAccountCreationForms(forms); 182} 183 184void ChromeAutofillClient::DidFillOrPreviewField( 185 const base::string16& autofilled_value, 186 const base::string16& profile_full_name) { 187#if defined(OS_ANDROID) 188 AutofillLoggerAndroid::DidFillOrPreviewField(autofilled_value, 189 profile_full_name); 190#endif // defined(OS_ANDROID) 191} 192 193} // namespace autofill 194