Index: chrome/browser/ui/autofill/autofill_dialog_controller_impl.h |
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h |
deleted file mode 100644 |
index 2542894fea8db3ee5fa0f088c48f2aff4197f504..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h |
+++ /dev/null |
@@ -1,589 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_CONTROLLER_IMPL_H_ |
-#define CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_CONTROLLER_IMPL_H_ |
- |
-#include <stddef.h> |
- |
-#include <memory> |
-#include <set> |
-#include <vector> |
- |
-#include "base/gtest_prod_util.h" |
-#include "base/macros.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/strings/string16.h" |
-#include "base/time/time.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_controller.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_models.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_types.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h" |
-#include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h" |
-#include "chrome/browser/ui/autofill/country_combobox_model.h" |
-#include "components/autofill/core/browser/autofill_client.h" |
-#include "components/autofill/core/browser/autofill_metrics.h" |
-#include "components/autofill/core/browser/autofill_popup_delegate.h" |
-#include "components/autofill/core/browser/field_types.h" |
-#include "components/autofill/core/browser/form_structure.h" |
-#include "components/autofill/core/browser/personal_data_manager.h" |
-#include "components/autofill/core/browser/personal_data_manager_observer.h" |
-#include "content/public/browser/notification_observer.h" |
-#include "content/public/browser/notification_registrar.h" |
-#include "content/public/browser/web_contents_observer.h" |
-#include "content/public/common/ssl_status.h" |
-#include "third_party/libaddressinput/chromium/chrome_address_validator.h" |
-#include "third_party/skia/include/core/SkColor.h" |
-#include "ui/base/models/simple_menu_model.h" |
-#include "ui/base/ui_base_types.h" |
-#include "ui/gfx/animation/animation_delegate.h" |
-#include "ui/gfx/animation/linear_animation.h" |
-#include "url/gurl.h" |
- |
-class Profile; |
- |
-namespace content { |
-class WebContents; |
-} |
- |
-namespace i18n { |
-namespace addressinput { |
-struct AddressData; |
-} |
-} |
- |
-namespace autofill { |
- |
-class AutofillDataModel; |
-class AutofillDialogView; |
-class AutofillPopupControllerImpl; |
-class DataModelWrapper; |
- |
-namespace risk { |
-class Fingerprint; |
-} |
- |
-namespace wallet { |
-class WalletSigninHelper; |
-} |
- |
-// This class drives the dialog that appears when a site uses the imperative |
-// autocomplete API to fill out a form. |
-class AutofillDialogControllerImpl |
- : public AutofillDialogViewDelegate, |
- public AutofillDialogController, |
- public AutofillPopupDelegate, |
- public content::WebContentsObserver, |
- public SuggestionsMenuModelDelegate, |
- public PersonalDataManagerObserver, |
- public LoadRulesListener { |
- public: |
- ~AutofillDialogControllerImpl() override; |
- |
- static base::WeakPtr<AutofillDialogControllerImpl> Create( |
- content::WebContents* contents, |
- const FormData& form_structure, |
- const GURL& source_url, |
- const AutofillClient::ResultCallback& callback); |
- |
- // AutofillDialogController implementation. |
- void Show() override; |
- void Hide() override; |
- void TabActivated() override; |
- |
- // AutofillDialogViewDelegate implementation. |
- base::string16 DialogTitle() const override; |
- base::string16 EditSuggestionText() const override; |
- base::string16 CancelButtonText() const override; |
- base::string16 ConfirmButtonText() const override; |
- base::string16 SaveLocallyText() const override; |
- base::string16 SaveLocallyTooltip() const override; |
- bool ShouldOfferToSaveInChrome() const override; |
- bool ShouldSaveInChrome() const override; |
- int GetDialogButtons() const override; |
- bool IsDialogButtonEnabled(ui::DialogButton button) const override; |
- bool SectionIsActive(DialogSection section) const override; |
- const DetailInputs& RequestedFieldsForSection( |
- DialogSection section) const override; |
- ui::ComboboxModel* ComboboxModelForAutofillType( |
- ServerFieldType type) override; |
- ui::MenuModel* MenuModelForSection(DialogSection section) override; |
- base::string16 LabelForSection(DialogSection section) const override; |
- SuggestionState SuggestionStateForSection(DialogSection section) override; |
- FieldIconMap IconsForFields(const FieldValueMap& user_inputs) const override; |
- bool FieldControlsIcons(ServerFieldType type) const override; |
- base::string16 TooltipForField(ServerFieldType type) const override; |
- base::string16 InputValidityMessage(DialogSection section, |
- ServerFieldType type, |
- const base::string16& value) override; |
- ValidityMessages InputsAreValid(DialogSection section, |
- const FieldValueMap& inputs) override; |
- void UserEditedOrActivatedInput(DialogSection section, |
- ServerFieldType type, |
- gfx::NativeView parent_view, |
- const gfx::Rect& content_bounds, |
- const base::string16& field_contents, |
- bool was_edit) override; |
- bool HandleKeyPressEventInInput( |
- const content::NativeWebKeyboardEvent& event) override; |
- void FocusMoved() override; |
- bool ShouldShowErrorBubble() const override; |
- void ViewClosed() override; |
- std::vector<DialogNotification> CurrentNotifications() override; |
- void LinkClicked(const GURL& url) override; |
- void OnCancel() override; |
- void OnAccept() override; |
- Profile* profile() override; |
- content::WebContents* GetWebContents() override; |
- |
- // AutofillPopupDelegate implementation. |
- void OnPopupShown() override; |
- void OnPopupHidden() override; |
- void DidSelectSuggestion(const base::string16& value, |
- int identifier) override; |
- void DidAcceptSuggestion(const base::string16& value, |
- int identifier, |
- int position) override; |
- bool GetDeletionConfirmationText(const base::string16& value, |
- int identifier, |
- base::string16* title, |
- base::string16* body) override; |
- bool RemoveSuggestion(const base::string16& value, int identifier) override; |
- void ClearPreviewedForm() override; |
- |
- |
- // SuggestionsMenuModelDelegate implementation. |
- void SuggestionItemSelected(SuggestionsMenuModel* model, |
- size_t index) override; |
- |
- // PersonalDataManagerObserver implementation. |
- void OnPersonalDataChanged() override; |
- |
- // LoadRulesListener implementation. |
- void OnAddressValidationRulesLoaded(const std::string& country_code, |
- bool success) override; |
- |
- protected: |
- // Exposed for testing. |
- AutofillDialogControllerImpl(content::WebContents* contents, |
- const FormData& form_structure, |
- const GURL& source_url, |
- const AutofillClient::ResultCallback& callback); |
- |
- // Exposed for testing. |
- AutofillDialogView* view() { return view_.get(); } |
- virtual AutofillDialogView* CreateView(); |
- ServerFieldType popup_input_type() const { |
- return popup_input_type_; |
- } |
- |
- // Returns the PersonalDataManager for |profile_|. |
- virtual PersonalDataManager* GetManager() const; |
- |
- // Returns an address validation helper. May be NULL during tests. |
- virtual AddressValidator* GetValidator(); |
- |
- // Opens the given URL in a new foreground tab. |
- virtual void OpenTabWithUrl(const GURL& url); |
- |
- // The active billing section for the current state of the dialog (e.g. when |
- // paying for wallet, the combined credit card + billing address section). |
- DialogSection ActiveBillingSection() const; |
- |
- // Whether |section| was sent into edit mode based on existing data. This |
- // happens when a user clicks "Edit" or a suggestion is invalid. |
- virtual bool IsEditingExistingData(DialogSection section) const; |
- |
- // Whether the user has chosen to enter all new data in |section|. This |
- // happens via choosing "Add a new X..." from a section's suggestion menu. |
- bool IsManuallyEditingSection(DialogSection section) const; |
- |
- // Delays enabling submit button for a short period of time. Exposed for |
- // testing. |
- virtual void SubmitButtonDelayBegin(); |
- |
- void FinishSubmit(); |
- |
- // Ends the delay for enabling the submit button. Called only from tests. |
- // Without this method, the tests would have to wait for the delay timer to |
- // finish, which would be flaky. |
- void SubmitButtonDelayEndForTesting(); |
- |
- private: |
- FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest, |
- AutocompleteEvent); |
- FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest, |
- AutocompleteErrorEventReasonCancel); |
- FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest, |
- AutocompleteErrorEventReasonInvalid); |
- FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest, |
- ErrorWithFrameNavigation); |
- FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest, |
- FillFormIncludesCVC); |
- FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest, |
- Submit); |
- FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest, |
- TransactionAmount); |
- FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest, |
- TransactionAmountReadonly); |
- |
- // Initializes or updates |suggested_cc_| et al. |
- void SuggestionsUpdated(); |
- |
- // Starts fetching the wallet items from Online Wallet. |
- void GetWalletItems(); |
- |
- // Clears previously entered manual input and removes |section| from |
- // |section_editing_state_|. Does not update the view. |
- void ResetSectionInput(DialogSection section); |
- |
- // Force |section| into edit mode if the current suggestion is invalid. |
- void ShowEditUiIfBadSuggestion(DialogSection section); |
- |
- // Whether the |value| of |input| should be preserved on account change. |
- bool InputWasEdited(ServerFieldType type, |
- const base::string16& value); |
- |
- // Takes a snapshot of the newly inputted user data in |view_| (if it exists). |
- FieldValueMap TakeUserInputSnapshot(); |
- |
- // Fills the detail inputs from a previously taken user input snapshot. Does |
- // not update the view. |
- void RestoreUserInputFromSnapshot(const FieldValueMap& snapshot); |
- |
- // Tells the view to update |section|. |
- void UpdateSection(DialogSection section); |
- |
- // Tells |view_| to update the validity status of its detail inputs (if |
- // |view_| is non-null). Currently this is used solely for highlighting |
- // invalid suggestions, so if no sections are based on existing data, |
- // |view_->UpdateForErrors()| is not called. |
- void UpdateForErrors(); |
- |
- // Creates a DataModelWrapper item for the item that's checked in the |
- // suggestion model for |section|. This may represent Autofill |
- // data or Wallet data, depending on whether Wallet is currently enabled. |
- std::unique_ptr<DataModelWrapper> CreateWrapper(DialogSection section); |
- |
- // Fills in |section|-related fields in |output_| according to the state of |
- // |view_|. |
- void FillOutputForSection(DialogSection section); |
- // As above, but uses |compare| to determine whether a DetailInput matches |
- // a field. Saves any new Autofill data to the PersonalDataManager. |
- void FillOutputForSectionWithComparator( |
- DialogSection section, |
- const FormStructure::InputFieldComparator& compare); |
- |
- // Returns whether |form_structure|_| has any fields that match the fieldset |
- // represented by |section|. |
- bool FormStructureCaresAboutSection(DialogSection section) const; |
- |
- // Finds all fields of the given |type| in |form_structure_|, if any, and sets |
- // each field's value to |output|. |
- void SetOutputForFieldsOfType(ServerFieldType type, |
- const base::string16& output); |
- |
- // Gets the value for |type| in |section|, whether it comes from manual user |
- // input or the active suggestion. |
- base::string16 GetValueFromSection(DialogSection section, |
- ServerFieldType type); |
- |
- // Returns whether the given section can accept an address with the given |
- // country code. |
- bool CanAcceptCountry(DialogSection section, const std::string& country_code); |
- |
- // Whether |profile| should be suggested for |section|. |
- bool ShouldSuggestProfile(DialogSection section, |
- const AutofillProfile& profile); |
- |
- // Gets the SuggestionsMenuModel for |section|. |
- SuggestionsMenuModel* SuggestionsMenuModelForSection(DialogSection section); |
- const SuggestionsMenuModel* SuggestionsMenuModelForSection( |
- DialogSection section) const; |
- // And the reverse. |
- DialogSection SectionForSuggestionsMenuModel( |
- const SuggestionsMenuModel& model); |
- |
- // Gets the CountryComboboxModel for |section|. |
- CountryComboboxModel* CountryComboboxModelForSection(DialogSection section); |
- |
- // Clears and builds the inputs in |section| for |country_name|. |
- // When |should_clobber| is false, and the view's country value matches |
- // |country_name|, the inputs won't be rebuilt. |
- bool RebuildInputsForCountry(DialogSection section, |
- const base::string16& country_name, |
- bool should_clobber); |
- |
- // Suggested text and icons for sections. Suggestion text is used to show an |
- // abridged overview of the currently used suggestion. Extra text is used when |
- // part of a section is suggested but part must be manually input (e.g. during |
- // a CVC challenge or when using Autofill's CC section [never stores CVC]). |
- bool SuggestionTextForSection(DialogSection section, |
- base::string16* vertically_compact, |
- base::string16* horizontally_compact); |
- gfx::Image SuggestionIconForSection(DialogSection section); |
- base::string16 ExtraSuggestionTextForSection(DialogSection section) const; |
- gfx::Image ExtraSuggestionIconForSection(DialogSection section); |
- |
- // Suggests address completions using the downloaded i18n validation rules. |
- // Stores the suggestions in |i18n_validator_suggestions_|. |
- void GetI18nValidatorSuggestions( |
- DialogSection section, |
- ServerFieldType type, |
- std::vector<autofill::Suggestion>* popup_suggestions); |
- |
- // Like RequestedFieldsForSection, but returns a pointer. |
- DetailInputs* MutableRequestedFieldsForSection(DialogSection section); |
- |
- // Returns a pointer to the language code that should be used for formatting |
- // the address in |section| for display. Returns NULL for a non-address |
- // |section|. |
- std::string* MutableAddressLanguageCodeForSection(DialogSection section); |
- |
- // Returns the language code that should be used for formatting the address in |
- // |section|. Returns an empty string for a non-address |section|. |
- std::string AddressLanguageCodeForSection(DialogSection section); |
- |
- // Returns just the |type| attributes of RequestedFieldsForSection(section). |
- std::vector<ServerFieldType> RequestedTypesForSection(DialogSection section) |
- const; |
- |
- // Returns the country code (e.g. "US") for |section|. |
- std::string CountryCodeForSection(DialogSection section); |
- |
- // Hides |popup_controller_|'s popup view, if it exists. |
- void HidePopup(); |
- |
- // Set whether the currently editing |section| was originally based on |
- // existing Wallet or Autofill data. |
- void SetEditingExistingData(DialogSection section, bool editing); |
- |
- // Whether the user has chosen to enter all new data in at least one section. |
- bool IsManuallyEditingAnySection() const; |
- |
- // Returns validity message for a given credit card number. |
- base::string16 CreditCardNumberValidityMessage( |
- const base::string16& number) const; |
- |
- // Whether all of the input fields currently showing in the dialog have valid |
- // contents. This validates only by checking "sure" messages, i.e. messages |
- // that would have been displayed to the user during editing, as opposed to |
- // submission. |
- bool AllSectionsAreValid(); |
- |
- // Whether all of the input fields currently showing in the given |section| of |
- // the dialog have valid contents. This validates only by checking "sure" |
- // messages - see AllSectionsAreValid. |
- bool SectionIsValid(DialogSection section); |
- |
- // Whether validation rules for |section| are loaded. |
- bool RulesAreLoaded(DialogSection section); |
- |
- // Whether the currently active credit card expiration date is valid. |
- bool IsCreditCardExpirationValid(const base::string16& year, |
- const base::string16& month) const; |
- |
- // Returns true if we should reject the given credit card brand. |type| should |
- // be a display string, such as "Visa". |
- bool ShouldDisallowCcType(const base::string16& type) const; |
- |
- // Returns true if |profile| has an address we can be sure is invalid. |
- // Profiles with invalid addresses are not suggested in the dropdown menu for |
- // billing and shipping addresses. |
- bool HasInvalidAddress(const AutofillProfile& profile); |
- |
- // Returns true if |key| refers to a suggestion, as opposed to some control |
- // menu item. |
- bool IsASuggestionItemKey(const std::string& key) const; |
- |
- // Returns whether Autofill is enabled for |profile_|. |
- bool IsAutofillEnabled() const; |
- |
- // Whether the billing section should be used to fill in the shipping details. |
- bool ShouldUseBillingForShipping(); |
- |
- // Whether the user wishes to save information locally to Autofill. |
- bool ShouldSaveDetailsLocally(); |
- |
- // Writes to prefs the choice of AutofillDataModel for |section|. |
- void PersistAutofillChoice(DialogSection section, |
- const std::string& guid); |
- |
- // Sets the outparams to the default AutofillDataModel for |section| (which is |
- // the first one in the menu that is a suggestion item). |
- void GetDefaultAutofillChoice(DialogSection section, |
- std::string* guid); |
- |
- // Reads from prefs the choice of AutofillDataModel for |section|. Returns |
- // whether there was a setting to read. |
- bool GetAutofillChoice(DialogSection section, |
- std::string* guid); |
- |
- // Logs metrics when the dialog is submitted. |
- void LogOnFinishSubmitMetrics(); |
- |
- // Logs metrics when the dialog is canceled. |
- void LogOnCancelMetrics(); |
- |
- // Logs metrics when the edit ui is shown for the given |section|. |
- void LogEditUiShownMetric(DialogSection section); |
- |
- // Logs metrics when a suggestion item from the given |model| is selected. |
- void LogSuggestionItemSelectedMetric(const SuggestionsMenuModel& model); |
- |
- // Logs the time elapsed from when the dialog was shown to when the user could |
- // interact with it. |
- void LogDialogLatencyToShow(); |
- |
- // Returns the metric corresponding to the user's initial state when |
- // interacting with this dialog. |
- AutofillMetrics::DialogInitialUserStateMetric GetInitialUserState() const; |
- |
- // Called when the delay for enabling the submit button ends. |
- void OnSubmitButtonDelayEnd(); |
- |
- // The |profile| for |contents_|. |
- Profile* const profile_; |
- |
- // For logging UMA metrics. |
- base::Time dialog_shown_timestamp_; |
- AutofillMetrics::DialogInitialUserStateMetric initial_user_state_; |
- |
- FormStructure form_structure_; |
- |
- // Whether the URL visible to the user when this dialog was requested to be |
- // invoked is the same as |source_url_|. |
- bool invoked_from_same_origin_; |
- |
- // The URL of the invoking site. |
- GURL source_url_; |
- |
- // The callback via which we return the collected data. |
- AutofillClient::ResultCallback callback_; |
- |
- // A helper to validate international address input. |
- std::unique_ptr<AddressValidator> validator_; |
- |
- // The default active instrument and shipping address object IDs as of the |
- // last time Wallet items were fetched. These variables are only set |
- // (i.e. non-empty) when the Wallet items are being re-fetched. |
- std::string previous_default_instrument_id_; |
- std::string previous_default_shipping_address_id_; |
- // The last active instrument and shipping address object IDs. These |
- // variables are only set (i.e. non-empty) when the Wallet items are being |
- // re-fetched. |
- std::string previously_selected_instrument_id_; |
- std::string previously_selected_shipping_address_id_; |
- |
- // When the Wallet items were last fetched. |
- base::TimeTicks last_wallet_items_fetch_timestamp_; |
- |
- // Local machine signals to pass along on each request to trigger (or |
- // discourage) risk challenges; sent if the user is up to date on legal docs. |
- std::string risk_data_; |
- |
- // The text to display when the user is accepting new terms of service, etc. |
- base::string16 legal_documents_text_; |
- // The ranges within |legal_documents_text_| to linkify. |
- std::vector<gfx::Range> legal_document_link_ranges_; |
- |
- // The instrument and address IDs from the Online Wallet server to be used |
- // when getting a full wallet. |
- std::string active_instrument_id_; |
- std::string active_address_id_; |
- |
- // The fields for billing and shipping which the page has actually requested. |
- DetailInputs requested_cc_fields_; |
- DetailInputs requested_billing_fields_; |
- DetailInputs requested_cc_billing_fields_; |
- DetailInputs requested_shipping_fields_; |
- |
- // The BCP 47 language codes used for formatting the addresses for display. |
- std::string billing_address_language_code_; |
- std::string shipping_address_language_code_; |
- |
- // Models for the credit card expiration inputs. |
- MonthComboboxModel cc_exp_month_combobox_model_; |
- YearComboboxModel cc_exp_year_combobox_model_; |
- |
- // Models for country input. |
- std::unique_ptr<CountryComboboxModel> billing_country_combobox_model_; |
- std::unique_ptr<CountryComboboxModel> shipping_country_combobox_model_; |
- |
- // Models for the suggestion views. |
- SuggestionsMenuModel suggested_cc_; |
- SuggestionsMenuModel suggested_billing_; |
- SuggestionsMenuModel suggested_shipping_; |
- |
- // The set of values for cc-type that the site accepts. Empty means all types |
- // are accepted. |
- std::set<base::string16> acceptable_cc_types_; |
- |
- // |DialogSection|s that are in edit mode that are based on existing data. |
- std::set<DialogSection> section_editing_state_; |
- |
- // Sections that need to be validated when their validation rules load. |
- std::set<DialogSection> needs_validation_; |
- |
- // Whether |form_structure_| has asked for any details that would indicate |
- // we should show a shipping section. |
- bool cares_about_shipping_; |
- |
- // Site-provided transaction amount and currency. No attempt to validate this |
- // input; it's passed directly to Wallet. |
- base::string16 transaction_amount_; |
- base::string16 transaction_currency_; |
- |
- // The IDs for the currently showing unverified profiles popup. This will |
- // be the first section in the list. The rest of the items will be the |
- // i18n_validator_suggestions_. |
- std::vector<std::string> popup_suggestion_ids_; |
- |
- // The autofill suggestions based on downloaded i18n validation rules. |
- std::vector< ::i18n::addressinput::AddressData> i18n_validator_suggestions_; |
- |
- // The controller for the currently showing popup (which helps users when |
- // they're manually filling the dialog). |
- base::WeakPtr<AutofillPopupControllerImpl> popup_controller_; |
- |
- // The type of the visible Autofill popup input (or UNKNOWN_TYPE if none). |
- ServerFieldType popup_input_type_; |
- |
- // The section of the dialog that's showing a popup, undefined if no popup |
- // is showing. |
- DialogSection popup_section_; |
- |
- std::unique_ptr<AutofillDialogView> view_; |
- |
- // A NotificationRegistrar for tracking the completion of sign-in. |
- content::NotificationRegistrar signin_registrar_; |
- |
- // The countries the form structure can accept for shipping. |
- std::set<base::string16> acceptable_shipping_countries_; |
- |
- // Whether |callback_| was Run() with a filled |form_structure_|. |
- bool data_was_passed_back_; |
- |
- typedef std::map<ServerFieldType, |
- std::pair<base::string16, base::string16> > TypeErrorInputMap; |
- // Whether the latency to display to the UI was logged to UMA yet. |
- bool was_ui_latency_logged_; |
- |
- // A map from dialog sections to the GUID of a newly saved Autofill data |
- // models for that section. No entries present that don't have newly saved |
- // data models. |
- std::map<DialogSection, std::string> newly_saved_data_model_guids_; |
- |
- // The timer that delays enabling submit button for a short period of time on |
- // startup. |
- base::OneShotTimer submit_button_delay_timer_; |
- |
- base::WeakPtrFactory<AutofillDialogControllerImpl> weak_ptr_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AutofillDialogControllerImpl); |
-}; |
- |
-} // namespace autofill |
- |
-#endif // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_CONTROLLER_IMPL_H_ |