OLD | NEW |
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 <algorithm> | 5 #include <algorithm> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 return autocheckout_url_prefix_; | 487 return autocheckout_url_prefix_; |
488 } | 488 } |
489 | 489 |
490 const std::vector<std::pair<WebFormElement::AutocompleteResult, FormData> >& | 490 const std::vector<std::pair<WebFormElement::AutocompleteResult, FormData> >& |
491 request_autocomplete_results() const { | 491 request_autocomplete_results() const { |
492 return request_autocomplete_results_; | 492 return request_autocomplete_results_; |
493 } | 493 } |
494 | 494 |
495 | 495 |
496 void set_expected_submitted_field_types( | 496 void set_expected_submitted_field_types( |
497 const std::vector<FieldTypeSet>& expected_types) { | 497 const std::vector<ServerFieldTypeSet>& expected_types) { |
498 expected_submitted_field_types_ = expected_types; | 498 expected_submitted_field_types_ = expected_types; |
499 } | 499 } |
500 | 500 |
501 virtual void UploadFormDataAsyncCallback( | 501 virtual void UploadFormDataAsyncCallback( |
502 const FormStructure* submitted_form, | 502 const FormStructure* submitted_form, |
503 const base::TimeTicks& load_time, | 503 const base::TimeTicks& load_time, |
504 const base::TimeTicks& interaction_time, | 504 const base::TimeTicks& interaction_time, |
505 const base::TimeTicks& submission_time) OVERRIDE { | 505 const base::TimeTicks& submission_time) OVERRIDE { |
506 message_loop_runner_->Quit(); | 506 message_loop_runner_->Quit(); |
507 | 507 |
508 // If we have expected field types set, make sure they match. | 508 // If we have expected field types set, make sure they match. |
509 if (!expected_submitted_field_types_.empty()) { | 509 if (!expected_submitted_field_types_.empty()) { |
510 ASSERT_EQ(expected_submitted_field_types_.size(), | 510 ASSERT_EQ(expected_submitted_field_types_.size(), |
511 submitted_form->field_count()); | 511 submitted_form->field_count()); |
512 for (size_t i = 0; i < expected_submitted_field_types_.size(); ++i) { | 512 for (size_t i = 0; i < expected_submitted_field_types_.size(); ++i) { |
513 SCOPED_TRACE( | 513 SCOPED_TRACE( |
514 base::StringPrintf( | 514 base::StringPrintf( |
515 "Field %d with value %s", static_cast<int>(i), | 515 "Field %d with value %s", static_cast<int>(i), |
516 UTF16ToUTF8(submitted_form->field(i)->value).c_str())); | 516 UTF16ToUTF8(submitted_form->field(i)->value).c_str())); |
517 const FieldTypeSet& possible_types = | 517 const ServerFieldTypeSet& possible_types = |
518 submitted_form->field(i)->possible_types(); | 518 submitted_form->field(i)->possible_types(); |
519 EXPECT_EQ(expected_submitted_field_types_[i].size(), | 519 EXPECT_EQ(expected_submitted_field_types_[i].size(), |
520 possible_types.size()); | 520 possible_types.size()); |
521 for (FieldTypeSet::const_iterator it = | 521 for (ServerFieldTypeSet::const_iterator it = |
522 expected_submitted_field_types_[i].begin(); | 522 expected_submitted_field_types_[i].begin(); |
523 it != expected_submitted_field_types_[i].end(); ++it) { | 523 it != expected_submitted_field_types_[i].end(); ++it) { |
524 EXPECT_TRUE(possible_types.count(*it)) | 524 EXPECT_TRUE(possible_types.count(*it)) |
525 << "Expected type: " << AutofillType::FieldTypeToString(*it); | 525 << "Expected type: " << AutofillType::FieldTypeToString(*it); |
526 } | 526 } |
527 } | 527 } |
528 } | 528 } |
529 | 529 |
530 AutofillManager::UploadFormDataAsyncCallback(submitted_form, | 530 AutofillManager::UploadFormDataAsyncCallback(submitted_form, |
531 load_time, | 531 load_time, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 TestPersonalDataManager* personal_data_; | 631 TestPersonalDataManager* personal_data_; |
632 | 632 |
633 bool autofill_enabled_; | 633 bool autofill_enabled_; |
634 std::vector<std::pair<WebFormElement::AutocompleteResult, FormData> > | 634 std::vector<std::pair<WebFormElement::AutocompleteResult, FormData> > |
635 request_autocomplete_results_; | 635 request_autocomplete_results_; |
636 | 636 |
637 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; | 637 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
638 | 638 |
639 std::string autocheckout_url_prefix_; | 639 std::string autocheckout_url_prefix_; |
640 std::string submitted_form_signature_; | 640 std::string submitted_form_signature_; |
641 std::vector<FieldTypeSet> expected_submitted_field_types_; | 641 std::vector<ServerFieldTypeSet> expected_submitted_field_types_; |
642 | 642 |
643 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager); | 643 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager); |
644 }; | 644 }; |
645 | 645 |
646 class TestAutofillExternalDelegate : public AutofillExternalDelegate { | 646 class TestAutofillExternalDelegate : public AutofillExternalDelegate { |
647 public: | 647 public: |
648 explicit TestAutofillExternalDelegate(content::WebContents* web_contents, | 648 explicit TestAutofillExternalDelegate(content::WebContents* web_contents, |
649 AutofillManager* autofill_manager, | 649 AutofillManager* autofill_manager, |
650 AutofillDriver* autofill_driver) | 650 AutofillDriver* autofill_driver) |
651 : AutofillExternalDelegate(web_contents, autofill_manager, | 651 : AutofillExternalDelegate(web_contents, autofill_manager, |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 // profile from which the off the record profile is derived. | 857 // profile from which the off the record profile is derived. |
858 scoped_ptr<Profile> other_browser_context_; | 858 scoped_ptr<Profile> other_browser_context_; |
859 }; | 859 }; |
860 | 860 |
861 class TestFormStructure : public FormStructure { | 861 class TestFormStructure : public FormStructure { |
862 public: | 862 public: |
863 explicit TestFormStructure(const FormData& form) | 863 explicit TestFormStructure(const FormData& form) |
864 : FormStructure(form, std::string()) {} | 864 : FormStructure(form, std::string()) {} |
865 virtual ~TestFormStructure() {} | 865 virtual ~TestFormStructure() {} |
866 | 866 |
867 void SetFieldTypes(const std::vector<AutofillFieldType>& heuristic_types, | 867 void SetFieldTypes(const std::vector<ServerFieldType>& heuristic_types, |
868 const std::vector<AutofillFieldType>& server_types) { | 868 const std::vector<ServerFieldType>& server_types) { |
869 ASSERT_EQ(field_count(), heuristic_types.size()); | 869 ASSERT_EQ(field_count(), heuristic_types.size()); |
870 ASSERT_EQ(field_count(), server_types.size()); | 870 ASSERT_EQ(field_count(), server_types.size()); |
871 | 871 |
872 for (size_t i = 0; i < field_count(); ++i) { | 872 for (size_t i = 0; i < field_count(); ++i) { |
873 AutofillField* form_field = field(i); | 873 AutofillField* form_field = field(i); |
874 ASSERT_TRUE(form_field); | 874 ASSERT_TRUE(form_field); |
875 form_field->set_heuristic_type(heuristic_types[i]); | 875 form_field->set_heuristic_type(heuristic_types[i]); |
876 form_field->set_server_type(server_types[i]); | 876 form_field->set_server_type(server_types[i]); |
877 } | 877 } |
878 | 878 |
(...skipping 1763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2642 FormData form; | 2642 FormData form; |
2643 test::CreateTestAddressFormData(&form); | 2643 test::CreateTestAddressFormData(&form); |
2644 | 2644 |
2645 // Simulate having seen this form on page load. | 2645 // Simulate having seen this form on page load. |
2646 // |form_structure| will be owned by |autofill_manager_|. | 2646 // |form_structure| will be owned by |autofill_manager_|. |
2647 TestFormStructure* form_structure = new TestFormStructure(form); | 2647 TestFormStructure* form_structure = new TestFormStructure(form); |
2648 AutofillMetrics metrics_logger; // ignored | 2648 AutofillMetrics metrics_logger; // ignored |
2649 form_structure->DetermineHeuristicTypes(metrics_logger); | 2649 form_structure->DetermineHeuristicTypes(metrics_logger); |
2650 | 2650 |
2651 // Clear the heuristic types, and instead set the appropriate server types. | 2651 // Clear the heuristic types, and instead set the appropriate server types. |
2652 std::vector<AutofillFieldType> heuristic_types, server_types; | 2652 std::vector<ServerFieldType> heuristic_types, server_types; |
2653 for (size_t i = 0; i < form.fields.size(); ++i) { | 2653 for (size_t i = 0; i < form.fields.size(); ++i) { |
2654 heuristic_types.push_back(UNKNOWN_TYPE); | 2654 heuristic_types.push_back(UNKNOWN_TYPE); |
2655 server_types.push_back(form_structure->field(i)->type()); | 2655 server_types.push_back(form_structure->field(i)->Type().server_type()); |
2656 } | 2656 } |
2657 form_structure->SetFieldTypes(heuristic_types, server_types); | 2657 form_structure->SetFieldTypes(heuristic_types, server_types); |
2658 autofill_manager_->AddSeenForm(form_structure); | 2658 autofill_manager_->AddSeenForm(form_structure); |
2659 | 2659 |
2660 // Fill the form. | 2660 // Fill the form. |
2661 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); | 2661 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); |
2662 GUIDPair empty(std::string(), 0); | 2662 GUIDPair empty(std::string(), 0); |
2663 int response_page_id = 0; | 2663 int response_page_id = 0; |
2664 FormData response_data; | 2664 FormData response_data; |
2665 FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0], | 2665 FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0], |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2763 } | 2763 } |
2764 | 2764 |
2765 TEST_F(AutofillManagerTest, DeterminePossibleFieldTypesForUpload) { | 2765 TEST_F(AutofillManagerTest, DeterminePossibleFieldTypesForUpload) { |
2766 FormData form; | 2766 FormData form; |
2767 form.name = ASCIIToUTF16("MyForm"); | 2767 form.name = ASCIIToUTF16("MyForm"); |
2768 form.method = ASCIIToUTF16("POST"); | 2768 form.method = ASCIIToUTF16("POST"); |
2769 form.origin = GURL("http://myform.com/form.html"); | 2769 form.origin = GURL("http://myform.com/form.html"); |
2770 form.action = GURL("http://myform.com/submit.html"); | 2770 form.action = GURL("http://myform.com/submit.html"); |
2771 form.user_submitted = true; | 2771 form.user_submitted = true; |
2772 | 2772 |
2773 std::vector<FieldTypeSet> expected_types; | 2773 std::vector<ServerFieldTypeSet> expected_types; |
2774 | 2774 |
2775 // These fields should all match. | 2775 // These fields should all match. |
2776 FormFieldData field; | 2776 FormFieldData field; |
2777 FieldTypeSet types; | 2777 ServerFieldTypeSet types; |
2778 test::CreateTestFormField("", "1", "Elvis", "text", &field); | 2778 test::CreateTestFormField("", "1", "Elvis", "text", &field); |
2779 types.clear(); | 2779 types.clear(); |
2780 types.insert(NAME_FIRST); | 2780 types.insert(NAME_FIRST); |
2781 form.fields.push_back(field); | 2781 form.fields.push_back(field); |
2782 expected_types.push_back(types); | 2782 expected_types.push_back(types); |
2783 | 2783 |
2784 test::CreateTestFormField("", "2", "Aaron", "text", &field); | 2784 test::CreateTestFormField("", "2", "Aaron", "text", &field); |
2785 types.clear(); | 2785 types.clear(); |
2786 types.insert(NAME_MIDDLE); | 2786 types.insert(NAME_MIDDLE); |
2787 form.fields.push_back(field); | 2787 form.fields.push_back(field); |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3156 autofill_manager_->MarkAsFirstPageInAutocheckoutFlow(); | 3156 autofill_manager_->MarkAsFirstPageInAutocheckoutFlow(); |
3157 | 3157 |
3158 FormData form; | 3158 FormData form; |
3159 test::CreateTestAddressFormData(&form); | 3159 test::CreateTestAddressFormData(&form); |
3160 | 3160 |
3161 TestFormStructure* form_structure = new TestFormStructure(form); | 3161 TestFormStructure* form_structure = new TestFormStructure(form); |
3162 AutofillMetrics metrics_logger; // ignored | 3162 AutofillMetrics metrics_logger; // ignored |
3163 form_structure->DetermineHeuristicTypes(metrics_logger); | 3163 form_structure->DetermineHeuristicTypes(metrics_logger); |
3164 | 3164 |
3165 // Build and add form structure with server data. | 3165 // Build and add form structure with server data. |
3166 std::vector<AutofillFieldType> heuristic_types, server_types; | 3166 std::vector<ServerFieldType> heuristic_types, server_types; |
3167 for (size_t i = 0; i < form.fields.size(); ++i) { | 3167 for (size_t i = 0; i < form.fields.size(); ++i) { |
3168 heuristic_types.push_back(UNKNOWN_TYPE); | 3168 heuristic_types.push_back(UNKNOWN_TYPE); |
3169 server_types.push_back(form_structure->field(i)->type()); | 3169 server_types.push_back(form_structure->field(i)->Type().server_type()); |
3170 } | 3170 } |
3171 form_structure->SetFieldTypes(heuristic_types, server_types); | 3171 form_structure->SetFieldTypes(heuristic_types, server_types); |
3172 autofill_manager_->AddSeenForm(form_structure); | 3172 autofill_manager_->AddSeenForm(form_structure); |
3173 | 3173 |
3174 autofill_manager_->OnMaybeShowAutocheckoutBubble(form, gfx::RectF()); | 3174 autofill_manager_->OnMaybeShowAutocheckoutBubble(form, gfx::RectF()); |
3175 | 3175 |
3176 EXPECT_TRUE(delegate.autocheckout_bubble_shown()); | 3176 EXPECT_TRUE(delegate.autocheckout_bubble_shown()); |
3177 } | 3177 } |
3178 | 3178 |
3179 // Test that Autocheckout bubble is not offered when server doesn't have data | 3179 // Test that Autocheckout bubble is not offered when server doesn't have data |
3180 // for the form. | 3180 // for the form. |
3181 TEST_F(AutofillManagerTest, TestAutocheckoutBubbleNotShown) { | 3181 TEST_F(AutofillManagerTest, TestAutocheckoutBubbleNotShown) { |
3182 MockAutofillManagerDelegate delegate; | 3182 MockAutofillManagerDelegate delegate; |
3183 autofill_manager_.reset(new TestAutofillManager( | 3183 autofill_manager_.reset(new TestAutofillManager( |
3184 autofill_driver_.get(), &delegate, &personal_data_)); | 3184 autofill_driver_.get(), &delegate, &personal_data_)); |
3185 autofill_manager_->set_autofill_enabled(true); | 3185 autofill_manager_->set_autofill_enabled(true); |
3186 autofill_manager_->MarkAsFirstPageInAutocheckoutFlow(); | 3186 autofill_manager_->MarkAsFirstPageInAutocheckoutFlow(); |
3187 | 3187 |
3188 FormData form; | 3188 FormData form; |
3189 test::CreateTestAddressFormData(&form); | 3189 test::CreateTestAddressFormData(&form); |
3190 | 3190 |
3191 TestFormStructure* form_structure = new TestFormStructure(form); | 3191 TestFormStructure* form_structure = new TestFormStructure(form); |
3192 AutofillMetrics metrics_logger; // ignored | 3192 AutofillMetrics metrics_logger; // ignored |
3193 form_structure->DetermineHeuristicTypes(metrics_logger); | 3193 form_structure->DetermineHeuristicTypes(metrics_logger); |
3194 | 3194 |
3195 // Build form structure without server data. | 3195 // Build form structure without server data. |
3196 std::vector<AutofillFieldType> heuristic_types, server_types; | 3196 std::vector<ServerFieldType> heuristic_types, server_types; |
3197 for (size_t i = 0; i < form.fields.size(); ++i) { | 3197 for (size_t i = 0; i < form.fields.size(); ++i) { |
3198 heuristic_types.push_back(form_structure->field(i)->type()); | 3198 heuristic_types.push_back(form_structure->field(i)->Type().server_type()); |
3199 server_types.push_back(NO_SERVER_DATA); | 3199 server_types.push_back(NO_SERVER_DATA); |
3200 } | 3200 } |
3201 form_structure->SetFieldTypes(heuristic_types, server_types); | 3201 form_structure->SetFieldTypes(heuristic_types, server_types); |
3202 autofill_manager_->AddSeenForm(form_structure); | 3202 autofill_manager_->AddSeenForm(form_structure); |
3203 | 3203 |
3204 autofill_manager_->OnMaybeShowAutocheckoutBubble(form, gfx::RectF()); | 3204 autofill_manager_->OnMaybeShowAutocheckoutBubble(form, gfx::RectF()); |
3205 | 3205 |
3206 EXPECT_FALSE(delegate.autocheckout_bubble_shown()); | 3206 EXPECT_FALSE(delegate.autocheckout_bubble_shown()); |
3207 } | 3207 } |
3208 | 3208 |
(...skipping 21 matching lines...) Expand all Loading... |
3230 FormData address; | 3230 FormData address; |
3231 test::CreateTestAddressFormData(&address); | 3231 test::CreateTestAddressFormData(&address); |
3232 | 3232 |
3233 autofill_manager_->set_autocheckout_url_prefix("test-prefix"); | 3233 autofill_manager_->set_autocheckout_url_prefix("test-prefix"); |
3234 // Push address only | 3234 // Push address only |
3235 std::vector<FormData> forms; | 3235 std::vector<FormData> forms; |
3236 forms.push_back(address); | 3236 forms.push_back(address); |
3237 | 3237 |
3238 // Build and add form structure with server data. | 3238 // Build and add form structure with server data. |
3239 scoped_ptr<TestFormStructure> form_structure(new TestFormStructure(address)); | 3239 scoped_ptr<TestFormStructure> form_structure(new TestFormStructure(address)); |
3240 std::vector<AutofillFieldType> heuristic_types, server_types; | 3240 std::vector<ServerFieldType> heuristic_types, server_types; |
3241 for (size_t i = 0; i < address.fields.size(); ++i) { | 3241 for (size_t i = 0; i < address.fields.size(); ++i) { |
3242 heuristic_types.push_back(UNKNOWN_TYPE); | 3242 heuristic_types.push_back(UNKNOWN_TYPE); |
3243 server_types.push_back(form_structure->field(i)->type()); | 3243 server_types.push_back(form_structure->field(i)->Type().server_type()); |
3244 } | 3244 } |
3245 form_structure->SetFieldTypes(heuristic_types, server_types); | 3245 form_structure->SetFieldTypes(heuristic_types, server_types); |
3246 autofill_manager_->AddSeenForm(form_structure.release()); | 3246 autofill_manager_->AddSeenForm(form_structure.release()); |
3247 | 3247 |
3248 // Make sure normal form is handled correctly. | 3248 // Make sure normal form is handled correctly. |
3249 autofill_manager_->MarkAsFirstPageInAutocheckoutFlowIgnoringAjax(); | 3249 autofill_manager_->MarkAsFirstPageInAutocheckoutFlowIgnoringAjax(); |
3250 std::vector<FormStructure*> form_structures; | 3250 std::vector<FormStructure*> form_structures; |
3251 form_structures = autofill_manager_->GetFormStructures(); | 3251 form_structures = autofill_manager_->GetFormStructures(); |
3252 ASSERT_EQ(1U, form_structures.size()); | 3252 ASSERT_EQ(1U, form_structures.size()); |
3253 EXPECT_EQ("/form.html", form_structures[0]->source_url().path()); | 3253 EXPECT_EQ("/form.html", form_structures[0]->source_url().path()); |
3254 | 3254 |
3255 scoped_ptr<FormStructure> filled_form(new TestFormStructure(address)); | 3255 scoped_ptr<FormStructure> filled_form(new TestFormStructure(address)); |
3256 delegate.SetUserSuppliedData(filled_form.Pass()); | 3256 delegate.SetUserSuppliedData(filled_form.Pass()); |
3257 autofill_manager_->OnMaybeShowAutocheckoutBubble(address, gfx::RectF()); | 3257 autofill_manager_->OnMaybeShowAutocheckoutBubble(address, gfx::RectF()); |
3258 | 3258 |
3259 // Push other forms | 3259 // Push other forms |
3260 forms.push_back(shipping_options); | 3260 forms.push_back(shipping_options); |
3261 forms.push_back(user_supplied); | 3261 forms.push_back(user_supplied); |
3262 | 3262 |
3263 // FormStructure should contain the same forms as before. | 3263 // FormStructure should contain the same forms as before. |
3264 DynamicFormsSeen(forms); | 3264 DynamicFormsSeen(forms); |
3265 form_structures = autofill_manager_->GetFormStructures(); | 3265 form_structures = autofill_manager_->GetFormStructures(); |
3266 ASSERT_EQ(1U, form_structures.size()); | 3266 ASSERT_EQ(1U, form_structures.size()); |
3267 EXPECT_EQ("/form.html", form_structures[0]->source_url().path()); | 3267 EXPECT_EQ("/form.html", form_structures[0]->source_url().path()); |
3268 } | 3268 } |
3269 | 3269 |
3270 } // namespace autofill | 3270 } // namespace autofill |
OLD | NEW |