Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: chrome/browser/ui/autofill/autofill_dialog_controller_impl.h

Issue 1931043002: Remove requestAutocomplete (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 <stddef.h>
9
10 #include <memory>
11 #include <set>
12 #include <vector>
13
14 #include "base/gtest_prod_util.h"
15 #include "base/macros.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/strings/string16.h"
18 #include "base/time/time.h"
19 #include "chrome/browser/ui/autofill/autofill_dialog_controller.h"
20 #include "chrome/browser/ui/autofill/autofill_dialog_models.h"
21 #include "chrome/browser/ui/autofill/autofill_dialog_types.h"
22 #include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h"
23 #include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h"
24 #include "chrome/browser/ui/autofill/country_combobox_model.h"
25 #include "components/autofill/core/browser/autofill_client.h"
26 #include "components/autofill/core/browser/autofill_metrics.h"
27 #include "components/autofill/core/browser/autofill_popup_delegate.h"
28 #include "components/autofill/core/browser/field_types.h"
29 #include "components/autofill/core/browser/form_structure.h"
30 #include "components/autofill/core/browser/personal_data_manager.h"
31 #include "components/autofill/core/browser/personal_data_manager_observer.h"
32 #include "content/public/browser/notification_observer.h"
33 #include "content/public/browser/notification_registrar.h"
34 #include "content/public/browser/web_contents_observer.h"
35 #include "content/public/common/ssl_status.h"
36 #include "third_party/libaddressinput/chromium/chrome_address_validator.h"
37 #include "third_party/skia/include/core/SkColor.h"
38 #include "ui/base/models/simple_menu_model.h"
39 #include "ui/base/ui_base_types.h"
40 #include "ui/gfx/animation/animation_delegate.h"
41 #include "ui/gfx/animation/linear_animation.h"
42 #include "url/gurl.h"
43
44 class Profile;
45
46 namespace content {
47 class WebContents;
48 }
49
50 namespace i18n {
51 namespace addressinput {
52 struct AddressData;
53 }
54 }
55
56 namespace autofill {
57
58 class AutofillDataModel;
59 class AutofillDialogView;
60 class AutofillPopupControllerImpl;
61 class DataModelWrapper;
62
63 namespace risk {
64 class Fingerprint;
65 }
66
67 namespace wallet {
68 class WalletSigninHelper;
69 }
70
71 // This class drives the dialog that appears when a site uses the imperative
72 // autocomplete API to fill out a form.
73 class AutofillDialogControllerImpl
74 : public AutofillDialogViewDelegate,
75 public AutofillDialogController,
76 public AutofillPopupDelegate,
77 public content::WebContentsObserver,
78 public SuggestionsMenuModelDelegate,
79 public PersonalDataManagerObserver,
80 public LoadRulesListener {
81 public:
82 ~AutofillDialogControllerImpl() override;
83
84 static base::WeakPtr<AutofillDialogControllerImpl> Create(
85 content::WebContents* contents,
86 const FormData& form_structure,
87 const GURL& source_url,
88 const AutofillClient::ResultCallback& callback);
89
90 // AutofillDialogController implementation.
91 void Show() override;
92 void Hide() override;
93 void TabActivated() override;
94
95 // AutofillDialogViewDelegate implementation.
96 base::string16 DialogTitle() const override;
97 base::string16 EditSuggestionText() const override;
98 base::string16 CancelButtonText() const override;
99 base::string16 ConfirmButtonText() const override;
100 base::string16 SaveLocallyText() const override;
101 base::string16 SaveLocallyTooltip() const override;
102 bool ShouldOfferToSaveInChrome() const override;
103 bool ShouldSaveInChrome() const override;
104 int GetDialogButtons() const override;
105 bool IsDialogButtonEnabled(ui::DialogButton button) const override;
106 bool SectionIsActive(DialogSection section) const override;
107 const DetailInputs& RequestedFieldsForSection(
108 DialogSection section) const override;
109 ui::ComboboxModel* ComboboxModelForAutofillType(
110 ServerFieldType type) override;
111 ui::MenuModel* MenuModelForSection(DialogSection section) override;
112 base::string16 LabelForSection(DialogSection section) const override;
113 SuggestionState SuggestionStateForSection(DialogSection section) override;
114 FieldIconMap IconsForFields(const FieldValueMap& user_inputs) const override;
115 bool FieldControlsIcons(ServerFieldType type) const override;
116 base::string16 TooltipForField(ServerFieldType type) const override;
117 base::string16 InputValidityMessage(DialogSection section,
118 ServerFieldType type,
119 const base::string16& value) override;
120 ValidityMessages InputsAreValid(DialogSection section,
121 const FieldValueMap& inputs) override;
122 void UserEditedOrActivatedInput(DialogSection section,
123 ServerFieldType type,
124 gfx::NativeView parent_view,
125 const gfx::Rect& content_bounds,
126 const base::string16& field_contents,
127 bool was_edit) override;
128 bool HandleKeyPressEventInInput(
129 const content::NativeWebKeyboardEvent& event) override;
130 void FocusMoved() override;
131 bool ShouldShowErrorBubble() const override;
132 void ViewClosed() override;
133 std::vector<DialogNotification> CurrentNotifications() override;
134 void LinkClicked(const GURL& url) override;
135 void OnCancel() override;
136 void OnAccept() override;
137 Profile* profile() override;
138 content::WebContents* GetWebContents() override;
139
140 // AutofillPopupDelegate implementation.
141 void OnPopupShown() override;
142 void OnPopupHidden() override;
143 void DidSelectSuggestion(const base::string16& value,
144 int identifier) override;
145 void DidAcceptSuggestion(const base::string16& value,
146 int identifier,
147 int position) override;
148 bool GetDeletionConfirmationText(const base::string16& value,
149 int identifier,
150 base::string16* title,
151 base::string16* body) override;
152 bool RemoveSuggestion(const base::string16& value, int identifier) override;
153 void ClearPreviewedForm() override;
154
155
156 // SuggestionsMenuModelDelegate implementation.
157 void SuggestionItemSelected(SuggestionsMenuModel* model,
158 size_t index) override;
159
160 // PersonalDataManagerObserver implementation.
161 void OnPersonalDataChanged() override;
162
163 // LoadRulesListener implementation.
164 void OnAddressValidationRulesLoaded(const std::string& country_code,
165 bool success) override;
166
167 protected:
168 // Exposed for testing.
169 AutofillDialogControllerImpl(content::WebContents* contents,
170 const FormData& form_structure,
171 const GURL& source_url,
172 const AutofillClient::ResultCallback& callback);
173
174 // Exposed for testing.
175 AutofillDialogView* view() { return view_.get(); }
176 virtual AutofillDialogView* CreateView();
177 ServerFieldType popup_input_type() const {
178 return popup_input_type_;
179 }
180
181 // Returns the PersonalDataManager for |profile_|.
182 virtual PersonalDataManager* GetManager() const;
183
184 // Returns an address validation helper. May be NULL during tests.
185 virtual AddressValidator* GetValidator();
186
187 // Opens the given URL in a new foreground tab.
188 virtual void OpenTabWithUrl(const GURL& url);
189
190 // The active billing section for the current state of the dialog (e.g. when
191 // paying for wallet, the combined credit card + billing address section).
192 DialogSection ActiveBillingSection() const;
193
194 // Whether |section| was sent into edit mode based on existing data. This
195 // happens when a user clicks "Edit" or a suggestion is invalid.
196 virtual bool IsEditingExistingData(DialogSection section) const;
197
198 // Whether the user has chosen to enter all new data in |section|. This
199 // happens via choosing "Add a new X..." from a section's suggestion menu.
200 bool IsManuallyEditingSection(DialogSection section) const;
201
202 // Delays enabling submit button for a short period of time. Exposed for
203 // testing.
204 virtual void SubmitButtonDelayBegin();
205
206 void FinishSubmit();
207
208 // Ends the delay for enabling the submit button. Called only from tests.
209 // Without this method, the tests would have to wait for the delay timer to
210 // finish, which would be flaky.
211 void SubmitButtonDelayEndForTesting();
212
213 private:
214 FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest,
215 AutocompleteEvent);
216 FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest,
217 AutocompleteErrorEventReasonCancel);
218 FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest,
219 AutocompleteErrorEventReasonInvalid);
220 FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest,
221 ErrorWithFrameNavigation);
222 FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest,
223 FillFormIncludesCVC);
224 FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest,
225 Submit);
226 FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest,
227 TransactionAmount);
228 FRIEND_TEST_ALL_PREFIXES(AutofillDialogControllerTest,
229 TransactionAmountReadonly);
230
231 // Initializes or updates |suggested_cc_| et al.
232 void SuggestionsUpdated();
233
234 // Starts fetching the wallet items from Online Wallet.
235 void GetWalletItems();
236
237 // Clears previously entered manual input and removes |section| from
238 // |section_editing_state_|. Does not update the view.
239 void ResetSectionInput(DialogSection section);
240
241 // Force |section| into edit mode if the current suggestion is invalid.
242 void ShowEditUiIfBadSuggestion(DialogSection section);
243
244 // Whether the |value| of |input| should be preserved on account change.
245 bool InputWasEdited(ServerFieldType type,
246 const base::string16& value);
247
248 // Takes a snapshot of the newly inputted user data in |view_| (if it exists).
249 FieldValueMap TakeUserInputSnapshot();
250
251 // Fills the detail inputs from a previously taken user input snapshot. Does
252 // not update the view.
253 void RestoreUserInputFromSnapshot(const FieldValueMap& snapshot);
254
255 // Tells the view to update |section|.
256 void UpdateSection(DialogSection section);
257
258 // Tells |view_| to update the validity status of its detail inputs (if
259 // |view_| is non-null). Currently this is used solely for highlighting
260 // invalid suggestions, so if no sections are based on existing data,
261 // |view_->UpdateForErrors()| is not called.
262 void UpdateForErrors();
263
264 // Creates a DataModelWrapper item for the item that's checked in the
265 // suggestion model for |section|. This may represent Autofill
266 // data or Wallet data, depending on whether Wallet is currently enabled.
267 std::unique_ptr<DataModelWrapper> CreateWrapper(DialogSection section);
268
269 // Fills in |section|-related fields in |output_| according to the state of
270 // |view_|.
271 void FillOutputForSection(DialogSection section);
272 // As above, but uses |compare| to determine whether a DetailInput matches
273 // a field. Saves any new Autofill data to the PersonalDataManager.
274 void FillOutputForSectionWithComparator(
275 DialogSection section,
276 const FormStructure::InputFieldComparator& compare);
277
278 // Returns whether |form_structure|_| has any fields that match the fieldset
279 // represented by |section|.
280 bool FormStructureCaresAboutSection(DialogSection section) const;
281
282 // Finds all fields of the given |type| in |form_structure_|, if any, and sets
283 // each field's value to |output|.
284 void SetOutputForFieldsOfType(ServerFieldType type,
285 const base::string16& output);
286
287 // Gets the value for |type| in |section|, whether it comes from manual user
288 // input or the active suggestion.
289 base::string16 GetValueFromSection(DialogSection section,
290 ServerFieldType type);
291
292 // Returns whether the given section can accept an address with the given
293 // country code.
294 bool CanAcceptCountry(DialogSection section, const std::string& country_code);
295
296 // Whether |profile| should be suggested for |section|.
297 bool ShouldSuggestProfile(DialogSection section,
298 const AutofillProfile& profile);
299
300 // Gets the SuggestionsMenuModel for |section|.
301 SuggestionsMenuModel* SuggestionsMenuModelForSection(DialogSection section);
302 const SuggestionsMenuModel* SuggestionsMenuModelForSection(
303 DialogSection section) const;
304 // And the reverse.
305 DialogSection SectionForSuggestionsMenuModel(
306 const SuggestionsMenuModel& model);
307
308 // Gets the CountryComboboxModel for |section|.
309 CountryComboboxModel* CountryComboboxModelForSection(DialogSection section);
310
311 // Clears and builds the inputs in |section| for |country_name|.
312 // When |should_clobber| is false, and the view's country value matches
313 // |country_name|, the inputs won't be rebuilt.
314 bool RebuildInputsForCountry(DialogSection section,
315 const base::string16& country_name,
316 bool should_clobber);
317
318 // Suggested text and icons for sections. Suggestion text is used to show an
319 // abridged overview of the currently used suggestion. Extra text is used when
320 // part of a section is suggested but part must be manually input (e.g. during
321 // a CVC challenge or when using Autofill's CC section [never stores CVC]).
322 bool SuggestionTextForSection(DialogSection section,
323 base::string16* vertically_compact,
324 base::string16* horizontally_compact);
325 gfx::Image SuggestionIconForSection(DialogSection section);
326 base::string16 ExtraSuggestionTextForSection(DialogSection section) const;
327 gfx::Image ExtraSuggestionIconForSection(DialogSection section);
328
329 // Suggests address completions using the downloaded i18n validation rules.
330 // Stores the suggestions in |i18n_validator_suggestions_|.
331 void GetI18nValidatorSuggestions(
332 DialogSection section,
333 ServerFieldType type,
334 std::vector<autofill::Suggestion>* popup_suggestions);
335
336 // Like RequestedFieldsForSection, but returns a pointer.
337 DetailInputs* MutableRequestedFieldsForSection(DialogSection section);
338
339 // Returns a pointer to the language code that should be used for formatting
340 // the address in |section| for display. Returns NULL for a non-address
341 // |section|.
342 std::string* MutableAddressLanguageCodeForSection(DialogSection section);
343
344 // Returns the language code that should be used for formatting the address in
345 // |section|. Returns an empty string for a non-address |section|.
346 std::string AddressLanguageCodeForSection(DialogSection section);
347
348 // Returns just the |type| attributes of RequestedFieldsForSection(section).
349 std::vector<ServerFieldType> RequestedTypesForSection(DialogSection section)
350 const;
351
352 // Returns the country code (e.g. "US") for |section|.
353 std::string CountryCodeForSection(DialogSection section);
354
355 // Hides |popup_controller_|'s popup view, if it exists.
356 void HidePopup();
357
358 // Set whether the currently editing |section| was originally based on
359 // existing Wallet or Autofill data.
360 void SetEditingExistingData(DialogSection section, bool editing);
361
362 // Whether the user has chosen to enter all new data in at least one section.
363 bool IsManuallyEditingAnySection() const;
364
365 // Returns validity message for a given credit card number.
366 base::string16 CreditCardNumberValidityMessage(
367 const base::string16& number) const;
368
369 // Whether all of the input fields currently showing in the dialog have valid
370 // contents. This validates only by checking "sure" messages, i.e. messages
371 // that would have been displayed to the user during editing, as opposed to
372 // submission.
373 bool AllSectionsAreValid();
374
375 // Whether all of the input fields currently showing in the given |section| of
376 // the dialog have valid contents. This validates only by checking "sure"
377 // messages - see AllSectionsAreValid.
378 bool SectionIsValid(DialogSection section);
379
380 // Whether validation rules for |section| are loaded.
381 bool RulesAreLoaded(DialogSection section);
382
383 // Whether the currently active credit card expiration date is valid.
384 bool IsCreditCardExpirationValid(const base::string16& year,
385 const base::string16& month) const;
386
387 // Returns true if we should reject the given credit card brand. |type| should
388 // be a display string, such as "Visa".
389 bool ShouldDisallowCcType(const base::string16& type) const;
390
391 // Returns true if |profile| has an address we can be sure is invalid.
392 // Profiles with invalid addresses are not suggested in the dropdown menu for
393 // billing and shipping addresses.
394 bool HasInvalidAddress(const AutofillProfile& profile);
395
396 // Returns true if |key| refers to a suggestion, as opposed to some control
397 // menu item.
398 bool IsASuggestionItemKey(const std::string& key) const;
399
400 // Returns whether Autofill is enabled for |profile_|.
401 bool IsAutofillEnabled() const;
402
403 // Whether the billing section should be used to fill in the shipping details.
404 bool ShouldUseBillingForShipping();
405
406 // Whether the user wishes to save information locally to Autofill.
407 bool ShouldSaveDetailsLocally();
408
409 // Writes to prefs the choice of AutofillDataModel for |section|.
410 void PersistAutofillChoice(DialogSection section,
411 const std::string& guid);
412
413 // Sets the outparams to the default AutofillDataModel for |section| (which is
414 // the first one in the menu that is a suggestion item).
415 void GetDefaultAutofillChoice(DialogSection section,
416 std::string* guid);
417
418 // Reads from prefs the choice of AutofillDataModel for |section|. Returns
419 // whether there was a setting to read.
420 bool GetAutofillChoice(DialogSection section,
421 std::string* guid);
422
423 // Logs metrics when the dialog is submitted.
424 void LogOnFinishSubmitMetrics();
425
426 // Logs metrics when the dialog is canceled.
427 void LogOnCancelMetrics();
428
429 // Logs metrics when the edit ui is shown for the given |section|.
430 void LogEditUiShownMetric(DialogSection section);
431
432 // Logs metrics when a suggestion item from the given |model| is selected.
433 void LogSuggestionItemSelectedMetric(const SuggestionsMenuModel& model);
434
435 // Logs the time elapsed from when the dialog was shown to when the user could
436 // interact with it.
437 void LogDialogLatencyToShow();
438
439 // Returns the metric corresponding to the user's initial state when
440 // interacting with this dialog.
441 AutofillMetrics::DialogInitialUserStateMetric GetInitialUserState() const;
442
443 // Called when the delay for enabling the submit button ends.
444 void OnSubmitButtonDelayEnd();
445
446 // The |profile| for |contents_|.
447 Profile* const profile_;
448
449 // For logging UMA metrics.
450 base::Time dialog_shown_timestamp_;
451 AutofillMetrics::DialogInitialUserStateMetric initial_user_state_;
452
453 FormStructure form_structure_;
454
455 // Whether the URL visible to the user when this dialog was requested to be
456 // invoked is the same as |source_url_|.
457 bool invoked_from_same_origin_;
458
459 // The URL of the invoking site.
460 GURL source_url_;
461
462 // The callback via which we return the collected data.
463 AutofillClient::ResultCallback callback_;
464
465 // A helper to validate international address input.
466 std::unique_ptr<AddressValidator> validator_;
467
468 // The default active instrument and shipping address object IDs as of the
469 // last time Wallet items were fetched. These variables are only set
470 // (i.e. non-empty) when the Wallet items are being re-fetched.
471 std::string previous_default_instrument_id_;
472 std::string previous_default_shipping_address_id_;
473 // The last active instrument and shipping address object IDs. These
474 // variables are only set (i.e. non-empty) when the Wallet items are being
475 // re-fetched.
476 std::string previously_selected_instrument_id_;
477 std::string previously_selected_shipping_address_id_;
478
479 // When the Wallet items were last fetched.
480 base::TimeTicks last_wallet_items_fetch_timestamp_;
481
482 // Local machine signals to pass along on each request to trigger (or
483 // discourage) risk challenges; sent if the user is up to date on legal docs.
484 std::string risk_data_;
485
486 // The text to display when the user is accepting new terms of service, etc.
487 base::string16 legal_documents_text_;
488 // The ranges within |legal_documents_text_| to linkify.
489 std::vector<gfx::Range> legal_document_link_ranges_;
490
491 // The instrument and address IDs from the Online Wallet server to be used
492 // when getting a full wallet.
493 std::string active_instrument_id_;
494 std::string active_address_id_;
495
496 // The fields for billing and shipping which the page has actually requested.
497 DetailInputs requested_cc_fields_;
498 DetailInputs requested_billing_fields_;
499 DetailInputs requested_cc_billing_fields_;
500 DetailInputs requested_shipping_fields_;
501
502 // The BCP 47 language codes used for formatting the addresses for display.
503 std::string billing_address_language_code_;
504 std::string shipping_address_language_code_;
505
506 // Models for the credit card expiration inputs.
507 MonthComboboxModel cc_exp_month_combobox_model_;
508 YearComboboxModel cc_exp_year_combobox_model_;
509
510 // Models for country input.
511 std::unique_ptr<CountryComboboxModel> billing_country_combobox_model_;
512 std::unique_ptr<CountryComboboxModel> shipping_country_combobox_model_;
513
514 // Models for the suggestion views.
515 SuggestionsMenuModel suggested_cc_;
516 SuggestionsMenuModel suggested_billing_;
517 SuggestionsMenuModel suggested_shipping_;
518
519 // The set of values for cc-type that the site accepts. Empty means all types
520 // are accepted.
521 std::set<base::string16> acceptable_cc_types_;
522
523 // |DialogSection|s that are in edit mode that are based on existing data.
524 std::set<DialogSection> section_editing_state_;
525
526 // Sections that need to be validated when their validation rules load.
527 std::set<DialogSection> needs_validation_;
528
529 // Whether |form_structure_| has asked for any details that would indicate
530 // we should show a shipping section.
531 bool cares_about_shipping_;
532
533 // Site-provided transaction amount and currency. No attempt to validate this
534 // input; it's passed directly to Wallet.
535 base::string16 transaction_amount_;
536 base::string16 transaction_currency_;
537
538 // The IDs for the currently showing unverified profiles popup. This will
539 // be the first section in the list. The rest of the items will be the
540 // i18n_validator_suggestions_.
541 std::vector<std::string> popup_suggestion_ids_;
542
543 // The autofill suggestions based on downloaded i18n validation rules.
544 std::vector< ::i18n::addressinput::AddressData> i18n_validator_suggestions_;
545
546 // The controller for the currently showing popup (which helps users when
547 // they're manually filling the dialog).
548 base::WeakPtr<AutofillPopupControllerImpl> popup_controller_;
549
550 // The type of the visible Autofill popup input (or UNKNOWN_TYPE if none).
551 ServerFieldType popup_input_type_;
552
553 // The section of the dialog that's showing a popup, undefined if no popup
554 // is showing.
555 DialogSection popup_section_;
556
557 std::unique_ptr<AutofillDialogView> view_;
558
559 // A NotificationRegistrar for tracking the completion of sign-in.
560 content::NotificationRegistrar signin_registrar_;
561
562 // The countries the form structure can accept for shipping.
563 std::set<base::string16> acceptable_shipping_countries_;
564
565 // Whether |callback_| was Run() with a filled |form_structure_|.
566 bool data_was_passed_back_;
567
568 typedef std::map<ServerFieldType,
569 std::pair<base::string16, base::string16> > TypeErrorInputMap;
570 // Whether the latency to display to the UI was logged to UMA yet.
571 bool was_ui_latency_logged_;
572
573 // A map from dialog sections to the GUID of a newly saved Autofill data
574 // models for that section. No entries present that don't have newly saved
575 // data models.
576 std::map<DialogSection, std::string> newly_saved_data_model_guids_;
577
578 // The timer that delays enabling submit button for a short period of time on
579 // startup.
580 base::OneShotTimer submit_button_delay_timer_;
581
582 base::WeakPtrFactory<AutofillDialogControllerImpl> weak_ptr_factory_;
583
584 DISALLOW_COPY_AND_ASSIGN(AutofillDialogControllerImpl);
585 };
586
587 } // namespace autofill
588
589 #endif // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_CONTROLLER_IMPL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698