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