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