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