Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / autofill / autofill_dialog_controller_impl.h
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/gtest_prod_util.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/wallet/wallet_client.h"
24 #include "components/autofill/content/browser/wallet/wallet_client_delegate.h"
25 #include "components/autofill/content/browser/wallet/wallet_items.h"
26 #include "components/autofill/content/browser/wallet/wallet_signin_helper_delegate.h"
27 #include "components/autofill/core/browser/autofill_manager_delegate.h"
28 #include "components/autofill/core/browser/autofill_metrics.h"
29 #include "components/autofill/core/browser/autofill_popup_delegate.h"
30 #include "components/autofill/core/browser/field_types.h"
31 #include "components/autofill/core/browser/form_structure.h"
32 #include "components/autofill/core/browser/personal_data_manager.h"
33 #include "components/autofill/core/browser/personal_data_manager_observer.h"
34 #include "content/public/browser/notification_observer.h"
35 #include "content/public/browser/notification_registrar.h"
36 #include "content/public/browser/web_contents_observer.h"
37 #include "content/public/common/ssl_status.h"
38 #include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/address_validator.h"
39 #include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/load_rules_delegate.h"
40 #include "third_party/skia/include/core/SkColor.h"
41 #include "ui/base/models/simple_menu_model.h"
42 #include "ui/base/ui_base_types.h"
43 #include "ui/gfx/animation/animation_delegate.h"
44 #include "ui/gfx/animation/linear_animation.h"
45 #include "url/gurl.h"
46
47 class Profile;
48
49 namespace content {
50 class WebContents;
51 }
52
53 namespace autofill {
54
55 class AutofillDataModel;
56 class AutofillDialogView;
57 class AutofillPopupControllerImpl;
58 class DataModelWrapper;
59
60 namespace risk {
61 class Fingerprint;
62 }
63
64 namespace wallet {
65 class WalletSigninHelper;
66 }
67
68 // This class drives the dialog that appears when a site uses the imperative
69 // autocomplete API to fill out a form.
70 class AutofillDialogControllerImpl
71     : 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 gfx::AnimationDelegate,
82       public ::i18n::addressinput::LoadRulesDelegate {
83  public:
84   virtual ~AutofillDialogControllerImpl();
85
86   static base::WeakPtr<AutofillDialogControllerImpl> Create(
87       content::WebContents* contents,
88       const FormData& form_structure,
89       const GURL& source_url,
90       const AutofillManagerDelegate::ResultCallback& callback);
91
92   // AutofillDialogController implementation.
93   virtual void Show() OVERRIDE;
94   virtual void Hide() OVERRIDE;
95   virtual void TabActivated() OVERRIDE;
96
97   // AutofillDialogViewDelegate implementation.
98   virtual base::string16 DialogTitle() const OVERRIDE;
99   virtual base::string16 AccountChooserText() const OVERRIDE;
100   virtual base::string16 SignInLinkText() const OVERRIDE;
101   virtual base::string16 SpinnerText() const OVERRIDE;
102   virtual base::string16 EditSuggestionText() const OVERRIDE;
103   virtual base::string16 CancelButtonText() const OVERRIDE;
104   virtual base::string16 ConfirmButtonText() const OVERRIDE;
105   virtual base::string16 SaveLocallyText() const OVERRIDE;
106   virtual base::string16 SaveLocallyTooltip() const OVERRIDE;
107   virtual base::string16 LegalDocumentsText() OVERRIDE;
108   virtual bool ShouldShowSpinner() const OVERRIDE;
109   virtual bool ShouldShowAccountChooser() const OVERRIDE;
110   virtual bool ShouldShowSignInWebView() const OVERRIDE;
111   virtual GURL SignInUrl() const OVERRIDE;
112   virtual bool ShouldOfferToSaveInChrome() const OVERRIDE;
113   virtual bool ShouldSaveInChrome() const OVERRIDE;
114   virtual ui::MenuModel* MenuModelForAccountChooser() OVERRIDE;
115   virtual gfx::Image AccountChooserImage() OVERRIDE;
116   virtual gfx::Image ButtonStripImage() const OVERRIDE;
117   virtual int GetDialogButtons() const OVERRIDE;
118   virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE;
119   virtual DialogOverlayState GetDialogOverlay() OVERRIDE;
120   virtual const std::vector<gfx::Range>& LegalDocumentLinks() OVERRIDE;
121   virtual bool SectionIsActive(DialogSection section) const OVERRIDE;
122   virtual const DetailInputs& RequestedFieldsForSection(DialogSection section)
123       const OVERRIDE;
124   virtual ui::ComboboxModel* ComboboxModelForAutofillType(
125       ServerFieldType type) OVERRIDE;
126   virtual ui::MenuModel* MenuModelForSection(DialogSection section) OVERRIDE;
127   virtual base::string16 LabelForSection(DialogSection section) const OVERRIDE;
128   virtual SuggestionState SuggestionStateForSection(
129       DialogSection section) OVERRIDE;
130   virtual FieldIconMap IconsForFields(const FieldValueMap& user_inputs)
131       const OVERRIDE;
132   virtual bool FieldControlsIcons(ServerFieldType type) const OVERRIDE;
133   virtual base::string16 TooltipForField(ServerFieldType type) const OVERRIDE;
134   virtual bool InputIsEditable(const DetailInput& input, DialogSection section)
135       OVERRIDE;
136   virtual base::string16 InputValidityMessage(DialogSection section,
137                                         ServerFieldType type,
138                                         const base::string16& value) OVERRIDE;
139   virtual ValidityMessages InputsAreValid(
140       DialogSection section, const FieldValueMap& inputs) OVERRIDE;
141   virtual void UserEditedOrActivatedInput(DialogSection section,
142                                           ServerFieldType type,
143                                           gfx::NativeView parent_view,
144                                           const gfx::Rect& content_bounds,
145                                           const base::string16& field_contents,
146                                           bool was_edit) OVERRIDE;
147   virtual bool HandleKeyPressEventInInput(
148       const content::NativeWebKeyboardEvent& event) OVERRIDE;
149   virtual void FocusMoved() OVERRIDE;
150   virtual bool ShouldShowErrorBubble() const OVERRIDE;
151   virtual void ViewClosed() OVERRIDE;
152   virtual std::vector<DialogNotification> CurrentNotifications() OVERRIDE;
153   virtual void LinkClicked(const GURL& url) OVERRIDE;
154   virtual void SignInLinkClicked() OVERRIDE;
155   virtual void NotificationCheckboxStateChanged(DialogNotification::Type type,
156                                                 bool checked) OVERRIDE;
157   virtual void LegalDocumentLinkClicked(const gfx::Range& range) OVERRIDE;
158   virtual bool OnCancel() OVERRIDE;
159   virtual bool OnAccept() OVERRIDE;
160   virtual Profile* profile() OVERRIDE;
161   virtual content::WebContents* GetWebContents() OVERRIDE;
162
163   // AutofillPopupDelegate implementation.
164   virtual void OnPopupShown() OVERRIDE;
165   virtual void OnPopupHidden() OVERRIDE;
166   virtual void DidSelectSuggestion(const base::string16& value,
167                                    int identifier) OVERRIDE;
168   virtual void DidAcceptSuggestion(const base::string16& value,
169                                    int identifier) OVERRIDE;
170   virtual void RemoveSuggestion(const base::string16& value,
171                                 int identifier) OVERRIDE;
172   virtual void ClearPreviewedForm() OVERRIDE;
173
174   // content::NotificationObserver implementation.
175   virtual void Observe(int type,
176                        const content::NotificationSource& source,
177                        const content::NotificationDetails& details) OVERRIDE;
178
179   // SuggestionsMenuModelDelegate implementation.
180   virtual void SuggestionItemSelected(SuggestionsMenuModel* model,
181                                       size_t index) OVERRIDE;
182
183   // wallet::WalletClientDelegate implementation.
184   virtual const AutofillMetrics& GetMetricLogger() const OVERRIDE;
185   virtual std::string GetRiskData() const OVERRIDE;
186   virtual std::string GetWalletCookieValue() const OVERRIDE;
187   virtual bool IsShippingAddressRequired() const OVERRIDE;
188   virtual void OnDidAcceptLegalDocuments() OVERRIDE;
189   virtual void OnDidAuthenticateInstrument(bool success) OVERRIDE;
190   virtual void OnDidGetFullWallet(
191       scoped_ptr<wallet::FullWallet> full_wallet) OVERRIDE;
192   virtual void OnDidGetWalletItems(
193       scoped_ptr<wallet::WalletItems> wallet_items) OVERRIDE;
194   virtual void OnDidSaveToWallet(
195       const std::string& instrument_id,
196       const std::string& address_id,
197       const std::vector<wallet::RequiredAction>& required_actions,
198       const std::vector<wallet::FormFieldError>& form_field_errors) OVERRIDE;
199   virtual void OnWalletError(
200       wallet::WalletClient::ErrorType error_type) OVERRIDE;
201
202   // PersonalDataManagerObserver implementation.
203   virtual void OnPersonalDataChanged() OVERRIDE;
204
205   // AccountChooserModelDelegate implementation.
206   virtual void AccountChoiceChanged() OVERRIDE;
207   virtual void AddAccount() OVERRIDE;
208   virtual void UpdateAccountChooserView() OVERRIDE;
209
210   // wallet::WalletSigninHelperDelegate implementation.
211   virtual void OnPassiveSigninSuccess() OVERRIDE;
212   virtual void OnPassiveSigninFailure(
213       const GoogleServiceAuthError& error) OVERRIDE;
214   virtual void OnDidFetchWalletCookieValue(
215       const std::string& cookie_value) OVERRIDE;
216
217   // gfx::AnimationDelegate implementation.
218   virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
219   virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
220
221   // ::i18n::addressinput::LoadRulesDelegate implementation.
222   virtual void OnAddressValidationRulesLoaded(const std::string& country_code,
223                                               bool success) OVERRIDE;
224
225  protected:
226   enum DialogSignedInState {
227     NOT_CHECKED,
228     REQUIRES_RESPONSE,
229     REQUIRES_SIGN_IN,
230     REQUIRES_PASSIVE_SIGN_IN,
231     SIGNED_IN,
232     SIGN_IN_DISABLED,
233   };
234
235   // Exposed for testing.
236   AutofillDialogControllerImpl(
237       content::WebContents* contents,
238       const FormData& form_structure,
239       const GURL& source_url,
240       const AutofillManagerDelegate::ResultCallback& callback);
241
242   // Exposed for testing.
243   AutofillDialogView* view() { return view_.get(); }
244   virtual AutofillDialogView* CreateView();
245   ServerFieldType popup_input_type() const {
246     return popup_input_type_;
247   }
248
249   // Returns the PersonalDataManager for |profile_|.
250   virtual PersonalDataManager* GetManager() const;
251
252   // Returns an address validation helper. May be NULL during tests.
253   virtual ::i18n::addressinput::AddressValidator* GetValidator();
254
255   // Returns the WalletClient* this class uses to talk to Online Wallet. Exposed
256   // for testing.
257   const wallet::WalletClient* GetWalletClient() const;
258   virtual wallet::WalletClient* GetWalletClient();
259
260   // Call to disable communication to Online Wallet for this dialog.
261   // Exposed for testing.
262   void DisableWallet(wallet::WalletClient::ErrorType error_type);
263
264   // Returns whether Wallet is the current data source. Exposed for testing.
265   virtual bool IsPayingWithWallet() const;
266
267   // Asks risk module to asynchronously load fingerprint data. Data will be
268   // returned via |OnDidLoadRiskFingerprintData()|. Exposed for testing.
269   virtual void LoadRiskFingerprintData();
270   virtual void OnDidLoadRiskFingerprintData(
271       scoped_ptr<risk::Fingerprint> fingerprint);
272
273   // Opens the given URL in a new foreground tab.
274   virtual void OpenTabWithUrl(const GURL& url);
275
276   // The active billing section for the current state of the dialog (e.g. when
277   // paying for wallet, the combined credit card + billing address section).
278   DialogSection ActiveBillingSection() const;
279
280   // Whether |section| was sent into edit mode based on existing data. This
281   // happens when a user clicks "Edit" or a suggestion is invalid.
282   virtual bool IsEditingExistingData(DialogSection section) const;
283
284   // Whether the user has chosen to enter all new data in |section|. This
285   // happens via choosing "Add a new X..." from a section's suggestion menu.
286   bool IsManuallyEditingSection(DialogSection section) const;
287
288   // Should be called on the Wallet sign-in error.
289   virtual void OnWalletSigninError();
290
291   // Whether submission is currently waiting for |action| to be handled.
292   bool IsSubmitPausedOn(wallet::RequiredAction action) const;
293
294   // Shows a new credit card saved bubble and passes ownership of |new_card| and
295   // |billing_profile| to the bubble. Exposed for testing.
296   virtual void ShowNewCreditCardBubble(
297       scoped_ptr<CreditCard> new_card,
298       scoped_ptr<AutofillProfile> billing_profile);
299
300   // Called when there's nothing left to accept, update, save, or authenticate
301   // in order to fill |form_structure_| and pass data back to the invoking page.
302   void DoFinishSubmit();
303
304   // Delays enabling submit button for a short period of time. Exposed for
305   // testing.
306   virtual void SubmitButtonDelayBegin();
307
308   // Ends the delay for enabling the submit button. Called only from tests.
309   // Without this method, the tests would have to wait for the delay timer to
310   // finish, which would be flaky.
311   void SubmitButtonDelayEndForTesting();
312
313   // Resets |last_wallet_items_fetch_timestamp_| for testing.
314   void ClearLastWalletItemsFetchTimestampForTesting();
315
316   // Allows tests to inspect the state of the account chooser.
317   AccountChooserModel* AccountChooserModelForTesting();
318
319   // Returns whether |url| matches the sign in continue URL. If so, also fills
320   // in |user_index| with the index of the user account that just signed in.
321   virtual bool IsSignInContinueUrl(const GURL& url, size_t* user_index) const;
322
323   // Whether the user is known to be signed in.
324   DialogSignedInState SignedInState() const;
325
326  private:
327   FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerI18nTest,
328                            CorrectCountryFromInputs);
329
330   // Initializes or updates |suggested_cc_| et al.
331   void SuggestionsUpdated();
332
333   // Starts fetching the wallet items from Online Wallet.
334   void GetWalletItems();
335
336   // Stop showing sign in flow.
337   void HideSignIn();
338
339   // Handles the SignedInState() on Wallet or sign-in state update.
340   // Triggers the user name fetch and passive sign-in.
341   void SignedInStateUpdated();
342
343   // Refreshes the model on Wallet or sign-in state update.
344   void OnWalletOrSigninUpdate();
345
346   // Called when a Save or Update call to Wallet has validation errors.
347   void OnWalletFormFieldError(
348       const std::vector<wallet::FormFieldError>& form_field_errors);
349
350   // Calculates |legal_documents_text_| and |legal_document_link_ranges_|.
351   void ConstructLegalDocumentsText();
352
353   // Clears previously entered manual input and removes |section| from
354   // |section_editing_state_|. Does not update the view.
355   void ResetSectionInput(DialogSection section);
356
357   // Force |section| into edit mode if the current suggestion is invalid.
358   void ShowEditUiIfBadSuggestion(DialogSection section);
359
360   // Whether the |value| of |input| should be preserved on account change.
361   bool InputWasEdited(ServerFieldType type,
362                       const base::string16& value);
363
364   // Takes a snapshot of the newly inputted user data in |view_| (if it exists).
365   FieldValueMap TakeUserInputSnapshot();
366
367   // Fills the detail inputs from a previously taken user input snapshot. Does
368   // not update the view.
369   void RestoreUserInputFromSnapshot(const FieldValueMap& snapshot);
370
371   // Tells the view to update |section|.
372   void UpdateSection(DialogSection section);
373
374   // Tells |view_| to update the validity status of its detail inputs (if
375   // |view_| is non-null). Currently this is used solely for highlighting
376   // invalid suggestions, so if no sections are based on existing data,
377   // |view_->UpdateForErrors()| is not called.
378   void UpdateForErrors();
379
380   // Renders and returns one frame of the generated card animation.
381   gfx::Image GetGeneratedCardImage(const base::string16& card_number,
382                                    const base::string16& name,
383                                    const SkColor& gradient_top,
384                                    const SkColor& gradient_bottom);
385
386   // Kicks off |card_scrambling_refresher_|.
387   void StartCardScramblingRefresher();
388
389   // Changes |scrambled_card_number_| and pushes an update to the view.
390   void RefreshCardScramblingOverlay();
391
392   // Tells the view to update the overlay.
393   void PushOverlayUpdate();
394
395   // Creates a DataModelWrapper item for the item that's checked in the
396   // suggestion model for |section|. This may represent Autofill
397   // data or Wallet data, depending on whether Wallet is currently enabled.
398   scoped_ptr<DataModelWrapper> CreateWrapper(DialogSection section);
399
400   // Helper to return the current Wallet instrument or address. If the dialog
401   // isn't using Wallet or the user is adding a new instrument or address, NULL
402   // will be returned.
403   const wallet::WalletItems::MaskedInstrument* ActiveInstrument() const;
404   const wallet::Address* ActiveShippingAddress() const;
405
406   // Fills in |section|-related fields in |output_| according to the state of
407   // |view_|.
408   void FillOutputForSection(DialogSection section);
409   // As above, but uses |compare| to determine whether a DetailInput matches
410   // a field. Saves any new Autofill data to the PersonalDataManager.
411   void FillOutputForSectionWithComparator(
412       DialogSection section,
413       const FormStructure::InputFieldComparator& compare);
414
415   // Returns whether |form_structure|_| has any fields that match the fieldset
416   // represented by |section|.
417   bool FormStructureCaresAboutSection(DialogSection section) const;
418
419   // Finds all fields of the given |type| in |form_structure_|, if any, and sets
420   // each field's value to |output|.
421   void SetOutputForFieldsOfType(ServerFieldType type,
422                                 const base::string16& output);
423
424   // Gets the value for |type| in |section|, whether it comes from manual user
425   // input or the active suggestion.
426   base::string16 GetValueFromSection(DialogSection section,
427                                      ServerFieldType type);
428
429   // Returns whether the given section can accept an address with the given
430   // country code.
431   bool CanAcceptCountry(DialogSection section, const std::string& country_code);
432
433   // Whether |profile| should be suggested for |section|.
434   bool ShouldSuggestProfile(DialogSection section,
435                             const AutofillProfile& profile);
436
437   // Gets the SuggestionsMenuModel for |section|.
438   SuggestionsMenuModel* SuggestionsMenuModelForSection(DialogSection section);
439   const SuggestionsMenuModel* SuggestionsMenuModelForSection(
440       DialogSection section) const;
441   // And the reverse.
442   DialogSection SectionForSuggestionsMenuModel(
443       const SuggestionsMenuModel& model);
444
445   // Gets the CountryComboboxModel for |section|.
446   CountryComboboxModel* CountryComboboxModelForSection(DialogSection section);
447
448   // Clears and builds the inputs in |section| for |country_name|.
449   // When |should_clobber| is false, and the view's country value matches
450   // |country_name|, the inputs won't be rebuilt.
451   bool RebuildInputsForCountry(DialogSection section,
452                                const base::string16& country_name,
453                                bool should_clobber);
454
455   // Suggested text and icons for sections. Suggestion text is used to show an
456   // abridged overview of the currently used suggestion. Extra text is used when
457   // part of a section is suggested but part must be manually input (e.g. during
458   // a CVC challenge or when using Autofill's CC section [never stores CVC]).
459   bool SuggestionTextForSection(DialogSection section,
460                                 base::string16* vertically_compact,
461                                 base::string16* horizontally_compact);
462   base::string16 RequiredActionTextForSection(DialogSection section) const;
463   gfx::Image SuggestionIconForSection(DialogSection section);
464   base::string16 ExtraSuggestionTextForSection(DialogSection section) const;
465   gfx::Image ExtraSuggestionIconForSection(DialogSection section);
466
467   // Suggests address completions using the downloaded i18n validation rules.
468   // Stores the suggestions in |i18n_validator_suggestions_|.
469   void GetI18nValidatorSuggestions(DialogSection section,
470                                    ServerFieldType type,
471                                    std::vector<base::string16>* popup_values,
472                                    std::vector<base::string16>* popup_labels,
473                                    std::vector<base::string16>* popup_icons);
474
475   // Like RequestedFieldsForSection, but returns a pointer.
476   DetailInputs* MutableRequestedFieldsForSection(DialogSection section);
477
478   // Returns a pointer to the language code that should be used for formatting
479   // the address in |section| for display. Returns NULL for a non-address
480   // |section|.
481   std::string* MutableAddressLanguageCodeForSection(DialogSection section);
482
483   // Returns the language code that should be used for formatting the address in
484   // |section|. Returns an empty string for a non-address |section|.
485   std::string AddressLanguageCodeForSection(DialogSection section);
486
487   // Returns just the |type| attributes of RequestedFieldsForSection(section).
488   std::vector<ServerFieldType> RequestedTypesForSection(DialogSection section)
489       const;
490
491   // Returns the country code (e.g. "US") for |section|.
492   std::string CountryCodeForSection(DialogSection section);
493
494   // Hides |popup_controller_|'s popup view, if it exists.
495   void HidePopup();
496
497   // Set whether the currently editing |section| was originally based on
498   // existing Wallet or Autofill data.
499   void SetEditingExistingData(DialogSection section, bool editing);
500
501   // Whether the user has chosen to enter all new data in at least one section.
502   bool IsManuallyEditingAnySection() const;
503
504   // Returns validity message for a given credit card number.
505   base::string16 CreditCardNumberValidityMessage(
506       const base::string16& number) const;
507
508   // Whether all of the input fields currently showing in the dialog have valid
509   // contents. This validates only by checking "sure" messages, i.e. messages
510   // that would have been displayed to the user during editing, as opposed to
511   // submission.
512   bool AllSectionsAreValid();
513
514   // Whether all of the input fields currently showing in the given |section| of
515   // the dialog have valid contents. This validates only by checking "sure"
516   // messages - see AllSectionsAreValid.
517   bool SectionIsValid(DialogSection section);
518
519   // Whether validation rules for |section| are loaded.
520   bool RulesAreLoaded(DialogSection section);
521
522   // Whether the currently active credit card expiration date is valid.
523   bool IsCreditCardExpirationValid(const base::string16& year,
524                                    const base::string16& month) const;
525
526   // Returns true if |profile| has an address we can be sure is invalid.
527   // Profiles with invalid addresses are not suggested in the dropdown menu for
528   // billing and shipping addresses.
529   bool HasInvalidAddress(const AutofillProfile& profile);
530
531   // Returns true if |key| refers to a suggestion, as opposed to some control
532   // menu item.
533   bool IsASuggestionItemKey(const std::string& key) const;
534
535   // Returns whether Autofill is enabled for |profile_|.
536   bool IsAutofillEnabled() const;
537
538   // Whether the billing section should be used to fill in the shipping details.
539   bool ShouldUseBillingForShipping();
540
541   // Whether the user wishes to save information locally to Autofill.
542   bool ShouldSaveDetailsLocally();
543
544   // Change whether the controller is currently submitting details to Autofill
545   // or Online Wallet (|is_submitting_|) and update the view.
546   void SetIsSubmitting(bool submitting);
547
548   // Whether the user has accepted all the current legal documents' terms.
549   bool AreLegalDocumentsCurrent() const;
550
551   // Accepts any pending legal documents now that the user has pressed Submit.
552   void AcceptLegalTerms();
553
554   // Start the submit proccess to interact with Online Wallet (might do various
555   // things like accept documents, save details, update details, respond to
556   // required actions, etc.).
557   void SubmitWithWallet();
558
559   // Creates an instrument based on |views_|' contents.
560   scoped_ptr<wallet::Instrument> CreateTransientInstrument();
561
562   // Creates an address based on the contents of |view_|.
563   scoped_ptr<wallet::Address> CreateTransientAddress();
564
565   // Gets a full wallet from Online Wallet so the user can purchase something.
566   // This information is decoded to reveal a fronting (proxy) card.
567   void GetFullWallet();
568
569   // Updates the state of the controller and |view_| based on any required
570   // actions returned by Save or Update calls to Wallet.
571   void HandleSaveOrUpdateRequiredActions(
572       const std::vector<wallet::RequiredAction>& required_actions);
573
574   // Shows a card generation overlay if necessary, then calls DoFinishSubmit.
575   void FinishSubmit();
576
577   // Writes to prefs the choice of AutofillDataModel for |section|.
578   void PersistAutofillChoice(DialogSection section,
579                              const std::string& guid);
580
581   // Sets the outparams to the default AutofillDataModel for |section| (which is
582   // the first one in the menu that is a suggestion item).
583   void GetDefaultAutofillChoice(DialogSection section,
584                                 std::string* guid);
585
586   // Reads from prefs the choice of AutofillDataModel for |section|. Returns
587   // whether there was a setting to read.
588   bool GetAutofillChoice(DialogSection section,
589                          std::string* guid);
590
591   // Logs metrics when the dialog is submitted.
592   void LogOnFinishSubmitMetrics();
593
594   // Logs metrics when the dialog is canceled.
595   void LogOnCancelMetrics();
596
597   // Logs metrics when the edit ui is shown for the given |section|.
598   void LogEditUiShownMetric(DialogSection section);
599
600   // Logs metrics when a suggestion item from the given |model| is selected.
601   void LogSuggestionItemSelectedMetric(const SuggestionsMenuModel& model);
602
603   // Logs the time elapsed from when the dialog was shown to when the user could
604   // interact with it.
605   void LogDialogLatencyToShow();
606
607   // Returns the metric corresponding to the user's initial state when
608   // interacting with this dialog.
609   AutofillMetrics::DialogInitialUserStateMetric GetInitialUserState() const;
610
611   // Shows an educational bubble if a new credit card was saved or the first few
612   // times an Online Wallet fronting card was generated.
613   void MaybeShowCreditCardBubble();
614
615   // Called when the delay for enabling the submit button ends.
616   void OnSubmitButtonDelayEnd();
617
618   // Gets the user's current Wallet cookie (gdToken) from the cookie jar.
619   void FetchWalletCookie();
620
621   // The |profile| for |contents_|.
622   Profile* const profile_;
623
624   // For logging UMA metrics.
625   const AutofillMetrics metric_logger_;
626   base::Time dialog_shown_timestamp_;
627   AutofillMetrics::DialogInitialUserStateMetric initial_user_state_;
628
629   FormStructure form_structure_;
630
631   // Whether the URL visible to the user when this dialog was requested to be
632   // invoked is the same as |source_url_|.
633   bool invoked_from_same_origin_;
634
635   // The URL of the invoking site.
636   GURL source_url_;
637
638   // The callback via which we return the collected data.
639   AutofillManagerDelegate::ResultCallback callback_;
640
641   // The AccountChooserModel acts as the MenuModel for the account chooser,
642   // and also tracks which data source the dialog is using.
643   scoped_ptr<AccountChooserModel> account_chooser_model_;
644
645   // The sign-in helper to fetch the user's Wallet cookie and to perform passive
646   // sign-in. The helper is set only during fetch/sign-in, and NULL otherwise.
647   scoped_ptr<wallet::WalletSigninHelper> signin_helper_;
648
649   // A client to talk to the Online Wallet API.
650   wallet::WalletClient wallet_client_;
651
652   // A helper to validate international address input.
653   scoped_ptr< ::i18n::addressinput::AddressValidator> validator_;
654
655   // True if |this| has ever called GetWalletItems().
656   bool wallet_items_requested_;
657
658   // True when the user has clicked the "Use Wallet" link and we're waiting to
659   // figure out whether we need to ask them to actively sign in.
660   bool handling_use_wallet_link_click_;
661
662   // True when the current WalletItems has a passive auth action which was
663   // attempted and failed.
664   bool passive_failed_;
665
666   // Recently received items retrieved via |wallet_client_|.
667   scoped_ptr<wallet::WalletItems> wallet_items_;
668   scoped_ptr<wallet::FullWallet> full_wallet_;
669
670   // The default active instrument and shipping address object IDs as of the
671   // last time Wallet items were fetched. These variables are only set
672   // (i.e. non-empty) when the Wallet items are being re-fetched.
673   std::string previous_default_instrument_id_;
674   std::string previous_default_shipping_address_id_;
675   // The last active instrument and shipping address object IDs. These
676   // variables are only set (i.e. non-empty) when the Wallet items are being
677   // re-fetched.
678   std::string previously_selected_instrument_id_;
679   std::string previously_selected_shipping_address_id_;
680
681   // When the Wallet items were last fetched.
682   base::TimeTicks last_wallet_items_fetch_timestamp_;
683
684   // Local machine signals to pass along on each request to trigger (or
685   // discourage) risk challenges; sent if the user is up to date on legal docs.
686   std::string risk_data_;
687
688   // The text to display when the user is accepting new terms of service, etc.
689   base::string16 legal_documents_text_;
690   // The ranges within |legal_documents_text_| to linkify.
691   std::vector<gfx::Range> legal_document_link_ranges_;
692
693   // The instrument and address IDs from the Online Wallet server to be used
694   // when getting a full wallet.
695   std::string active_instrument_id_;
696   std::string active_address_id_;
697
698   // The fields for billing and shipping which the page has actually requested.
699   DetailInputs requested_cc_fields_;
700   DetailInputs requested_billing_fields_;
701   DetailInputs requested_cc_billing_fields_;
702   DetailInputs requested_shipping_fields_;
703
704   // The BCP 47 language codes used for formatting the addresses for display.
705   std::string billing_address_language_code_;
706   std::string shipping_address_language_code_;
707
708   // Models for the credit card expiration inputs.
709   MonthComboboxModel cc_exp_month_combobox_model_;
710   YearComboboxModel cc_exp_year_combobox_model_;
711
712   // Models for country input.
713   scoped_ptr<CountryComboboxModel> billing_country_combobox_model_;
714   scoped_ptr<CountryComboboxModel> shipping_country_combobox_model_;
715
716   // Models for the suggestion views.
717   SuggestionsMenuModel suggested_cc_;
718   SuggestionsMenuModel suggested_billing_;
719   SuggestionsMenuModel suggested_cc_billing_;
720   SuggestionsMenuModel suggested_shipping_;
721
722   // |DialogSection|s that are in edit mode that are based on existing data.
723   std::set<DialogSection> section_editing_state_;
724
725   // Sections that need to be validated when their validation rules load.
726   std::set<DialogSection> needs_validation_;
727
728   // Whether |form_structure_| has asked for any details that would indicate
729   // we should show a shipping section.
730   bool cares_about_shipping_;
731
732   // The GUIDs for the currently showing unverified profiles popup.
733   std::vector<PersonalDataManager::GUIDPair> popup_guids_;
734
735   // The autofill suggestions based on downloaded i18n validation rules.
736   std::vector< ::i18n::addressinput::AddressData> i18n_validator_suggestions_;
737
738   // The controller for the currently showing popup (which helps users when
739   // they're manually filling the dialog).
740   base::WeakPtr<AutofillPopupControllerImpl> popup_controller_;
741
742   // The type of the visible Autofill popup input (or UNKNOWN_TYPE if none).
743   ServerFieldType popup_input_type_;
744
745   scoped_ptr<AutofillDialogView> view_;
746
747   // A NotificationRegistrar for tracking the completion of sign-in.
748   content::NotificationRegistrar signin_registrar_;
749
750   // Set to true when the user presses the sign in link, until we're ready to
751   // show the normal dialog again. This is used to hide the buttons while
752   // the spinner is showing after an explicit sign in.
753   bool waiting_for_explicit_sign_in_response_;
754
755   // Whether a user accepted legal documents while this dialog is running.
756   bool has_accepted_legal_documents_;
757
758   // True after the user first accepts the dialog and presses "Submit". May
759   // continue to be true while processing required actions.
760   bool is_submitting_;
761
762   // True if the last call to |GetFullWallet()| returned a
763   // CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS required action, indicating that the
764   // selected instrument or address had become invalid since it was originally
765   // returned in |GetWalletItems()|.
766   bool choose_another_instrument_or_address_;
767
768   // Whether or not the server side validation errors returned by Wallet were
769   // recoverable.
770   bool wallet_server_validation_recoverable_;
771
772   // Whether |callback_| was Run() with a filled |form_structure_|.
773   bool data_was_passed_back_;
774
775   typedef std::map<ServerFieldType,
776       std::pair<base::string16, base::string16> > TypeErrorInputMap;
777   typedef std::map<DialogSection, TypeErrorInputMap> WalletValidationErrors;
778   // Wallet validation errors. section->type->(error_msg, input_value).
779   WalletValidationErrors wallet_errors_;
780
781   // The notification that describes the current wallet error, if any.
782   scoped_ptr<DialogNotification> wallet_error_notification_;
783
784   // Whether the latency to display to the UI was logged to UMA yet.
785   bool was_ui_latency_logged_;
786
787   // The Google Wallet cookie value, set as an authorization header on requests
788   // to Wallet.
789   std::string wallet_cookie_value_;
790
791   // A map from dialog sections to the GUID of a newly saved Autofill data
792   // models for that section. No entries present that don't have newly saved
793   // data models.
794   std::map<DialogSection, std::string> newly_saved_data_model_guids_;
795
796   // Populated if the user chose to save a newly inputted credit card. Used to
797   // show a bubble as the dialog closes to confirm a user's new card info was
798   // saved. Never populated while incognito (as nothing's actually saved).
799   scoped_ptr<CreditCard> newly_saved_card_;
800
801   // The last four digits of the backing card used for the current run of the
802   // dialog. Only applies to Wallet and is populated on submit.
803   base::string16 backing_card_last_four_;
804
805   // The timer that delays enabling submit button for a short period of time on
806   // startup.
807   base::OneShotTimer<AutofillDialogControllerImpl> submit_button_delay_timer_;
808
809   // The card scrambling animation displays a random number in place of an
810   // actual credit card number. This is that random number.
811   base::string16 scrambled_card_number_;
812
813   // Two timers to deal with the card scrambling animation. The first provides
814   // a one second delay before the numbers start scrambling. The second controls
815   // the rate of refresh for the number scrambling.
816   base::OneShotTimer<AutofillDialogControllerImpl> card_scrambling_delay_;
817   base::RepeatingTimer<AutofillDialogControllerImpl> card_scrambling_refresher_;
818
819   // An animation which controls the background fade when the card is done
820   // scrambling.
821   gfx::LinearAnimation card_generated_animation_;
822
823   // A username string we display in the card scrambling/generated overlay.
824   base::string16 submitted_cardholder_name_;
825
826   base::WeakPtrFactory<AutofillDialogControllerImpl> weak_ptr_factory_;
827
828   DISALLOW_COPY_AND_ASSIGN(AutofillDialogControllerImpl);
829 };
830
831 }  // namespace autofill
832
833 #endif  // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_CONTROLLER_IMPL_H_