autofill_dialog_controller_impl.h revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
1// Copyright (c) 2012 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#ifndef CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_CONTROLLER_IMPL_H_
6#define CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_CONTROLLER_IMPL_H_
7
8#include <set>
9#include <vector>
10
11#include "base/callback.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/memory/weak_ptr.h"
14#include "base/strings/string16.h"
15#include "base/time/time.h"
16#include "chrome/browser/ui/autofill/account_chooser_model.h"
17#include "chrome/browser/ui/autofill/autofill_dialog_controller.h"
18#include "chrome/browser/ui/autofill/autofill_dialog_models.h"
19#include "chrome/browser/ui/autofill/autofill_dialog_types.h"
20#include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h"
21#include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h"
22#include "chrome/browser/ui/autofill/country_combobox_model.h"
23#include "components/autofill/content/browser/autocheckout_steps.h"
24#include "components/autofill/content/browser/wallet/wallet_client.h"
25#include "components/autofill/content/browser/wallet/wallet_client_delegate.h"
26#include "components/autofill/content/browser/wallet/wallet_items.h"
27#include "components/autofill/content/browser/wallet/wallet_signin_helper_delegate.h"
28#include "components/autofill/core/browser/autofill_manager_delegate.h"
29#include "components/autofill/core/browser/autofill_metrics.h"
30#include "components/autofill/core/browser/autofill_popup_delegate.h"
31#include "components/autofill/core/browser/field_types.h"
32#include "components/autofill/core/browser/form_structure.h"
33#include "components/autofill/core/browser/personal_data_manager.h"
34#include "components/autofill/core/browser/personal_data_manager_observer.h"
35#include "content/public/browser/notification_observer.h"
36#include "content/public/browser/notification_registrar.h"
37#include "content/public/browser/web_contents_observer.h"
38#include "content/public/common/ssl_status.h"
39#include "ui/base/models/simple_menu_model.h"
40#include "ui/base/ui_base_types.h"
41#include "url/gurl.h"
42
43class Profile;
44
45namespace content {
46class WebContents;
47}
48
49namespace user_prefs {
50class PrefRegistrySyncable;
51}
52
53namespace autofill {
54
55class AutofillDataModel;
56class AutofillDialogView;
57class AutofillPopupControllerImpl;
58class DataModelWrapper;
59class TestableAutofillDialogView;
60
61namespace risk {
62class Fingerprint;
63}
64
65namespace wallet {
66class WalletSigninHelper;
67}
68
69// This class drives the dialog that appears when a site uses the imperative
70// autocomplete API to fill out a form.
71class AutofillDialogControllerImpl : public AutofillDialogViewDelegate,
72                                     public AutofillDialogController,
73                                     public AutofillPopupDelegate,
74                                     public content::NotificationObserver,
75                                     public content::WebContentsObserver,
76                                     public SuggestionsMenuModelDelegate,
77                                     public wallet::WalletClientDelegate,
78                                     public wallet::WalletSigninHelperDelegate,
79                                     public PersonalDataManagerObserver,
80                                     public AccountChooserModelDelegate {
81 public:
82  virtual ~AutofillDialogControllerImpl();
83
84  static base::WeakPtr<AutofillDialogControllerImpl> Create(
85      content::WebContents* contents,
86      const FormData& form_structure,
87      const GURL& source_url,
88      const DialogType dialog_type,
89      const base::Callback<void(const FormStructure*,
90                                const std::string&)>& callback);
91
92  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
93
94  // AutofillDialogController implementation.
95  virtual void Show() OVERRIDE;
96  virtual void Hide() OVERRIDE;
97  virtual void TabActivated() OVERRIDE;
98  virtual void AddAutocheckoutStep(AutocheckoutStepType step_type) OVERRIDE;
99  virtual void UpdateAutocheckoutStep(
100      AutocheckoutStepType step_type,
101      AutocheckoutStepStatus step_status) OVERRIDE;
102  virtual void OnAutocheckoutError() OVERRIDE;
103  virtual void OnAutocheckoutSuccess() OVERRIDE;
104
105  // Returns |view_| as a testable version of itself (if |view_| exists and
106  // actually implements |AutofillDialogView::GetTestableView()|).
107  TestableAutofillDialogView* GetTestableView();
108
109  // AutofillDialogViewDelegate implementation.
110  virtual string16 DialogTitle() const OVERRIDE;
111  virtual string16 AccountChooserText() const OVERRIDE;
112  virtual string16 SignInLinkText() const OVERRIDE;
113  virtual string16 EditSuggestionText() const OVERRIDE;
114  virtual string16 CancelButtonText() const OVERRIDE;
115  virtual string16 ConfirmButtonText() const OVERRIDE;
116  virtual string16 SaveLocallyText() const OVERRIDE;
117  virtual string16 SaveLocallyTooltip() const OVERRIDE;
118  virtual string16 LegalDocumentsText() OVERRIDE;
119  virtual DialogSignedInState SignedInState() const OVERRIDE;
120  virtual bool ShouldShowSpinner() const OVERRIDE;
121  virtual bool ShouldOfferToSaveInChrome() const OVERRIDE;
122  virtual ui::MenuModel* MenuModelForAccountChooser() OVERRIDE;
123  virtual gfx::Image AccountChooserImage() OVERRIDE;
124  virtual bool ShouldShowDetailArea() const OVERRIDE;
125  virtual bool ShouldShowProgressBar() const OVERRIDE;
126  virtual gfx::Image ButtonStripImage() const OVERRIDE;
127  virtual int GetDialogButtons() const OVERRIDE;
128  virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE;
129  virtual DialogOverlayState GetDialogOverlay() const OVERRIDE;
130  virtual const std::vector<ui::Range>& LegalDocumentLinks() OVERRIDE;
131  virtual bool SectionIsActive(DialogSection section) const OVERRIDE;
132  virtual const DetailInputs& RequestedFieldsForSection(DialogSection section)
133      const OVERRIDE;
134  virtual ui::ComboboxModel* ComboboxModelForAutofillType(
135      ServerFieldType type) OVERRIDE;
136  virtual ui::MenuModel* MenuModelForSection(DialogSection section) OVERRIDE;
137  virtual string16 LabelForSection(DialogSection section) const OVERRIDE;
138  virtual SuggestionState SuggestionStateForSection(
139      DialogSection section) OVERRIDE;
140  virtual void EditClickedForSection(DialogSection section) OVERRIDE;
141  virtual void EditCancelledForSection(DialogSection section) OVERRIDE;
142  virtual gfx::Image IconForField(ServerFieldType type,
143                                  const string16& user_input) const OVERRIDE;
144  virtual string16 InputValidityMessage(DialogSection section,
145                                        ServerFieldType type,
146                                        const string16& value) OVERRIDE;
147  virtual ValidityData InputsAreValid(
148      DialogSection section,
149      const DetailOutputMap& inputs,
150      ValidationType validation_type) OVERRIDE;
151  virtual void UserEditedOrActivatedInput(DialogSection section,
152                                          const DetailInput* input,
153                                          gfx::NativeView parent_view,
154                                          const gfx::Rect& content_bounds,
155                                          const string16& field_contents,
156                                          bool was_edit) OVERRIDE;
157  virtual bool HandleKeyPressEventInInput(
158      const content::NativeWebKeyboardEvent& event) OVERRIDE;
159  virtual void FocusMoved() OVERRIDE;
160  virtual gfx::Image SplashPageImage() const OVERRIDE;
161  virtual void ViewClosed() OVERRIDE;
162  virtual std::vector<DialogNotification> CurrentNotifications() OVERRIDE;
163  virtual std::vector<DialogAutocheckoutStep> CurrentAutocheckoutSteps()
164      const OVERRIDE;
165  virtual void SignInLinkClicked() OVERRIDE;
166  virtual void NotificationCheckboxStateChanged(DialogNotification::Type type,
167                                                bool checked) OVERRIDE;
168  virtual void LegalDocumentLinkClicked(const ui::Range& range) OVERRIDE;
169  virtual void OverlayButtonPressed() OVERRIDE;
170  virtual bool OnCancel() OVERRIDE;
171  virtual bool OnAccept() OVERRIDE;
172  virtual Profile* profile() OVERRIDE;
173  virtual content::WebContents* GetWebContents() OVERRIDE;
174
175  // AutofillPopupDelegate implementation.
176  virtual void OnPopupShown(content::KeyboardListener* listener) OVERRIDE;
177  virtual void OnPopupHidden(content::KeyboardListener* listener) OVERRIDE;
178  virtual void DidSelectSuggestion(int identifier) OVERRIDE;
179  virtual void DidAcceptSuggestion(const string16& value,
180                                   int identifier) OVERRIDE;
181  virtual void RemoveSuggestion(const string16& value,
182                                int identifier) OVERRIDE;
183  virtual void ClearPreviewedForm() OVERRIDE;
184
185  // content::NotificationObserver implementation.
186  virtual void Observe(int type,
187                       const content::NotificationSource& source,
188                       const content::NotificationDetails& details) OVERRIDE;
189
190  // SuggestionsMenuModelDelegate implementation.
191  virtual void SuggestionItemSelected(SuggestionsMenuModel* model,
192                                      size_t index) OVERRIDE;
193
194  // wallet::WalletClientDelegate implementation.
195  virtual const AutofillMetrics& GetMetricLogger() const OVERRIDE;
196  virtual DialogType GetDialogType() const OVERRIDE;
197  virtual std::string GetRiskData() const OVERRIDE;
198  virtual std::string GetWalletCookieValue() const OVERRIDE;
199  virtual bool IsShippingAddressRequired() const OVERRIDE;
200  virtual void OnDidAcceptLegalDocuments() OVERRIDE;
201  virtual void OnDidAuthenticateInstrument(bool success) OVERRIDE;
202  virtual void OnDidGetFullWallet(
203      scoped_ptr<wallet::FullWallet> full_wallet) OVERRIDE;
204  virtual void OnDidGetWalletItems(
205      scoped_ptr<wallet::WalletItems> wallet_items) OVERRIDE;
206  virtual void OnDidSaveToWallet(
207      const std::string& instrument_id,
208      const std::string& address_id,
209      const std::vector<wallet::RequiredAction>& required_actions,
210      const std::vector<wallet::FormFieldError>& form_field_errors) OVERRIDE;
211  virtual void OnWalletError(
212      wallet::WalletClient::ErrorType error_type) OVERRIDE;
213
214  // PersonalDataManagerObserver implementation.
215  virtual void OnPersonalDataChanged() OVERRIDE;
216
217  // AccountChooserModelDelegate implementation.
218  virtual void AccountChoiceChanged() OVERRIDE;
219  virtual void UpdateAccountChooserView() OVERRIDE;
220
221  // wallet::WalletSigninHelperDelegate implementation.
222  virtual void OnPassiveSigninSuccess(const std::string& username) OVERRIDE;
223  virtual void OnPassiveSigninFailure(
224      const GoogleServiceAuthError& error) OVERRIDE;
225  virtual void OnUserNameFetchSuccess(const std::string& username) OVERRIDE;
226  virtual void OnUserNameFetchFailure(
227      const GoogleServiceAuthError& error) OVERRIDE;
228  virtual void OnDidFetchWalletCookieValue(
229      const std::string& cookie_value) OVERRIDE;
230
231  DialogType dialog_type() const { return dialog_type_; }
232
233 protected:
234  // Exposed for testing.
235  AutofillDialogControllerImpl(
236      content::WebContents* contents,
237      const FormData& form_structure,
238      const GURL& source_url,
239      const DialogType dialog_type,
240      const base::Callback<void(const FormStructure*,
241                                const std::string&)>& callback);
242
243  // Exposed for testing.
244  AutofillDialogView* view() { return view_.get(); }
245  virtual AutofillDialogView* CreateView();
246  const DetailInput* input_showing_popup() const {
247    return input_showing_popup_;
248  }
249
250  // Returns the PersonalDataManager for |profile_|.
251  virtual PersonalDataManager* GetManager();
252
253  // Returns the WalletClient* this class uses to talk to Online Wallet. Exposed
254  // for testing.
255  virtual wallet::WalletClient* GetWalletClient();
256
257  // Call to disable communication to Online Wallet for this dialog.
258  // Exposed for testing.
259  void DisableWallet(wallet::WalletClient::ErrorType error_type);
260
261  // Returns whether Wallet is the current data source. Exposed for testing.
262  virtual bool IsPayingWithWallet() const;
263
264  // Asks risk module to asynchronously load fingerprint data. Data will be
265  // returned via |OnDidLoadRiskFingerprintData()|. Exposed for testing.
266  virtual void LoadRiskFingerprintData();
267  virtual void OnDidLoadRiskFingerprintData(
268      scoped_ptr<risk::Fingerprint> fingerprint);
269
270  // Opens the given URL in a new foreground tab.
271  virtual void OpenTabWithUrl(const GURL& url);
272
273  // Whether |section| was sent into edit mode based on existing data. This
274  // happens when a user clicks "Edit" or a suggestion is invalid.
275  virtual bool IsEditingExistingData(DialogSection section) const;
276
277  // Whether the user has chosen to enter all new data in |section|. This
278  // happens via choosing "Add a new X..." from a section's suggestion menu.
279  bool IsManuallyEditingSection(DialogSection section) const;
280
281  // Should be called on the Wallet sign-in error.
282  virtual void OnWalletSigninError();
283
284  // Whether the information input in this dialog will be securely transmitted
285  // to the requesting site.
286  virtual bool TransmissionWillBeSecure() const;
287
288  AutocheckoutState autocheckout_state() const { return autocheckout_state_; }
289
290  // Shows a new credit card saved bubble and passes ownership of |new_card| and
291  // |billing_profile| to the bubble. Exposed for testing.
292  virtual void ShowNewCreditCardBubble(
293      scoped_ptr<CreditCard> new_card,
294      scoped_ptr<AutofillProfile> billing_profile);
295
296 private:
297  // Whether or not the current request wants credit info back.
298  bool RequestingCreditCardInfo() const;
299
300  // Initializes or updates |suggested_email_| et al.
301  void SuggestionsUpdated();
302
303  // Whether the user's wallet items have at least one address and instrument.
304  bool HasCompleteWallet() const;
305
306  // Starts fetching the wallet items from Online Wallet.
307  void GetWalletItems();
308
309  // Stop showing sign in flow.
310  void HideSignIn();
311
312  // Handles the SignedInState() on Wallet or sign-in state update.
313  // Triggers the user name fetch and passive sign-in.
314  void SignedInStateUpdated();
315
316  // Refreshes the model on Wallet or sign-in state update.
317  void OnWalletOrSigninUpdate();
318
319  // Called when a Save or Update call to Wallet has validation errors.
320  void OnWalletFormFieldError(
321      const std::vector<wallet::FormFieldError>& form_field_errors);
322
323  // Calculates |legal_documents_text_| and |legal_document_link_ranges_| if
324  // they have not already been calculated.
325  void EnsureLegalDocumentsText();
326
327  // Clears previously entered manual input and removes |section| from
328  // |section_editing_state_|. Does not update the view.
329  void ResetSectionInput(DialogSection section);
330
331  // Force |section| into edit mode if the current suggestion is invalid.
332  void ShowEditUiIfBadSuggestion(DialogSection section);
333
334  // Whether the |value| of |input| should be preserved on account change.
335  bool InputWasEdited(ServerFieldType type,
336                      const base::string16& value);
337
338  // Takes a snapshot of the newly inputted user data in |view_| (if it exists).
339  DetailOutputMap TakeUserInputSnapshot();
340
341  // Fills the detail inputs from a previously taken user input snapshot. Does
342  // not update the view.
343  void RestoreUserInputFromSnapshot(const DetailOutputMap& snapshot);
344
345  // Tells the view to update |section|.
346  void UpdateSection(DialogSection section);
347
348  // Tells |view_| to update the validity status of its detail inputs (if
349  // |view_| is non-null). Currently this is used solely for highlighting
350  // invalid suggestions, so if no sections are based on existing data,
351  // |view_->UpdateForErrors()| is not called.
352  void UpdateForErrors();
353
354  // Creates a DataModelWrapper item for the item that's checked in the
355  // suggestion model for |section|. This may represent Autofill
356  // data or Wallet data, depending on whether Wallet is currently enabled.
357  scoped_ptr<DataModelWrapper> CreateWrapper(DialogSection section);
358
359  // Helper to return the current Wallet instrument or address. If the dialog
360  // isn't using Wallet or the user is adding a new instrument or address, NULL
361  // will be returned.
362  const wallet::WalletItems::MaskedInstrument* ActiveInstrument() const;
363  const wallet::Address* ActiveShippingAddress() const;
364
365  // Fills in |section|-related fields in |output_| according to the state of
366  // |view_|.
367  void FillOutputForSection(DialogSection section);
368  // As above, but uses |compare| to determine whether a DetailInput matches
369  // a field. Saves any new Autofill data to the PersonalDataManager.
370  void FillOutputForSectionWithComparator(DialogSection section,
371                                          const InputFieldComparator& compare);
372
373  // Returns whether |form_structure|_| has any fields that match the fieldset
374  // represented by |section|.
375  bool FormStructureCaresAboutSection(DialogSection section) const;
376
377  // Sets the CVC result on |form_structure_| to the value in |cvc|.
378  void SetCvcResult(const string16& cvc);
379
380  // Gets the value for |type| in |section|, whether it comes from manual user
381  // input or the active suggestion.
382  string16 GetValueFromSection(DialogSection section,
383                               ServerFieldType type);
384
385  // Saves the data in |profile| to the personal data manager. This may add
386  // a new profile or tack onto an existing profile.
387  void SaveProfileGleanedFromSection(const AutofillProfile& profile,
388                                     DialogSection section);
389
390  // Gets the SuggestionsMenuModel for |section|.
391  SuggestionsMenuModel* SuggestionsMenuModelForSection(DialogSection section);
392  const SuggestionsMenuModel* SuggestionsMenuModelForSection(
393      DialogSection section) const;
394  // And the reverse.
395  DialogSection SectionForSuggestionsMenuModel(
396      const SuggestionsMenuModel& model);
397
398  // Suggested text and icons for sections. Suggestion text is used to show an
399  // abidged overview of the currently used suggestion. Extra text is used when
400  // part of a section is suggested but part must be manually input (e.g. during
401  // a CVC challenge or when using Autofill's CC section [never stores CVC]).
402  string16 SuggestionTextForSection(DialogSection section);
403  gfx::Font::FontStyle SuggestionTextStyleForSection(DialogSection section)
404      const;
405  string16 RequiredActionTextForSection(DialogSection section) const;
406  gfx::Image SuggestionIconForSection(DialogSection section);
407  string16 ExtraSuggestionTextForSection(DialogSection section) const;
408  gfx::Image ExtraSuggestionIconForSection(DialogSection section) const;
409
410  // Loads profiles that can suggest data for |type|. |field_contents| is the
411  // part the user has already typed. |inputs| is the rest of section.
412  // Identifying info is loaded into the last three outparams as well as
413  // |popup_guids_|.
414  void GetProfileSuggestions(
415      ServerFieldType type,
416      const string16& field_contents,
417      const DetailInputs& inputs,
418      std::vector<string16>* popup_values,
419      std::vector<string16>* popup_labels,
420      std::vector<string16>* popup_icons);
421
422  // Like RequestedFieldsForSection, but returns a pointer.
423  DetailInputs* MutableRequestedFieldsForSection(DialogSection section);
424
425  // Hides |popup_controller_|'s popup view, if it exists.
426  void HidePopup();
427
428  // Set whether the currently editing |section| was originally based on
429  // existing Wallet or Autofill data.
430  void SetEditingExistingData(DialogSection section, bool editing);
431
432  // Whether the user has chosen to enter all new data in at least one section.
433  bool IsManuallyEditingAnySection() const;
434
435  // Returns validity message for a given credit card number.
436  base::string16 CreditCardNumberValidityMessage(
437      const base::string16& number) const;
438
439  // Whether a particular DetailInput in |section| should be edited or not.
440  bool InputIsEditable(const DetailInput& input, DialogSection section) const;
441
442  // Whether all of the input fields currently showing in the dialog have valid
443  // contents.
444  bool AllSectionsAreValid();
445
446  // Whether all of the input fields currently showing in the given |section| of
447  // the dialog have valid contents.
448  bool SectionIsValid(DialogSection section);
449
450  // Whether the currently active credit card expiration date is valid.
451  bool IsCreditCardExpirationValid(const base::string16& year,
452                                   const base::string16& month) const;
453
454  // Returns true if |key| refers to a suggestion, as opposed to some control
455  // menu item.
456  bool IsASuggestionItemKey(const std::string& key) const;
457
458  // Whether the billing section should be used to fill in the shipping details.
459  bool ShouldUseBillingForShipping();
460
461  // Whether the user wishes to save information locally to Autofill.
462  bool ShouldSaveDetailsLocally();
463
464  // Change whether the controller is currently submitting details to Autofill
465  // or Online Wallet (|is_submitting_|) and update the view.
466  void SetIsSubmitting(bool submitting);
467
468  // Whether the user has accepted all the current legal documents' terms.
469  bool AreLegalDocumentsCurrent() const;
470
471  // Accepts any pending legal documents now that the user has pressed Submit.
472  void AcceptLegalDocuments();
473
474  // Start the submit proccess to interact with Online Wallet (might do various
475  // things like accept documents, save details, update details, respond to
476  // required actions, etc.).
477  void SubmitWithWallet();
478
479  // Creates an instrument based on |views_|' contents.
480  scoped_ptr<wallet::Instrument> CreateTransientInstrument();
481
482  // Creates an address based on the contents of |view_|.
483  scoped_ptr<wallet::Address> CreateTransientAddress();
484
485  // Gets a full wallet from Online Wallet so the user can purchase something.
486  // This information is decoded to reveal a fronting (proxy) card.
487  void GetFullWallet();
488
489  // Updates the state of the controller and |view_| based on any required
490  // actions returned by Save or Update calls to Wallet.
491  void HandleSaveOrUpdateRequiredActions(
492      const std::vector<wallet::RequiredAction>& required_actions);
493
494  // Whether submission is currently waiting for |action| to be handled.
495  bool IsSubmitPausedOn(wallet::RequiredAction action) const;
496
497  // Called when there's nothing left to accept, update, save, or authenticate
498  // in order to fill |form_structure_| and pass data back to the invoking page.
499  void FinishSubmit();
500
501  // Writes to prefs the choice of AutofillDataModel for |section|.
502  void PersistAutofillChoice(DialogSection section,
503                             const std::string& guid,
504                             int variant);
505
506  // Sets the outparams to the default AutofillDataModel for |section| (which is
507  // the first one in the menu that is a suggestion item).
508  void GetDefaultAutofillChoice(DialogSection section,
509                                std::string* guid,
510                                int* variant);
511
512  // Reads from prefs the choice of AutofillDataModel for |section|. Returns
513  // whether there was a setting to read.
514  bool GetAutofillChoice(DialogSection section,
515                         std::string* guid,
516                         int* variant);
517
518  // Calculates which AutofillDataModel variant |model| is referring to.
519  size_t GetSelectedVariantForModel(const SuggestionsMenuModel& model);
520
521  // Logs metrics when the dialog is submitted.
522  void LogOnFinishSubmitMetrics();
523
524  // Logs metrics when the dialog is canceled.
525  void LogOnCancelMetrics();
526
527  // Logs metrics when the edit ui is shown for the given |section|.
528  void LogEditUiShownMetric(DialogSection section);
529
530  // Logs metrics when a suggestion item from the given |model| is selected.
531  void LogSuggestionItemSelectedMetric(const SuggestionsMenuModel& model);
532
533  // Logs the time elapsed from when the dialog was shown to when the user could
534  // interact with it.
535  void LogDialogLatencyToShow();
536
537  // Sets the state of the autocheckout flow.
538  void SetAutocheckoutState(AutocheckoutState autocheckout_state);
539
540  // Obscures the web contents.
541  void DeemphasizeRenderView();
542
543  // Returns the metric corresponding to the user's initial state when
544  // interacting with this dialog.
545  AutofillMetrics::DialogInitialUserStateMetric GetInitialUserState() const;
546
547  // Shows an educational bubble if a new credit card was saved or the first few
548  // times an Online Wallet fronting card was generated.
549  void MaybeShowCreditCardBubble();
550
551  // The |profile| for |contents_|.
552  Profile* const profile_;
553
554  // For logging UMA metrics.
555  const AutofillMetrics metric_logger_;
556  base::Time dialog_shown_timestamp_;
557  AutofillMetrics::DialogInitialUserStateMetric initial_user_state_;
558
559  // The time that Autocheckout started running. Reset on error. While this is
560  // a valid time, |AutocheckoutIsRunning()| will return true.
561  base::Time autocheckout_started_timestamp_;
562
563  // Whether this is an Autocheckout or a requestAutocomplete dialog.
564  const DialogType dialog_type_;
565
566  FormStructure form_structure_;
567
568  // Whether the URL visible to the user when this dialog was requested to be
569  // invoked is the same as |source_url_|.
570  bool invoked_from_same_origin_;
571
572  // The URL of the invoking site.
573  GURL source_url_;
574
575  // The callback via which we return the collected data and, if Online Wallet
576  // was used, the Google transaction id.
577  base::Callback<void(const FormStructure*, const std::string&)> callback_;
578
579  // The AccountChooserModel acts as the MenuModel for the account chooser,
580  // and also tracks which data source the dialog is using.
581  AccountChooserModel account_chooser_model_;
582
583  // The sign-in helper to fetch the user info and perform passive sign-in.
584  // The helper is set only during fetch/sign-in, and NULL otherwise.
585  scoped_ptr<wallet::WalletSigninHelper> signin_helper_;
586
587  // A client to talk to the Online Wallet API.
588  wallet::WalletClient wallet_client_;
589
590  // Recently received items retrieved via |wallet_client_|.
591  scoped_ptr<wallet::WalletItems> wallet_items_;
592  scoped_ptr<wallet::FullWallet> full_wallet_;
593
594  // The last active instrument and shipping address object ids. These
595  // variables are only set (i.e. non-empty) when the Wallet items are being
596  // re-fetched.
597  std::string previously_selected_instrument_id_;
598  std::string previously_selected_shipping_address_id_;
599
600  // When the Wallet items were last fetched.
601  base::TimeTicks last_wallet_items_fetch_timestamp_;
602
603  // Local machine signals to pass along on each request to trigger (or
604  // discourage) risk challenges; sent if the user is up to date on legal docs.
605  std::string risk_data_;
606
607  // The text to display when the user is accepting new terms of service, etc.
608  string16 legal_documents_text_;
609  // The ranges within |legal_documents_text_| to linkify.
610  std::vector<ui::Range> legal_document_link_ranges_;
611
612  // The instrument and address IDs from the Online Wallet server to be used
613  // when getting a full wallet.
614  std::string active_instrument_id_;
615  std::string active_address_id_;
616
617  // The fields for billing and shipping which the page has actually requested.
618  DetailInputs requested_email_fields_;
619  DetailInputs requested_cc_fields_;
620  DetailInputs requested_billing_fields_;
621  DetailInputs requested_cc_billing_fields_;
622  DetailInputs requested_shipping_fields_;
623
624  // Models for the credit card expiration inputs.
625  MonthComboboxModel cc_exp_month_combobox_model_;
626  YearComboboxModel cc_exp_year_combobox_model_;
627
628  // Model for the country input.
629  CountryComboboxModel country_combobox_model_;
630
631  // Models for the suggestion views.
632  SuggestionsMenuModel suggested_email_;
633  SuggestionsMenuModel suggested_cc_;
634  SuggestionsMenuModel suggested_billing_;
635  SuggestionsMenuModel suggested_cc_billing_;
636  SuggestionsMenuModel suggested_shipping_;
637
638  // |DialogSection|s that are in edit mode that are based on existing data.
639  std::set<DialogSection> section_editing_state_;
640
641  // Whether |form_structure_| has asked for any details that would indicate
642  // we should show a shipping section.
643  bool cares_about_shipping_;
644
645  // The GUIDs for the currently showing unverified profiles popup.
646  std::vector<PersonalDataManager::GUIDPair> popup_guids_;
647
648  // The controller for the currently showing popup (which helps users when
649  // they're manually filling the dialog).
650  base::WeakPtr<AutofillPopupControllerImpl> popup_controller_;
651
652  // The input for which |popup_controller_| is currently showing a popup
653  // (if any).
654  const DetailInput* input_showing_popup_;
655
656  scoped_ptr<AutofillDialogView> view_;
657
658  // A NotificationRegistrar for tracking the completion of sign-in.
659  content::NotificationRegistrar signin_registrar_;
660
661  base::WeakPtrFactory<AutofillDialogControllerImpl> weak_ptr_factory_;
662
663  // Whether the wallet promos should be shown in the notification area. Based
664  // on whether the user has paid with Wallet or has signed into this dialog.
665  bool should_show_wallet_promo_;
666  bool has_shown_wallet_usage_confirmation_;
667
668  // Whether a user accepted legal documents while this dialog is running.
669  bool has_accepted_legal_documents_;
670
671  // True after the user first accepts the dialog and presses "Submit". May
672  // continue to be true while processing required actions.
673  bool is_submitting_;
674
675  // True if the last call to |GetFullWallet()| returned a
676  // CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS required action, indicating that the
677  // selected instrument or address had become invalid since it was originally
678  // returned in |GetWalletItems()|.
679  bool choose_another_instrument_or_address_;
680
681  // Whether or not the server side validation errors returned by Wallet were
682  // recoverable.
683  bool wallet_server_validation_recoverable_;
684
685  // Whether |callback_| was Run() with a filled |form_structure_|.
686  bool data_was_passed_back_;
687
688  typedef std::map<ServerFieldType,
689      std::pair<base::string16, base::string16> > TypeErrorInputMap;
690  typedef std::map<DialogSection, TypeErrorInputMap> WalletValidationErrors;
691  // Wallet validation errors. section->type->(error_msg, input_value).
692  WalletValidationErrors wallet_errors_;
693
694  // The current state of the Autocheckout flow.
695  AutocheckoutState autocheckout_state_;
696
697  // Whether the latency to display to the UI was logged to UMA yet.
698  bool was_ui_latency_logged_;
699
700  // Whether or not the render view has been deemphasized.
701  bool deemphasized_render_view_;
702
703  // State of steps in the current Autocheckout flow, or empty if not an
704  // Autocheckout use case.
705  std::vector<DialogAutocheckoutStep> steps_;
706
707  // The Google Wallet cookie value, set as an authorization header on requests
708  // to Wallet.
709  std::string wallet_cookie_value_;
710
711  // Populated if the user chose to save a newly inputted credit card. Used to
712  // show a bubble as the dialog closes to confirm a user's new card info was
713  // saved. Never populated while incognito (as nothing's actually saved).
714  scoped_ptr<CreditCard> newly_saved_card_;
715
716  DISALLOW_COPY_AND_ASSIGN(AutofillDialogControllerImpl);
717};
718
719}  // namespace autofill
720
721#endif  // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_CONTROLLER_IMPL_H_
722