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