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