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

Side by Side Diff: chrome/browser/autofill/autofill_manager_unittest.cc

Issue 8387016: Move some Autofill processing logic on form submit to a background thread. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Don't rely on any particular order of evaluation for the arguments to PostTaskAndReply Created 9 years, 1 month 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
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <vector> 5 #include <vector>
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/scoped_vector.h" 9 #include "base/memory/scoped_vector.h"
10 #include "base/string16.h" 10 #include "base/string16.h"
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 "Miku Hatsune", "4234567890654321", month, year, 404 "Miku Hatsune", "4234567890654321", month, year,
405 has_address_fields, true, true); 405 has_address_fields, true, true);
406 } 406 }
407 407
408 class TestAutofillManager : public AutofillManager { 408 class TestAutofillManager : public AutofillManager {
409 public: 409 public:
410 TestAutofillManager(TabContentsWrapper* tab_contents, 410 TestAutofillManager(TabContentsWrapper* tab_contents,
411 TestPersonalDataManager* personal_data) 411 TestPersonalDataManager* personal_data)
412 : AutofillManager(tab_contents, personal_data), 412 : AutofillManager(tab_contents, personal_data),
413 personal_data_(personal_data), 413 personal_data_(personal_data),
414 autofill_enabled_(true) { 414 autofill_enabled_(true),
415 did_finish_async_form_submit_(false),
416 message_loop_is_running_(false) {
415 } 417 }
416 418
417 virtual bool IsAutofillEnabled() const OVERRIDE { return autofill_enabled_; } 419 virtual bool IsAutofillEnabled() const OVERRIDE { return autofill_enabled_; }
418 420
419 void set_autofill_enabled(bool autofill_enabled) { 421 void set_autofill_enabled(bool autofill_enabled) {
420 autofill_enabled_ = autofill_enabled; 422 autofill_enabled_ = autofill_enabled;
421 } 423 }
422 424
425 void set_expected_submitted_field_types(
426 const std::vector<FieldTypeSet>& expected_types) {
427 expected_submitted_field_types_ = expected_types;
428 }
429
430 virtual void UploadFormDataAsyncCallback(
431 const FormStructure* submitted_form,
432 const base::TimeTicks& load_time,
433 const base::TimeTicks& interaction_time,
434 const base::TimeTicks& submission_time) OVERRIDE {
435 if (message_loop_is_running_) {
436 MessageLoop::current()->Quit();
437 message_loop_is_running_ = false;
438 } else {
439 did_finish_async_form_submit_ = true;
440 }
441
442 // If we have expected field types set, make sure they match.
443 if (!expected_submitted_field_types_.empty()) {
444 ASSERT_EQ(expected_submitted_field_types_.size(),
445 submitted_form->field_count());
446 for (size_t i = 0; i < expected_submitted_field_types_.size(); ++i) {
447 SCOPED_TRACE(
448 StringPrintf("Field %d with value %s", static_cast<int>(i),
449 UTF16ToUTF8(submitted_form->field(i)->value).c_str()));
450 const FieldTypeSet& possible_types =
451 submitted_form->field(i)->possible_types();
452 EXPECT_EQ(expected_submitted_field_types_[i].size(),
453 possible_types.size());
454 for (FieldTypeSet::const_iterator it =
455 expected_submitted_field_types_[i].begin();
456 it != expected_submitted_field_types_[i].end(); ++it) {
457 EXPECT_TRUE(possible_types.count(*it))
458 << "Expected type: " << AutofillType::FieldTypeToString(*it);
459 }
460 }
461 }
462
463 AutofillManager::UploadFormDataAsyncCallback(submitted_form,
464 load_time,
465 interaction_time,
466 submission_time);
467 }
468
469 // Wait for the asynchronous OnFormSubmitted() call to complete.
470 void WaitForAsyncFormSubmit() {
471 if (!did_finish_async_form_submit_) {
472 // TODO(isherman): It seems silly to need this variable. Is there some
473 // way I can just query the message loop's state?
474 message_loop_is_running_ = true;
475 MessageLoop::current()->Run();
476 } else {
477 did_finish_async_form_submit_ = false;
478 }
479 }
480
423 virtual void UploadFormData(const FormStructure& submitted_form) OVERRIDE { 481 virtual void UploadFormData(const FormStructure& submitted_form) OVERRIDE {
424 submitted_form_signature_ = submitted_form.FormSignature(); 482 submitted_form_signature_ = submitted_form.FormSignature();
425 } 483 }
426 484
427 const std::string GetSubmittedFormSignature() { 485 const std::string GetSubmittedFormSignature() {
428 return submitted_form_signature_; 486 return submitted_form_signature_;
429 } 487 }
430 488
431 AutofillProfile* GetProfileWithGUID(const char* guid) { 489 AutofillProfile* GetProfileWithGUID(const char* guid) {
432 return personal_data_->GetProfileWithGUID(guid); 490 return personal_data_->GetProfileWithGUID(guid);
(...skipping 12 matching lines...) Expand all
445 base::StringPrintf("00000000-0000-0000-0000-%012d", credit_card_id); 503 base::StringPrintf("00000000-0000-0000-0000-%012d", credit_card_id);
446 504
447 return PackGUIDs(GUIDPair(credit_card_guid, 0), GUIDPair(std::string(), 0)); 505 return PackGUIDs(GUIDPair(credit_card_guid, 0), GUIDPair(std::string(), 0));
448 } 506 }
449 507
450 void AddSeenForm(FormStructure* form) { 508 void AddSeenForm(FormStructure* form) {
451 form_structures()->push_back(form); 509 form_structures()->push_back(form);
452 } 510 }
453 511
454 private: 512 private:
513 // AutofillManager is ref counted.
514 virtual ~TestAutofillManager() {}
515
455 // Weak reference. 516 // Weak reference.
456 TestPersonalDataManager* personal_data_; 517 TestPersonalDataManager* personal_data_;
518
457 bool autofill_enabled_; 519 bool autofill_enabled_;
520
521 bool did_finish_async_form_submit_;
522 bool message_loop_is_running_;
523
458 std::string submitted_form_signature_; 524 std::string submitted_form_signature_;
525 std::vector<FieldTypeSet> expected_submitted_field_types_;
459 526
460 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager); 527 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager);
461 }; 528 };
462 529
463 } // namespace 530 } // namespace
464 531
465 class AutofillManagerTest : public TabContentsWrapperTestHarness { 532 class AutofillManagerTest : public TabContentsWrapperTestHarness {
466 public: 533 public:
467 typedef AutofillManager::GUIDPair GUIDPair; 534 typedef AutofillManager::GUIDPair GUIDPair;
468 535
469 AutofillManagerTest() 536 AutofillManagerTest()
470 : TabContentsWrapperTestHarness(), 537 : TabContentsWrapperTestHarness(),
471 browser_thread_(BrowserThread::UI, &message_loop_) { 538 ui_thread_(BrowserThread::UI, &message_loop_),
539 file_thread_(BrowserThread::FILE) {
472 } 540 }
473 541
474 virtual ~AutofillManagerTest() { 542 virtual ~AutofillManagerTest() {
475 // Order of destruction is important as AutofillManager relies on 543 // Order of destruction is important as AutofillManager relies on
476 // PersonalDataManager to be around when it gets destroyed. 544 // PersonalDataManager to be around when it gets destroyed.
477 autofill_manager_.reset(NULL); 545 autofill_manager_ = NULL;
478 } 546 }
479 547
480 virtual void SetUp() { 548 virtual void SetUp() OVERRIDE {
481 Profile* profile = new TestingProfile(); 549 Profile* profile = new TestingProfile();
482 browser_context_.reset(profile); 550 browser_context_.reset(profile);
483 PersonalDataManagerFactory::GetInstance()->SetTestingFactory( 551 PersonalDataManagerFactory::GetInstance()->SetTestingFactory(
484 profile, TestPersonalDataManager::Build); 552 profile, TestPersonalDataManager::Build);
485 553
486 TabContentsWrapperTestHarness::SetUp(); 554 TabContentsWrapperTestHarness::SetUp();
487 autofill_manager_.reset(new TestAutofillManager(contents_wrapper(), 555 autofill_manager_ = new TestAutofillManager(contents_wrapper(),
488 &personal_data_)); 556 &personal_data_);
557
558 file_thread_.Start();
559 }
560
561 virtual void TearDown() OVERRIDE {
562 file_thread_.Stop();
563 TabContentsWrapperTestHarness::TearDown();
489 } 564 }
490 565
491 void GetAutofillSuggestions(int query_id, 566 void GetAutofillSuggestions(int query_id,
492 const webkit_glue::FormData& form, 567 const webkit_glue::FormData& form,
493 const webkit_glue::FormField& field) { 568 const webkit_glue::FormField& field) {
494 autofill_manager_->OnQueryFormFieldAutofill(query_id, form, field); 569 autofill_manager_->OnQueryFormFieldAutofill(query_id, form, field);
495 } 570 }
496 571
497 void GetAutofillSuggestions(const webkit_glue::FormData& form, 572 void GetAutofillSuggestions(const webkit_glue::FormData& form,
498 const webkit_glue::FormField& field) { 573 const webkit_glue::FormField& field) {
499 GetAutofillSuggestions(kDefaultPageID, form, field); 574 GetAutofillSuggestions(kDefaultPageID, form, field);
500 } 575 }
501 576
502 void AutocompleteSuggestionsReturned(const std::vector<string16>& result) { 577 void AutocompleteSuggestionsReturned(const std::vector<string16>& result) {
503 contents_wrapper()->autocomplete_history_manager()-> 578 contents_wrapper()->autocomplete_history_manager()->
504 SendSuggestions(&result); 579 SendSuggestions(&result);
505 } 580 }
506 581
507 void FormsSeen(const std::vector<webkit_glue::FormData>& forms) { 582 void FormsSeen(const std::vector<webkit_glue::FormData>& forms) {
508 autofill_manager_->OnFormsSeen(forms, base::TimeTicks()); 583 autofill_manager_->OnFormsSeen(forms, base::TimeTicks());
509 } 584 }
510 585
511 void FormSubmitted(const FormData& form) { 586 void FormSubmitted(const FormData& form) {
512 autofill_manager_->OnFormSubmitted(form, base::TimeTicks::Now()); 587 if (autofill_manager_->OnFormSubmitted(form, base::TimeTicks::Now()))
588 autofill_manager_->WaitForAsyncFormSubmit();
513 } 589 }
514 590
515 void FillAutofillFormData(int query_id, 591 void FillAutofillFormData(int query_id,
516 const webkit_glue::FormData& form, 592 const webkit_glue::FormData& form,
517 const webkit_glue::FormField& field, 593 const webkit_glue::FormField& field,
518 int unique_id) { 594 int unique_id) {
519 autofill_manager_->OnFillAutofillFormData(query_id, form, field, unique_id); 595 autofill_manager_->OnFillAutofillFormData(query_id, form, field, unique_id);
520 } 596 }
521 597
522 int PackGUIDs(const GUIDPair& cc_guid, const GUIDPair& profile_guid) const { 598 int PackGUIDs(const GUIDPair& cc_guid, const GUIDPair& profile_guid) const {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 if (page_id) 639 if (page_id)
564 *page_id = autofill_param.a; 640 *page_id = autofill_param.a;
565 if (results) 641 if (results)
566 *results = autofill_param.b; 642 *results = autofill_param.b;
567 643
568 process()->sink().ClearMessages(); 644 process()->sink().ClearMessages();
569 return true; 645 return true;
570 } 646 }
571 647
572 protected: 648 protected:
573 content::TestBrowserThread browser_thread_; 649 content::TestBrowserThread ui_thread_;
650 content::TestBrowserThread file_thread_;
574 651
575 scoped_ptr<TestAutofillManager> autofill_manager_; 652 scoped_refptr<TestAutofillManager> autofill_manager_;
576 TestPersonalDataManager personal_data_; 653 TestPersonalDataManager personal_data_;
577 654
578 private: 655 private:
579 DISALLOW_COPY_AND_ASSIGN(AutofillManagerTest); 656 DISALLOW_COPY_AND_ASSIGN(AutofillManagerTest);
580 }; 657 };
581 658
582 class TestFormStructure : public FormStructure { 659 class TestFormStructure : public FormStructure {
583 public: 660 public:
584 explicit TestFormStructure(const FormData& form) : FormStructure(form) {} 661 explicit TestFormStructure(const FormData& form) : FormStructure(form) {}
585 virtual ~TestFormStructure() {} 662 virtual ~TestFormStructure() {}
(...skipping 2180 matching lines...) Expand 10 before | Expand all | Expand 10 after
2766 types.insert(UNKNOWN_TYPE); 2843 types.insert(UNKNOWN_TYPE);
2767 form.fields.push_back(field); 2844 form.fields.push_back(field);
2768 expected_types.push_back(types); 2845 expected_types.push_back(types);
2769 2846
2770 autofill_test::CreateTestFormField("", "20", "901", "text", &field); 2847 autofill_test::CreateTestFormField("", "20", "901", "text", &field);
2771 types.clear(); 2848 types.clear();
2772 types.insert(UNKNOWN_TYPE); 2849 types.insert(UNKNOWN_TYPE);
2773 form.fields.push_back(field); 2850 form.fields.push_back(field);
2774 expected_types.push_back(types); 2851 expected_types.push_back(types);
2775 2852
2776 FormStructure form_structure(form); 2853 autofill_manager_->set_expected_submitted_field_types(expected_types);
2777 autofill_manager_->DeterminePossibleFieldTypesForUpload(&form_structure); 2854 FormSubmitted(form);
2778
2779 ASSERT_EQ(expected_types.size(), form_structure.field_count());
2780 for (size_t i = 0; i < expected_types.size(); ++i) {
2781 SCOPED_TRACE(
2782 StringPrintf("Field %d with value %s", static_cast<int>(i),
2783 UTF16ToUTF8(form_structure.field(i)->value).c_str()));
2784 const FieldTypeSet& possible_types =
2785 form_structure.field(i)->possible_types();
2786 EXPECT_EQ(expected_types[i].size(), possible_types.size());
2787 for (FieldTypeSet::const_iterator it = expected_types[i].begin();
2788 it != expected_types[i].end(); ++it) {
2789 EXPECT_TRUE(possible_types.count(*it))
2790 << "Expected type: " << AutofillType::FieldTypeToString(*it);
2791 }
2792 }
2793 }
2794
2795 TEST_F(AutofillManagerTest, DeterminePossibleFieldTypesForUploadStressTest) {
2796 personal_data_.ClearAutofillProfiles();
2797 const int kNumProfiles = 5;
2798 for (int i = 0; i < kNumProfiles; ++i) {
2799 AutofillProfile* profile = new AutofillProfile;
2800 autofill_test::SetProfileInfo(profile,
2801 StringPrintf("John%d", i).c_str(),
2802 "",
2803 StringPrintf("Doe%d", i).c_str(),
2804 StringPrintf("JohnDoe%d@somesite.com",
2805 i).c_str(),
2806 "",
2807 StringPrintf("%d 1st st.", i).c_str(),
2808 "",
2809 "Memphis", "Tennessee", "38116", "USA",
2810 StringPrintf("650234%04d", i).c_str());
2811 profile->set_guid(
2812 StringPrintf("00000000-0000-0000-0001-00000000%04d", i).c_str());
2813 personal_data_.AddProfile(profile);
2814 }
2815 FormData form;
2816 CreateTestAddressFormData(&form);
2817 ASSERT_LT(3U, form.fields.size());
2818 form.fields[0].value = ASCIIToUTF16("6502340001");
2819 form.fields[1].value = ASCIIToUTF16("John1");
2820 form.fields[2].value = ASCIIToUTF16("12345");
2821 FormStructure form_structure(form);
2822 autofill_manager_->DeterminePossibleFieldTypesForUpload(&form_structure);
2823 ASSERT_LT(3U, form_structure.field_count());
2824 const FieldTypeSet& possible_types0 =
2825 form_structure.field(0)->possible_types();
2826 EXPECT_EQ(2U, possible_types0.size());
2827 EXPECT_TRUE(possible_types0.find(PHONE_HOME_WHOLE_NUMBER) !=
2828 possible_types0.end());
2829 EXPECT_TRUE(possible_types0.find(PHONE_HOME_CITY_AND_NUMBER) !=
2830 possible_types0.end());
2831 const FieldTypeSet& possible_types1 =
2832 form_structure.field(1)->possible_types();
2833 EXPECT_EQ(1U, possible_types1.size());
2834 EXPECT_TRUE(possible_types1.find(NAME_FIRST) != possible_types1.end());
2835 const FieldTypeSet& possible_types2 =
2836 form_structure.field(2)->possible_types();
2837 EXPECT_EQ(1U, possible_types2.size());
2838 EXPECT_TRUE(possible_types2.find(UNKNOWN_TYPE) !=
2839 possible_types2.end());
2840 } 2855 }
2841 2856
2842 namespace { 2857 namespace {
2843 2858
2844 class MockAutofillExternalDelegate : public AutofillExternalDelegate { 2859 class MockAutofillExternalDelegate : public AutofillExternalDelegate {
2845 public: 2860 public:
2846 explicit MockAutofillExternalDelegate(TabContentsWrapper* wrapper) 2861 explicit MockAutofillExternalDelegate(TabContentsWrapper* wrapper)
2847 : AutofillExternalDelegate(wrapper) {} 2862 : AutofillExternalDelegate(wrapper) {}
2848 virtual ~MockAutofillExternalDelegate() {} 2863 virtual ~MockAutofillExternalDelegate() {}
2849 2864
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2896 2911
2897 AutofillManager* autofill_manager = contents_wrapper()->autofill_manager(); 2912 AutofillManager* autofill_manager = contents_wrapper()->autofill_manager();
2898 EXPECT_TRUE(autofill_manager->external_delegate()); 2913 EXPECT_TRUE(autofill_manager->external_delegate());
2899 2914
2900 AutocompleteHistoryManager* autocomplete_history_manager = 2915 AutocompleteHistoryManager* autocomplete_history_manager =
2901 contents_wrapper()->autocomplete_history_manager(); 2916 contents_wrapper()->autocomplete_history_manager();
2902 EXPECT_TRUE(autocomplete_history_manager->external_delegate()); 2917 EXPECT_TRUE(autocomplete_history_manager->external_delegate());
2903 } 2918 }
2904 2919
2905 #endif // OS_ANDROID 2920 #endif // OS_ANDROID
OLDNEW
« no previous file with comments | « chrome/browser/autofill/autofill_manager.cc ('k') | chrome/browser/autofill/autofill_metrics_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698