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

Side by Side Diff: components/autofill/core/browser/autofill_manager.cc

Issue 23033016: Remove autocheckout code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Even more deletes, and Ilya review. Created 7 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/autofill/core/browser/autofill_manager.h" 5 #include "components/autofill/core/browser/autofill_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <limits> 9 #include <limits>
10 #include <map> 10 #include <map>
11 #include <set> 11 #include <set>
12 #include <utility> 12 #include <utility>
13 13
14 #include "base/bind.h" 14 #include "base/bind.h"
15 #include "base/command_line.h" 15 #include "base/command_line.h"
16 #include "base/guid.h" 16 #include "base/guid.h"
17 #include "base/logging.h" 17 #include "base/logging.h"
18 #include "base/prefs/pref_service.h" 18 #include "base/prefs/pref_service.h"
19 #include "base/strings/string16.h" 19 #include "base/strings/string16.h"
20 #include "base/strings/string_util.h" 20 #include "base/strings/string_util.h"
21 #include "base/strings/utf_string_conversions.h" 21 #include "base/strings/utf_string_conversions.h"
22 #include "base/threading/sequenced_worker_pool.h" 22 #include "base/threading/sequenced_worker_pool.h"
23 #include "components/autofill/content/browser/autocheckout/whitelist_manager.h"
24 #include "components/autofill/content/browser/autocheckout_manager.h"
25 #include "components/autofill/core/browser/autocomplete_history_manager.h" 23 #include "components/autofill/core/browser/autocomplete_history_manager.h"
26 #include "components/autofill/core/browser/autofill_data_model.h" 24 #include "components/autofill/core/browser/autofill_data_model.h"
27 #include "components/autofill/core/browser/autofill_driver.h" 25 #include "components/autofill/core/browser/autofill_driver.h"
28 #include "components/autofill/core/browser/autofill_external_delegate.h" 26 #include "components/autofill/core/browser/autofill_external_delegate.h"
29 #include "components/autofill/core/browser/autofill_field.h" 27 #include "components/autofill/core/browser/autofill_field.h"
30 #include "components/autofill/core/browser/autofill_manager_delegate.h" 28 #include "components/autofill/core/browser/autofill_manager_delegate.h"
31 #include "components/autofill/core/browser/autofill_manager_test_delegate.h" 29 #include "components/autofill/core/browser/autofill_manager_test_delegate.h"
32 #include "components/autofill/core/browser/autofill_metrics.h" 30 #include "components/autofill/core/browser/autofill_metrics.h"
33 #include "components/autofill/core/browser/autofill_profile.h" 31 #include "components/autofill/core/browser/autofill_profile.h"
34 #include "components/autofill/core/browser/autofill_type.h" 32 #include "components/autofill/core/browser/autofill_type.h"
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 AutofillDriver* driver, 181 AutofillDriver* driver,
184 autofill::AutofillManagerDelegate* delegate, 182 autofill::AutofillManagerDelegate* delegate,
185 const std::string& app_locale, 183 const std::string& app_locale,
186 AutofillDownloadManagerState enable_download_manager) 184 AutofillDownloadManagerState enable_download_manager)
187 : driver_(driver), 185 : driver_(driver),
188 manager_delegate_(delegate), 186 manager_delegate_(delegate),
189 app_locale_(app_locale), 187 app_locale_(app_locale),
190 personal_data_(delegate->GetPersonalDataManager()), 188 personal_data_(delegate->GetPersonalDataManager()),
191 autocomplete_history_manager_( 189 autocomplete_history_manager_(
192 new AutocompleteHistoryManager(driver, delegate)), 190 new AutocompleteHistoryManager(driver, delegate)),
193 autocheckout_manager_(this),
194 metric_logger_(new AutofillMetrics), 191 metric_logger_(new AutofillMetrics),
195 has_logged_autofill_enabled_(false), 192 has_logged_autofill_enabled_(false),
196 has_logged_address_suggestions_count_(false), 193 has_logged_address_suggestions_count_(false),
197 did_show_suggestions_(false), 194 did_show_suggestions_(false),
198 user_did_type_(false), 195 user_did_type_(false),
199 user_did_autofill_(false), 196 user_did_autofill_(false),
200 user_did_edit_autofilled_field_(false), 197 user_did_edit_autofilled_field_(false),
201 external_delegate_(NULL), 198 external_delegate_(NULL),
202 test_delegate_(NULL), 199 test_delegate_(NULL),
203 weak_ptr_factory_(this) { 200 weak_ptr_factory_(this) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 return false; 252 return false;
256 253
257 if (driver_->GetWebContents()->GetBrowserContext()->IsOffTheRecord()) 254 if (driver_->GetWebContents()->GetBrowserContext()->IsOffTheRecord())
258 return false; 255 return false;
259 256
260 // Don't save data that was submitted through JavaScript. 257 // Don't save data that was submitted through JavaScript.
261 if (!form.user_submitted) 258 if (!form.user_submitted)
262 return false; 259 return false;
263 260
264 // Grab a copy of the form data. 261 // Grab a copy of the form data.
265 scoped_ptr<FormStructure> submitted_form( 262 scoped_ptr<FormStructure> submitted_form(new FormStructure(form));
266 new FormStructure(form, GetAutocheckoutURLPrefix()));
267 263
268 // Disregard forms that we wouldn't ever autofill in the first place. 264 // Disregard forms that we wouldn't ever autofill in the first place.
269 if (!submitted_form->ShouldBeParsed(true)) 265 if (!submitted_form->ShouldBeParsed(true))
270 return false; 266 return false;
271 267
272 // Ignore forms not present in our cache. These are typically forms with 268 // Ignore forms not present in our cache. These are typically forms with
273 // wonky JavaScript that also makes them not auto-fillable. 269 // wonky JavaScript that also makes them not auto-fillable.
274 FormStructure* cached_submitted_form; 270 FormStructure* cached_submitted_form;
275 if (!FindCachedForm(form, &cached_submitted_form)) 271 if (!FindCachedForm(form, &cached_submitted_form))
276 return false; 272 return false;
277 273
278 submitted_form->UpdateFromCache(*cached_submitted_form); 274 submitted_form->UpdateFromCache(*cached_submitted_form);
279 // Don't prompt the user to save data entered by Autocheckout. 275 if (submitted_form->IsAutofillable(true))
280 if (submitted_form->IsAutofillable(true) &&
281 !submitted_form->filled_by_autocheckout())
282 ImportFormData(*submitted_form); 276 ImportFormData(*submitted_form);
283 277
284 // Only upload server statistics and UMA metrics if at least some local data 278 // Only upload server statistics and UMA metrics if at least some local data
285 // is available to use as a baseline. 279 // is available to use as a baseline.
286 const std::vector<AutofillProfile*>& profiles = personal_data_->GetProfiles(); 280 const std::vector<AutofillProfile*>& profiles = personal_data_->GetProfiles();
287 const std::vector<CreditCard*>& credit_cards = 281 const std::vector<CreditCard*>& credit_cards =
288 personal_data_->GetCreditCards(); 282 personal_data_->GetCreditCards();
289 if (!profiles.empty() || !credit_cards.empty()) { 283 if (!profiles.empty() || !credit_cards.empty()) {
290 // Copy the profile and credit card data, so that it can be accessed on a 284 // Copy the profile and credit card data, so that it can be accessed on a
291 // separate thread. 285 // separate thread.
(...skipping 29 matching lines...) Expand all
321 timestamp)); 315 timestamp));
322 } 316 }
323 317
324 return true; 318 return true;
325 } 319 }
326 320
327 void AutofillManager::OnFormsSeen(const std::vector<FormData>& forms, 321 void AutofillManager::OnFormsSeen(const std::vector<FormData>& forms,
328 const TimeTicks& timestamp, 322 const TimeTicks& timestamp,
329 autofill::FormsSeenState state) { 323 autofill::FormsSeenState state) {
330 bool is_post_document_load = state == autofill::DYNAMIC_FORMS_SEEN; 324 bool is_post_document_load = state == autofill::DYNAMIC_FORMS_SEEN;
331 bool has_more_forms = state == autofill::PARTIAL_FORMS_SEEN; 325 // If new forms were added dynamically, treat as a new page.
332 // If new forms were added dynamically, and the autocheckout manager 326 if (is_post_document_load)
333 // doesn't tell us to ignore ajax on this page, treat as a new page.
334 if (is_post_document_load) {
335 if (autocheckout_manager_.ShouldIgnoreAjax())
336 return;
337
338 Reset(); 327 Reset();
339 }
340 328
341 RenderViewHost* host = driver_->GetWebContents()->GetRenderViewHost(); 329 RenderViewHost* host = driver_->GetWebContents()->GetRenderViewHost();
342 if (!host) 330 if (!host)
343 return; 331 return;
344 332
345 if (!GetAutocheckoutURLPrefix().empty()) {
346 // If whitelisted URL, fetch all the forms.
347 if (has_more_forms)
348 host->Send(new AutofillMsg_GetAllForms(host->GetRoutingID()));
349 if (!is_post_document_load) {
350 host->Send(
351 new AutofillMsg_AutocheckoutSupported(host->GetRoutingID()));
352 }
353 // Now return early, as OnFormsSeen will get called again with all forms.
354 if (has_more_forms)
355 return;
356 }
357
358 autocheckout_manager_.OnFormsSeen();
359 bool enabled = IsAutofillEnabled(); 333 bool enabled = IsAutofillEnabled();
360 if (!has_logged_autofill_enabled_) { 334 if (!has_logged_autofill_enabled_) {
361 metric_logger_->LogIsAutofillEnabledAtPageLoad(enabled); 335 metric_logger_->LogIsAutofillEnabledAtPageLoad(enabled);
362 has_logged_autofill_enabled_ = true; 336 has_logged_autofill_enabled_ = true;
363 } 337 }
364 338
365 if (!enabled) 339 if (!enabled)
366 return; 340 return;
367 341
368 forms_loaded_timestamp_ = timestamp; 342 forms_loaded_timestamp_ = timestamp;
369 ParseForms(forms); 343 ParseForms(forms);
370 } 344 }
371 345
372 void AutofillManager::OnTextFieldDidChange(const FormData& form, 346 void AutofillManager::OnTextFieldDidChange(const FormData& form,
373 const FormFieldData& field, 347 const FormFieldData& field,
374 const TimeTicks& timestamp) { 348 const TimeTicks& timestamp) {
375 FormStructure* form_structure = NULL; 349 FormStructure* form_structure = NULL;
376 AutofillField* autofill_field = NULL; 350 AutofillField* autofill_field = NULL;
377 if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field)) 351 if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field))
378 return; 352 return;
379 353
380 if (!user_did_type_) { 354 if (!user_did_type_) {
381 autocheckout_manager_.set_should_show_bubble(false);
382 user_did_type_ = true; 355 user_did_type_ = true;
383 metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE); 356 metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE);
384 } 357 }
385 358
386 if (autofill_field->is_autofilled) { 359 if (autofill_field->is_autofilled) {
387 autofill_field->is_autofilled = false; 360 autofill_field->is_autofilled = false;
388 metric_logger_->LogUserHappinessMetric( 361 metric_logger_->LogUserHappinessMetric(
389 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD); 362 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD);
390 363
391 if (!user_did_edit_autofilled_field_) { 364 if (!user_did_edit_autofilled_field_) {
392 user_did_edit_autofilled_field_ = true; 365 user_did_edit_autofilled_field_ = true;
393 metric_logger_->LogUserHappinessMetric( 366 metric_logger_->LogUserHappinessMetric(
394 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE); 367 AutofillMetrics::USER_DID_EDIT_AUTOFILLED_FIELD_ONCE);
395 } 368 }
396 } 369 }
397 370
398 UpdateInitialInteractionTimestamp(timestamp); 371 UpdateInitialInteractionTimestamp(timestamp);
399 } 372 }
400 373
401 void AutofillManager::OnQueryFormFieldAutofill(int query_id, 374 void AutofillManager::OnQueryFormFieldAutofill(int query_id,
402 const FormData& form, 375 const FormData& form,
403 const FormFieldData& field, 376 const FormFieldData& field,
404 const gfx::RectF& bounding_box, 377 const gfx::RectF& bounding_box,
405 bool display_warning) { 378 bool display_warning) {
406 if (autocheckout_manager_.is_autocheckout_bubble_showing())
407 return;
408
409 std::vector<base::string16> values; 379 std::vector<base::string16> values;
410 std::vector<base::string16> labels; 380 std::vector<base::string16> labels;
411 std::vector<base::string16> icons; 381 std::vector<base::string16> icons;
412 std::vector<int> unique_ids; 382 std::vector<int> unique_ids;
413 383
414 external_delegate_->OnQuery(query_id, 384 external_delegate_->OnQuery(query_id,
415 form, 385 form,
416 field, 386 field,
417 bounding_box, 387 bounding_box,
418 display_warning); 388 display_warning);
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE); 579 AutofillMetrics::SUGGESTIONS_SHOWN_ONCE);
610 } 580 }
611 } 581 }
612 } 582 }
613 583
614 void AutofillManager::OnHideAutofillUI() { 584 void AutofillManager::OnHideAutofillUI() {
615 if (!IsAutofillEnabled()) 585 if (!IsAutofillEnabled())
616 return; 586 return;
617 587
618 manager_delegate_->HideAutofillPopup(); 588 manager_delegate_->HideAutofillPopup();
619 manager_delegate_->HideAutocheckoutBubble();
620 } 589 }
621 590
622 void AutofillManager::RemoveAutofillProfileOrCreditCard(int unique_id) { 591 void AutofillManager::RemoveAutofillProfileOrCreditCard(int unique_id) {
623 const AutofillDataModel* data_model = NULL; 592 const AutofillDataModel* data_model = NULL;
624 size_t variant = 0; 593 size_t variant = 0;
625 if (!GetProfileOrCreditCard(unique_id, &data_model, &variant)) { 594 if (!GetProfileOrCreditCard(unique_id, &data_model, &variant)) {
626 NOTREACHED(); 595 NOTREACHED();
627 return; 596 return;
628 } 597 }
629 598
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 ReturnAutocompleteResult(WebFormElement::AutocompleteResultErrorCancel, 697 ReturnAutocompleteResult(WebFormElement::AutocompleteResultErrorCancel,
729 FormData()); 698 FormData());
730 } else { 699 } else {
731 ReturnAutocompleteResult(WebFormElement::AutocompleteResultSuccess, 700 ReturnAutocompleteResult(WebFormElement::AutocompleteResultSuccess,
732 result->ToFormData()); 701 result->ToFormData());
733 } 702 }
734 } 703 }
735 704
736 void AutofillManager::OnLoadedServerPredictions( 705 void AutofillManager::OnLoadedServerPredictions(
737 const std::string& response_xml) { 706 const std::string& response_xml) {
738 scoped_ptr<autofill::AutocheckoutPageMetaData> page_meta_data(
739 new autofill::AutocheckoutPageMetaData());
740
741 // Parse and store the server predictions. 707 // Parse and store the server predictions.
742 FormStructure::ParseQueryResponse(response_xml, 708 FormStructure::ParseQueryResponse(response_xml,
743 form_structures_.get(), 709 form_structures_.get(),
744 page_meta_data.get(),
745 *metric_logger_); 710 *metric_logger_);
746 711
747 if (page_meta_data->IsInAutofillableFlow()) {
748 RenderViewHost* host = driver_->GetWebContents()->GetRenderViewHost();
749 if (host)
750 host->Send(new AutofillMsg_AutocheckoutSupported(host->GetRoutingID()));
751 }
752
753 // TODO(ahutter): Remove this once Autocheckout is implemented on other
754 // platforms. See http://crbug.com/173416.
755 #if defined(TOOLKIT_VIEWS)
756 if (!GetAutocheckoutURLPrefix().empty())
757 autocheckout_manager_.OnLoadedPageMetaData(page_meta_data.Pass());
758 #endif // #if defined(TOOLKIT_VIEWS)
759
760 // If the corresponding flag is set, annotate forms with the predicted types. 712 // If the corresponding flag is set, annotate forms with the predicted types.
761 driver_->SendAutofillTypePredictionsToRenderer(form_structures_.get()); 713 driver_->SendAutofillTypePredictionsToRenderer(form_structures_.get());
762 } 714 }
763 715
764 void AutofillManager::OnDidEndTextFieldEditing() { 716 void AutofillManager::OnDidEndTextFieldEditing() {
765 external_delegate_->DidEndTextFieldEditing(); 717 external_delegate_->DidEndTextFieldEditing();
766 } 718 }
767 719
768 void AutofillManager::OnAutocheckoutPageCompleted(
769 autofill::AutocheckoutStatus status) {
770 autocheckout_manager_.OnAutocheckoutPageCompleted(status);
771 }
772
773 std::string AutofillManager::GetAutocheckoutURLPrefix() const {
774 if (!driver_->GetWebContents())
775 return std::string();
776
777 autofill::autocheckout::WhitelistManager* whitelist_manager =
778 manager_delegate_->GetAutocheckoutWhitelistManager();
779
780 return whitelist_manager ? whitelist_manager->GetMatchedURLPrefix(
781 driver_->GetWebContents()->GetURL()) : std::string();
782 }
783
784 bool AutofillManager::IsAutofillEnabled() const { 720 bool AutofillManager::IsAutofillEnabled() const {
785 return manager_delegate_->GetPrefs()->GetBoolean(prefs::kAutofillEnabled); 721 return manager_delegate_->GetPrefs()->GetBoolean(prefs::kAutofillEnabled);
786 } 722 }
787 723
788 void AutofillManager::ImportFormData(const FormStructure& submitted_form) { 724 void AutofillManager::ImportFormData(const FormStructure& submitted_form) {
789 const CreditCard* imported_credit_card; 725 const CreditCard* imported_credit_card;
790 if (!personal_data_->ImportFormData(submitted_form, &imported_credit_card)) 726 if (!personal_data_->ImportFormData(submitted_form, &imported_credit_card))
791 return; 727 return;
792 728
793 // If credit card information was submitted, we need to confirm whether to 729 // If credit card information was submitted, we need to confirm whether to
(...skipping 18 matching lines...) Expand all
812 const TimeTicks& submission_time) { 748 const TimeTicks& submission_time) {
813 submitted_form->LogQualityMetrics(*metric_logger_, 749 submitted_form->LogQualityMetrics(*metric_logger_,
814 load_time, 750 load_time,
815 interaction_time, 751 interaction_time,
816 submission_time); 752 submission_time);
817 753
818 if (submitted_form->ShouldBeCrowdsourced()) 754 if (submitted_form->ShouldBeCrowdsourced())
819 UploadFormData(*submitted_form); 755 UploadFormData(*submitted_form);
820 } 756 }
821 757
822 void AutofillManager::OnMaybeShowAutocheckoutBubble(
823 const FormData& form,
824 const gfx::RectF& bounding_box) {
825 if (!IsAutofillEnabled())
826 return;
827
828 // Don't show bubble if corresponding FormStructure doesn't have anything to
829 // autofill.
830 FormStructure* cached_form;
831 if (!FindCachedForm(form, &cached_form))
832 return;
833
834 // Don't offer Autocheckout bubble if Autofill server is not aware of this
835 // form in the context of Autocheckout experiment.
836 if (!HasServerSpecifiedFieldTypes(*cached_form))
837 return;
838
839 autocheckout_manager_.MaybeShowAutocheckoutBubble(form.origin, bounding_box);
840 }
841
842 void AutofillManager::UploadFormData(const FormStructure& submitted_form) { 758 void AutofillManager::UploadFormData(const FormStructure& submitted_form) {
843 if (!download_manager_) 759 if (!download_manager_)
844 return; 760 return;
845 761
846 // Check if the form is among the forms that were recently auto-filled. 762 // Check if the form is among the forms that were recently auto-filled.
847 bool was_autofilled = false; 763 bool was_autofilled = false;
848 std::string form_signature = submitted_form.FormSignature(); 764 std::string form_signature = submitted_form.FormSignature();
849 for (std::list<std::string>::const_iterator it = 765 for (std::list<std::string>::const_iterator it =
850 autofilled_form_signatures_.begin(); 766 autofilled_form_signatures_.begin();
851 it != autofilled_form_signatures_.end() && !was_autofilled; 767 it != autofilled_form_signatures_.end() && !was_autofilled;
(...skipping 24 matching lines...) Expand all
876 792
877 AutofillManager::AutofillManager(AutofillDriver* driver, 793 AutofillManager::AutofillManager(AutofillDriver* driver,
878 autofill::AutofillManagerDelegate* delegate, 794 autofill::AutofillManagerDelegate* delegate,
879 PersonalDataManager* personal_data) 795 PersonalDataManager* personal_data)
880 : driver_(driver), 796 : driver_(driver),
881 manager_delegate_(delegate), 797 manager_delegate_(delegate),
882 app_locale_("en-US"), 798 app_locale_("en-US"),
883 personal_data_(personal_data), 799 personal_data_(personal_data),
884 autocomplete_history_manager_( 800 autocomplete_history_manager_(
885 new AutocompleteHistoryManager(driver, delegate)), 801 new AutocompleteHistoryManager(driver, delegate)),
886 autocheckout_manager_(this),
887 metric_logger_(new AutofillMetrics), 802 metric_logger_(new AutofillMetrics),
888 has_logged_autofill_enabled_(false), 803 has_logged_autofill_enabled_(false),
889 has_logged_address_suggestions_count_(false), 804 has_logged_address_suggestions_count_(false),
890 did_show_suggestions_(false), 805 did_show_suggestions_(false),
891 user_did_type_(false), 806 user_did_type_(false),
892 user_did_autofill_(false), 807 user_did_autofill_(false),
893 user_did_edit_autofilled_field_(false), 808 user_did_edit_autofilled_field_(false),
894 external_delegate_(NULL), 809 external_delegate_(NULL),
895 test_delegate_(NULL), 810 test_delegate_(NULL),
896 weak_ptr_factory_(this) { 811 weak_ptr_factory_(this) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 } 891 }
977 892
978 bool AutofillManager::GetCachedFormAndField(const FormData& form, 893 bool AutofillManager::GetCachedFormAndField(const FormData& form,
979 const FormFieldData& field, 894 const FormFieldData& field,
980 FormStructure** form_structure, 895 FormStructure** form_structure,
981 AutofillField** autofill_field) { 896 AutofillField** autofill_field) {
982 // Find the FormStructure that corresponds to |form|. 897 // Find the FormStructure that corresponds to |form|.
983 // If we do not have this form in our cache but it is parseable, we'll add it 898 // If we do not have this form in our cache but it is parseable, we'll add it
984 // in the call to |UpdateCachedForm()|. 899 // in the call to |UpdateCachedForm()|.
985 if (!FindCachedForm(form, form_structure) && 900 if (!FindCachedForm(form, form_structure) &&
986 !FormStructure(form, GetAutocheckoutURLPrefix()).ShouldBeParsed(false)) { 901 !FormStructure(form).ShouldBeParsed(false)) {
987 return false; 902 return false;
988 } 903 }
989 904
990 // Update the cached form to reflect any dynamic changes to the form data, if 905 // Update the cached form to reflect any dynamic changes to the form data, if
991 // necessary. 906 // necessary.
992 if (!UpdateCachedForm(form, *form_structure, form_structure)) 907 if (!UpdateCachedForm(form, *form_structure, form_structure))
993 return false; 908 return false;
994 909
995 // No data to return if there are no auto-fillable fields. 910 // No data to return if there are no auto-fillable fields.
996 if (!(*form_structure)->autofill_count()) 911 if (!(*form_structure)->autofill_count())
(...skipping 26 matching lines...) Expand all
1023 needs_update = *cached_form->field(i) != live_form.fields[i]; 938 needs_update = *cached_form->field(i) != live_form.fields[i];
1024 } 939 }
1025 940
1026 if (!needs_update) 941 if (!needs_update)
1027 return true; 942 return true;
1028 943
1029 if (form_structures_.size() >= kMaxFormCacheSize) 944 if (form_structures_.size() >= kMaxFormCacheSize)
1030 return false; 945 return false;
1031 946
1032 // Add the new or updated form to our cache. 947 // Add the new or updated form to our cache.
1033 form_structures_.push_back( 948 form_structures_.push_back(new FormStructure(live_form));
1034 new FormStructure(live_form, GetAutocheckoutURLPrefix()));
1035 *updated_form = *form_structures_.rbegin(); 949 *updated_form = *form_structures_.rbegin();
1036 (*updated_form)->DetermineHeuristicTypes(*metric_logger_); 950 (*updated_form)->DetermineHeuristicTypes(*metric_logger_);
1037 951
1038 // If we have cached data, propagate it to the updated form. 952 // If we have cached data, propagate it to the updated form.
1039 if (cached_form) { 953 if (cached_form) {
1040 std::map<base::string16, const AutofillField*> cached_fields; 954 std::map<base::string16, const AutofillField*> cached_fields;
1041 for (size_t i = 0; i < cached_form->field_count(); ++i) { 955 for (size_t i = 0; i < cached_form->field_count(); ++i) {
1042 const AutofillField* field = cached_form->field(i); 956 const AutofillField* field = cached_form->field(i);
1043 cached_fields[field->unique_name()] = field; 957 cached_fields[field->unique_name()] = field;
1044 } 958 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 personal_data_->GetCreditCardSuggestions( 1014 personal_data_->GetCreditCardSuggestions(
1101 type, field.value, values, labels, icons, &guid_pairs); 1015 type, field.value, values, labels, icons, &guid_pairs);
1102 1016
1103 for (size_t i = 0; i < guid_pairs.size(); ++i) { 1017 for (size_t i = 0; i < guid_pairs.size(); ++i) {
1104 unique_ids->push_back(PackGUIDs(guid_pairs[i], GUIDPair(std::string(), 0))); 1018 unique_ids->push_back(PackGUIDs(guid_pairs[i], GUIDPair(std::string(), 0)));
1105 } 1019 }
1106 } 1020 }
1107 1021
1108 void AutofillManager::ParseForms(const std::vector<FormData>& forms) { 1022 void AutofillManager::ParseForms(const std::vector<FormData>& forms) {
1109 std::vector<FormStructure*> non_queryable_forms; 1023 std::vector<FormStructure*> non_queryable_forms;
1110 std::string autocheckout_url_prefix = GetAutocheckoutURLPrefix();
1111 for (std::vector<FormData>::const_iterator iter = forms.begin(); 1024 for (std::vector<FormData>::const_iterator iter = forms.begin();
1112 iter != forms.end(); ++iter) { 1025 iter != forms.end(); ++iter) {
1113 scoped_ptr<FormStructure> form_structure( 1026 scoped_ptr<FormStructure> form_structure(new FormStructure(*iter));
1114 new FormStructure(*iter, autocheckout_url_prefix));
1115 if (!form_structure->ShouldBeParsed(false)) 1027 if (!form_structure->ShouldBeParsed(false))
1116 continue; 1028 continue;
1117 1029
1118 form_structure->DetermineHeuristicTypes(*metric_logger_); 1030 form_structure->DetermineHeuristicTypes(*metric_logger_);
1119 1031
1120 // Set aside forms with method GET or author-specified types, so that they 1032 // Set aside forms with method GET or author-specified types, so that they
1121 // are not included in the query to the server. 1033 // are not included in the query to the server.
1122 if (form_structure->ShouldBeCrowdsourced()) 1034 if (form_structure->ShouldBeCrowdsourced())
1123 form_structures_.push_back(form_structure.release()); 1035 form_structures_.push_back(form_structure.release());
1124 else 1036 else
1125 non_queryable_forms.push_back(form_structure.release()); 1037 non_queryable_forms.push_back(form_structure.release());
1126 } 1038 }
1127 1039
1128 if (form_structures_.empty()) { 1040 if (!form_structures_.empty() && download_manager_) {
1129 // Call OnLoadedPageMetaData with no page metadata immediately if there is
1130 // no form in the page. This give |autocheckout_manager| a chance to
1131 // terminate Autocheckout and send Autocheckout status.
1132 autocheckout_manager_.OnLoadedPageMetaData(
1133 scoped_ptr<autofill::AutocheckoutPageMetaData>());
1134 } else if (download_manager_) {
1135 // Query the server if we have at least one of the forms were parsed. 1041 // Query the server if we have at least one of the forms were parsed.
1136 download_manager_->StartQueryRequest(form_structures_.get(), 1042 download_manager_->StartQueryRequest(form_structures_.get(),
1137 *metric_logger_); 1043 *metric_logger_);
1138 } 1044 }
1139 1045
1140 for (std::vector<FormStructure*>::const_iterator iter = 1046 for (std::vector<FormStructure*>::const_iterator iter =
1141 non_queryable_forms.begin(); 1047 non_queryable_forms.begin();
1142 iter != non_queryable_forms.end(); ++iter) { 1048 iter != non_queryable_forms.end(); ++iter) {
1143 form_structures_.push_back(*iter); 1049 form_structures_.push_back(*iter);
1144 } 1050 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 1116
1211 void AutofillManager::UpdateInitialInteractionTimestamp( 1117 void AutofillManager::UpdateInitialInteractionTimestamp(
1212 const TimeTicks& interaction_timestamp) { 1118 const TimeTicks& interaction_timestamp) {
1213 if (initial_interaction_timestamp_.is_null() || 1119 if (initial_interaction_timestamp_.is_null() ||
1214 interaction_timestamp < initial_interaction_timestamp_) { 1120 interaction_timestamp < initial_interaction_timestamp_) {
1215 initial_interaction_timestamp_ = interaction_timestamp; 1121 initial_interaction_timestamp_ = interaction_timestamp;
1216 } 1122 }
1217 } 1123 }
1218 1124
1219 } // namespace autofill 1125 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698