| 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 "components/autofill/core/browser/form_structure.h" | 5 #include "components/autofill/core/browser/form_structure.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> |
| 10 |
| 9 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 10 #include "base/memory/scoped_ptr.h" | |
| 11 #include "base/metrics/field_trial.h" | 12 #include "base/metrics/field_trial.h" |
| 12 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 15 #include "components/autofill/core/browser/autofill_test_utils.h" | 16 #include "components/autofill/core/browser/autofill_test_utils.h" |
| 16 #include "components/autofill/core/common/autofill_switches.h" | 17 #include "components/autofill/core/common/autofill_switches.h" |
| 17 #include "components/autofill/core/common/form_data.h" | 18 #include "components/autofill/core/common/form_data.h" |
| 18 #include "components/autofill/core/common/form_field_data.h" | 19 #include "components/autofill/core/common/form_field_data.h" |
| 19 #include "components/variations/entropy_provider.h" | 20 #include "components/variations/entropy_provider.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 private: | 66 private: |
| 66 void EnableAutofillMetadataFieldTrial() { | 67 void EnableAutofillMetadataFieldTrial() { |
| 67 field_trial_list_.reset(); | 68 field_trial_list_.reset(); |
| 68 field_trial_list_.reset( | 69 field_trial_list_.reset( |
| 69 new base::FieldTrialList(new metrics::SHA1EntropyProvider("foo"))); | 70 new base::FieldTrialList(new metrics::SHA1EntropyProvider("foo"))); |
| 70 field_trial_ = base::FieldTrialList::CreateFieldTrial( | 71 field_trial_ = base::FieldTrialList::CreateFieldTrial( |
| 71 "AutofillFieldMetadata", "Enabled"); | 72 "AutofillFieldMetadata", "Enabled"); |
| 72 field_trial_->group(); | 73 field_trial_->group(); |
| 73 } | 74 } |
| 74 | 75 |
| 75 scoped_ptr<base::FieldTrialList> field_trial_list_; | 76 std::unique_ptr<base::FieldTrialList> field_trial_list_; |
| 76 scoped_refptr<base::FieldTrial> field_trial_; | 77 scoped_refptr<base::FieldTrial> field_trial_; |
| 77 }; | 78 }; |
| 78 | 79 |
| 79 TEST_F(FormStructureTest, FieldCount) { | 80 TEST_F(FormStructureTest, FieldCount) { |
| 80 scoped_ptr<FormStructure> form_structure; | 81 std::unique_ptr<FormStructure> form_structure; |
| 81 FormData form; | 82 FormData form; |
| 82 | 83 |
| 83 FormFieldData field; | 84 FormFieldData field; |
| 84 field.label = ASCIIToUTF16("username"); | 85 field.label = ASCIIToUTF16("username"); |
| 85 field.name = ASCIIToUTF16("username"); | 86 field.name = ASCIIToUTF16("username"); |
| 86 field.form_control_type = "text"; | 87 field.form_control_type = "text"; |
| 87 form.fields.push_back(field); | 88 form.fields.push_back(field); |
| 88 | 89 |
| 89 field.label = ASCIIToUTF16("password"); | 90 field.label = ASCIIToUTF16("password"); |
| 90 field.name = ASCIIToUTF16("password"); | 91 field.name = ASCIIToUTF16("password"); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 102 field.should_autocomplete = false; | 103 field.should_autocomplete = false; |
| 103 form.fields.push_back(field); | 104 form.fields.push_back(field); |
| 104 | 105 |
| 105 // The render process sends all fields to browser including fields with | 106 // The render process sends all fields to browser including fields with |
| 106 // autocomplete=off | 107 // autocomplete=off |
| 107 form_structure.reset(new FormStructure(form)); | 108 form_structure.reset(new FormStructure(form)); |
| 108 EXPECT_EQ(4U, form_structure->field_count()); | 109 EXPECT_EQ(4U, form_structure->field_count()); |
| 109 } | 110 } |
| 110 | 111 |
| 111 TEST_F(FormStructureTest, AutofillCount) { | 112 TEST_F(FormStructureTest, AutofillCount) { |
| 112 scoped_ptr<FormStructure> form_structure; | 113 std::unique_ptr<FormStructure> form_structure; |
| 113 FormData form; | 114 FormData form; |
| 114 | 115 |
| 115 FormFieldData field; | 116 FormFieldData field; |
| 116 field.label = ASCIIToUTF16("username"); | 117 field.label = ASCIIToUTF16("username"); |
| 117 field.name = ASCIIToUTF16("username"); | 118 field.name = ASCIIToUTF16("username"); |
| 118 field.form_control_type = "text"; | 119 field.form_control_type = "text"; |
| 119 form.fields.push_back(field); | 120 form.fields.push_back(field); |
| 120 | 121 |
| 121 field.label = ASCIIToUTF16("password"); | 122 field.label = ASCIIToUTF16("password"); |
| 122 field.name = ASCIIToUTF16("password"); | 123 field.name = ASCIIToUTF16("password"); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 | 164 |
| 164 TEST_F(FormStructureTest, SourceURL) { | 165 TEST_F(FormStructureTest, SourceURL) { |
| 165 FormData form; | 166 FormData form; |
| 166 form.origin = GURL("http://www.foo.com/"); | 167 form.origin = GURL("http://www.foo.com/"); |
| 167 FormStructure form_structure(form); | 168 FormStructure form_structure(form); |
| 168 | 169 |
| 169 EXPECT_EQ(form.origin, form_structure.source_url()); | 170 EXPECT_EQ(form.origin, form_structure.source_url()); |
| 170 } | 171 } |
| 171 | 172 |
| 172 TEST_F(FormStructureTest, IsAutofillable) { | 173 TEST_F(FormStructureTest, IsAutofillable) { |
| 173 scoped_ptr<FormStructure> form_structure; | 174 std::unique_ptr<FormStructure> form_structure; |
| 174 FormData form; | 175 FormData form; |
| 175 | 176 |
| 176 // We need at least three text fields to be auto-fillable. | 177 // We need at least three text fields to be auto-fillable. |
| 177 FormFieldData field; | 178 FormFieldData field; |
| 178 | 179 |
| 179 field.label = ASCIIToUTF16("username"); | 180 field.label = ASCIIToUTF16("username"); |
| 180 field.name = ASCIIToUTF16("username"); | 181 field.name = ASCIIToUTF16("username"); |
| 181 field.form_control_type = "text"; | 182 field.form_control_type = "text"; |
| 182 form.fields.push_back(field); | 183 form.fields.push_back(field); |
| 183 | 184 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 EXPECT_FALSE(form_structure->IsAutofillable()); | 228 EXPECT_FALSE(form_structure->IsAutofillable()); |
| 228 | 229 |
| 229 // But search can be in the URL. | 230 // But search can be in the URL. |
| 230 form.action = GURL("http://search.com/?q=hello"); | 231 form.action = GURL("http://search.com/?q=hello"); |
| 231 form_structure.reset(new FormStructure(form)); | 232 form_structure.reset(new FormStructure(form)); |
| 232 form_structure->DetermineHeuristicTypes(); | 233 form_structure->DetermineHeuristicTypes(); |
| 233 EXPECT_TRUE(form_structure->IsAutofillable()); | 234 EXPECT_TRUE(form_structure->IsAutofillable()); |
| 234 } | 235 } |
| 235 | 236 |
| 236 TEST_F(FormStructureTest, ShouldBeParsed) { | 237 TEST_F(FormStructureTest, ShouldBeParsed) { |
| 237 scoped_ptr<FormStructure> form_structure; | 238 std::unique_ptr<FormStructure> form_structure; |
| 238 FormData form; | 239 FormData form; |
| 239 | 240 |
| 240 // We need at least three text fields to be parseable. | 241 // We need at least three text fields to be parseable. |
| 241 FormFieldData field; | 242 FormFieldData field; |
| 242 field.label = ASCIIToUTF16("username"); | 243 field.label = ASCIIToUTF16("username"); |
| 243 field.name = ASCIIToUTF16("username"); | 244 field.name = ASCIIToUTF16("username"); |
| 244 field.form_control_type = "text"; | 245 field.form_control_type = "text"; |
| 245 form.fields.push_back(field); | 246 form.fields.push_back(field); |
| 246 | 247 |
| 247 FormFieldData checkable_field; | 248 FormFieldData checkable_field; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 field.name = ASCIIToUTF16("new_pw"); | 329 field.name = ASCIIToUTF16("new_pw"); |
| 329 field.form_control_type = "password"; | 330 field.form_control_type = "password"; |
| 330 form.fields.push_back(field); | 331 form.fields.push_back(field); |
| 331 form_structure.reset(new FormStructure(form)); | 332 form_structure.reset(new FormStructure(form)); |
| 332 EXPECT_TRUE(form_structure->ShouldBeParsed()); | 333 EXPECT_TRUE(form_structure->ShouldBeParsed()); |
| 333 } | 334 } |
| 334 | 335 |
| 335 // Tests that ShouldBeParsed returns true for a form containing less than three | 336 // Tests that ShouldBeParsed returns true for a form containing less than three |
| 336 // fields if at least one has an autocomplete attribute. | 337 // fields if at least one has an autocomplete attribute. |
| 337 TEST_F(FormStructureTest, ShouldBeParsed_TwoFields_HasAutocomplete) { | 338 TEST_F(FormStructureTest, ShouldBeParsed_TwoFields_HasAutocomplete) { |
| 338 scoped_ptr<FormStructure> form_structure; | 339 std::unique_ptr<FormStructure> form_structure; |
| 339 FormData form; | 340 FormData form; |
| 340 FormFieldData field; | 341 FormFieldData field; |
| 341 | 342 |
| 342 field.label = ASCIIToUTF16("Name"); | 343 field.label = ASCIIToUTF16("Name"); |
| 343 field.name = ASCIIToUTF16("name"); | 344 field.name = ASCIIToUTF16("name"); |
| 344 field.form_control_type = "name"; | 345 field.form_control_type = "name"; |
| 345 field.autocomplete_attribute = "name"; | 346 field.autocomplete_attribute = "name"; |
| 346 form.fields.push_back(field); | 347 form.fields.push_back(field); |
| 347 | 348 |
| 348 field.label = ASCIIToUTF16("Address"); | 349 field.label = ASCIIToUTF16("Address"); |
| 349 field.name = ASCIIToUTF16("Address"); | 350 field.name = ASCIIToUTF16("Address"); |
| 350 field.form_control_type = "select-one"; | 351 field.form_control_type = "select-one"; |
| 351 field.autocomplete_attribute = ""; | 352 field.autocomplete_attribute = ""; |
| 352 form.fields.push_back(field); | 353 form.fields.push_back(field); |
| 353 | 354 |
| 354 form_structure.reset(new FormStructure(form)); | 355 form_structure.reset(new FormStructure(form)); |
| 355 form_structure->ParseFieldTypesFromAutocompleteAttributes(); | 356 form_structure->ParseFieldTypesFromAutocompleteAttributes(); |
| 356 EXPECT_TRUE(form_structure->ShouldBeParsed()); | 357 EXPECT_TRUE(form_structure->ShouldBeParsed()); |
| 357 } | 358 } |
| 358 | 359 |
| 359 TEST_F(FormStructureTest, HeuristicsContactInfo) { | 360 TEST_F(FormStructureTest, HeuristicsContactInfo) { |
| 360 scoped_ptr<FormStructure> form_structure; | 361 std::unique_ptr<FormStructure> form_structure; |
| 361 FormData form; | 362 FormData form; |
| 362 | 363 |
| 363 FormFieldData field; | 364 FormFieldData field; |
| 364 field.form_control_type = "text"; | 365 field.form_control_type = "text"; |
| 365 | 366 |
| 366 field.label = ASCIIToUTF16("First Name"); | 367 field.label = ASCIIToUTF16("First Name"); |
| 367 field.name = ASCIIToUTF16("firstname"); | 368 field.name = ASCIIToUTF16("firstname"); |
| 368 form.fields.push_back(field); | 369 form.fields.push_back(field); |
| 369 | 370 |
| 370 field.label = ASCIIToUTF16("Last Name"); | 371 field.label = ASCIIToUTF16("Last Name"); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 // City. | 425 // City. |
| 425 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(6)->heuristic_type()); | 426 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(6)->heuristic_type()); |
| 426 // Zip. | 427 // Zip. |
| 427 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(7)->heuristic_type()); | 428 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(7)->heuristic_type()); |
| 428 // Submit. | 429 // Submit. |
| 429 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(8)->heuristic_type()); | 430 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(8)->heuristic_type()); |
| 430 } | 431 } |
| 431 | 432 |
| 432 // Verify that we can correctly process the |autocomplete| attribute. | 433 // Verify that we can correctly process the |autocomplete| attribute. |
| 433 TEST_F(FormStructureTest, HeuristicsAutocompleteAttribute) { | 434 TEST_F(FormStructureTest, HeuristicsAutocompleteAttribute) { |
| 434 scoped_ptr<FormStructure> form_structure; | 435 std::unique_ptr<FormStructure> form_structure; |
| 435 FormData form; | 436 FormData form; |
| 436 | 437 |
| 437 FormFieldData field; | 438 FormFieldData field; |
| 438 field.form_control_type = "text"; | 439 field.form_control_type = "text"; |
| 439 | 440 |
| 440 field.label = base::string16(); | 441 field.label = base::string16(); |
| 441 field.name = ASCIIToUTF16("field1"); | 442 field.name = ASCIIToUTF16("field1"); |
| 442 field.autocomplete_attribute = "given-name"; | 443 field.autocomplete_attribute = "given-name"; |
| 443 form.fields.push_back(field); | 444 form.fields.push_back(field); |
| 444 | 445 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 463 EXPECT_EQ(HTML_TYPE_GIVEN_NAME, form_structure->field(0)->html_type()); | 464 EXPECT_EQ(HTML_TYPE_GIVEN_NAME, form_structure->field(0)->html_type()); |
| 464 EXPECT_EQ(HTML_TYPE_FAMILY_NAME, form_structure->field(1)->html_type()); | 465 EXPECT_EQ(HTML_TYPE_FAMILY_NAME, form_structure->field(1)->html_type()); |
| 465 EXPECT_EQ(HTML_TYPE_EMAIL, form_structure->field(2)->html_type()); | 466 EXPECT_EQ(HTML_TYPE_EMAIL, form_structure->field(2)->html_type()); |
| 466 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type()); | 467 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type()); |
| 467 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); | 468 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); |
| 468 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); | 469 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); |
| 469 } | 470 } |
| 470 | 471 |
| 471 // Verify that the heuristics are not run for non checkout formless forms. | 472 // Verify that the heuristics are not run for non checkout formless forms. |
| 472 TEST_F(FormStructureTest, Heuristics_FormlessNonCheckoutForm) { | 473 TEST_F(FormStructureTest, Heuristics_FormlessNonCheckoutForm) { |
| 473 scoped_ptr<FormStructure> form_structure; | 474 std::unique_ptr<FormStructure> form_structure; |
| 474 FormData form; | 475 FormData form; |
| 475 | 476 |
| 476 FormFieldData field; | 477 FormFieldData field; |
| 477 field.form_control_type = "text"; | 478 field.form_control_type = "text"; |
| 478 | 479 |
| 479 field.label = ASCIIToUTF16("First Name:"); | 480 field.label = ASCIIToUTF16("First Name:"); |
| 480 field.name = ASCIIToUTF16("firstname"); | 481 field.name = ASCIIToUTF16("firstname"); |
| 481 field.autocomplete_attribute = "given-name"; | 482 field.autocomplete_attribute = "given-name"; |
| 482 form.fields.push_back(field); | 483 form.fields.push_back(field); |
| 483 | 484 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 | 542 |
| 542 field.label = ASCIIToUTF16("Phone"); | 543 field.label = ASCIIToUTF16("Phone"); |
| 543 field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$phone"); | 544 field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$phone"); |
| 544 form.fields.push_back(field); | 545 form.fields.push_back(field); |
| 545 | 546 |
| 546 field.label = base::string16(); | 547 field.label = base::string16(); |
| 547 field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$submit"); | 548 field.name = ASCIIToUTF16("ctl01$ctl00$ShippingAddressCreditPhone$submit"); |
| 548 field.form_control_type = "submit"; | 549 field.form_control_type = "submit"; |
| 549 form.fields.push_back(field); | 550 form.fields.push_back(field); |
| 550 | 551 |
| 551 scoped_ptr<FormStructure> form_structure(new FormStructure(form)); | 552 std::unique_ptr<FormStructure> form_structure(new FormStructure(form)); |
| 552 form_structure->DetermineHeuristicTypes(); | 553 form_structure->DetermineHeuristicTypes(); |
| 553 EXPECT_TRUE(form_structure->IsAutofillable()); | 554 EXPECT_TRUE(form_structure->IsAutofillable()); |
| 554 | 555 |
| 555 // Expect the correct number of fields. | 556 // Expect the correct number of fields. |
| 556 ASSERT_EQ(5U, form_structure->field_count()); | 557 ASSERT_EQ(5U, form_structure->field_count()); |
| 557 ASSERT_EQ(4U, form_structure->autofill_count()); | 558 ASSERT_EQ(4U, form_structure->autofill_count()); |
| 558 | 559 |
| 559 // First name. | 560 // First name. |
| 560 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 561 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
| 561 // Last name. | 562 // Last name. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 581 form.fields.push_back(field); | 582 form.fields.push_back(field); |
| 582 | 583 |
| 583 field.label = ASCIIToUTF16("Address 2"); | 584 field.label = ASCIIToUTF16("Address 2"); |
| 584 field.name = ASCIIToUTF16("address2"); | 585 field.name = ASCIIToUTF16("address2"); |
| 585 form.fields.push_back(field); | 586 form.fields.push_back(field); |
| 586 | 587 |
| 587 field.label = ASCIIToUTF16("Address 3"); | 588 field.label = ASCIIToUTF16("Address 3"); |
| 588 field.name = ASCIIToUTF16("address3"); | 589 field.name = ASCIIToUTF16("address3"); |
| 589 form.fields.push_back(field); | 590 form.fields.push_back(field); |
| 590 | 591 |
| 591 scoped_ptr<FormStructure> form_structure(new FormStructure(form)); | 592 std::unique_ptr<FormStructure> form_structure(new FormStructure(form)); |
| 592 form_structure->DetermineHeuristicTypes(); | 593 form_structure->DetermineHeuristicTypes(); |
| 593 EXPECT_TRUE(form_structure->IsAutofillable()); | 594 EXPECT_TRUE(form_structure->IsAutofillable()); |
| 594 | 595 |
| 595 // Expect the correct number of fields. | 596 // Expect the correct number of fields. |
| 596 ASSERT_EQ(3U, form_structure->field_count()); | 597 ASSERT_EQ(3U, form_structure->field_count()); |
| 597 ASSERT_EQ(3U, form_structure->autofill_count()); | 598 ASSERT_EQ(3U, form_structure->autofill_count()); |
| 598 | 599 |
| 599 // Address 1. | 600 // Address 1. |
| 600 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); | 601 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); |
| 601 // Address 2. | 602 // Address 2. |
| 602 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); | 603 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); |
| 603 // Address 3 | 604 // Address 3 |
| 604 EXPECT_EQ(ADDRESS_HOME_LINE3, form_structure->field(2)->heuristic_type()); | 605 EXPECT_EQ(ADDRESS_HOME_LINE3, form_structure->field(2)->heuristic_type()); |
| 605 } | 606 } |
| 606 | 607 |
| 607 // Verify that we can correctly process the 'autocomplete' attribute for phone | 608 // Verify that we can correctly process the 'autocomplete' attribute for phone |
| 608 // number types (especially phone prefixes and suffixes). | 609 // number types (especially phone prefixes and suffixes). |
| 609 TEST_F(FormStructureTest, HeuristicsAutocompleteAttributePhoneTypes) { | 610 TEST_F(FormStructureTest, HeuristicsAutocompleteAttributePhoneTypes) { |
| 610 scoped_ptr<FormStructure> form_structure; | 611 std::unique_ptr<FormStructure> form_structure; |
| 611 FormData form; | 612 FormData form; |
| 612 | 613 |
| 613 FormFieldData field; | 614 FormFieldData field; |
| 614 field.form_control_type = "text"; | 615 field.form_control_type = "text"; |
| 615 | 616 |
| 616 field.label = base::string16(); | 617 field.label = base::string16(); |
| 617 field.name = ASCIIToUTF16("field1"); | 618 field.name = ASCIIToUTF16("field1"); |
| 618 field.autocomplete_attribute = "tel-local"; | 619 field.autocomplete_attribute = "tel-local"; |
| 619 form.fields.push_back(field); | 620 form.fields.push_back(field); |
| 620 | 621 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 643 form_structure->field(1)->phone_part()); | 644 form_structure->field(1)->phone_part()); |
| 644 EXPECT_EQ(HTML_TYPE_TEL_LOCAL_SUFFIX, form_structure->field(2)->html_type()); | 645 EXPECT_EQ(HTML_TYPE_TEL_LOCAL_SUFFIX, form_structure->field(2)->html_type()); |
| 645 EXPECT_EQ(AutofillField::PHONE_SUFFIX, | 646 EXPECT_EQ(AutofillField::PHONE_SUFFIX, |
| 646 form_structure->field(2)->phone_part()); | 647 form_structure->field(2)->phone_part()); |
| 647 } | 648 } |
| 648 | 649 |
| 649 // The heuristics and server predictions should run if there are more than two | 650 // The heuristics and server predictions should run if there are more than two |
| 650 // fillable fields. | 651 // fillable fields. |
| 651 TEST_F(FormStructureTest, | 652 TEST_F(FormStructureTest, |
| 652 HeuristicsAndServerPredictions_BigForm_NoAutocompleteAttribute) { | 653 HeuristicsAndServerPredictions_BigForm_NoAutocompleteAttribute) { |
| 653 scoped_ptr<FormStructure> form_structure; | 654 std::unique_ptr<FormStructure> form_structure; |
| 654 FormData form; | 655 FormData form; |
| 655 | 656 |
| 656 FormFieldData field; | 657 FormFieldData field; |
| 657 field.form_control_type = "text"; | 658 field.form_control_type = "text"; |
| 658 | 659 |
| 659 field.label = ASCIIToUTF16("First Name"); | 660 field.label = ASCIIToUTF16("First Name"); |
| 660 field.name = ASCIIToUTF16("firstname"); | 661 field.name = ASCIIToUTF16("firstname"); |
| 661 form.fields.push_back(field); | 662 form.fields.push_back(field); |
| 662 | 663 |
| 663 field.label = ASCIIToUTF16("Last Name"); | 664 field.label = ASCIIToUTF16("Last Name"); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 678 | 679 |
| 679 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 680 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
| 680 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); | 681 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); |
| 681 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); | 682 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); |
| 682 } | 683 } |
| 683 | 684 |
| 684 // The heuristics and server predictions should run even if a valid autocomplete | 685 // The heuristics and server predictions should run even if a valid autocomplete |
| 685 // attribute is present in the form (if it has more that two fillable fields). | 686 // attribute is present in the form (if it has more that two fillable fields). |
| 686 TEST_F(FormStructureTest, | 687 TEST_F(FormStructureTest, |
| 687 HeuristicsAndServerPredictions_ValidAutocompleteAttribute) { | 688 HeuristicsAndServerPredictions_ValidAutocompleteAttribute) { |
| 688 scoped_ptr<FormStructure> form_structure; | 689 std::unique_ptr<FormStructure> form_structure; |
| 689 FormData form; | 690 FormData form; |
| 690 | 691 |
| 691 FormFieldData field; | 692 FormFieldData field; |
| 692 field.form_control_type = "text"; | 693 field.form_control_type = "text"; |
| 693 | 694 |
| 694 // Set a valid autocomplete attribute to the first field. | 695 // Set a valid autocomplete attribute to the first field. |
| 695 field.label = ASCIIToUTF16("First Name"); | 696 field.label = ASCIIToUTF16("First Name"); |
| 696 field.name = ASCIIToUTF16("firstname"); | 697 field.name = ASCIIToUTF16("firstname"); |
| 697 field.autocomplete_attribute = "given-name"; | 698 field.autocomplete_attribute = "given-name"; |
| 698 form.fields.push_back(field); | 699 form.fields.push_back(field); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 717 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 718 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
| 718 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); | 719 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); |
| 719 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); | 720 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); |
| 720 } | 721 } |
| 721 | 722 |
| 722 // The heuristics and server predictions should run even if an unrecognized | 723 // The heuristics and server predictions should run even if an unrecognized |
| 723 // autocomplete attribute is present in the form (if it has more than two | 724 // autocomplete attribute is present in the form (if it has more than two |
| 724 // fillable fields). | 725 // fillable fields). |
| 725 TEST_F(FormStructureTest, | 726 TEST_F(FormStructureTest, |
| 726 HeuristicsAndServerPredictions_UnrecognizedAutocompleteAttribute) { | 727 HeuristicsAndServerPredictions_UnrecognizedAutocompleteAttribute) { |
| 727 scoped_ptr<FormStructure> form_structure; | 728 std::unique_ptr<FormStructure> form_structure; |
| 728 FormData form; | 729 FormData form; |
| 729 | 730 |
| 730 FormFieldData field; | 731 FormFieldData field; |
| 731 field.form_control_type = "text"; | 732 field.form_control_type = "text"; |
| 732 | 733 |
| 733 // Set an unrecognized autocomplete attribute to the first field. | 734 // Set an unrecognized autocomplete attribute to the first field. |
| 734 field.label = ASCIIToUTF16("First Name"); | 735 field.label = ASCIIToUTF16("First Name"); |
| 735 field.name = ASCIIToUTF16("firstname"); | 736 field.name = ASCIIToUTF16("firstname"); |
| 736 field.autocomplete_attribute = "unrecognized"; | 737 field.autocomplete_attribute = "unrecognized"; |
| 737 form.fields.push_back(field); | 738 form.fields.push_back(field); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 760 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 761 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
| 761 EXPECT_EQ(NAME_MIDDLE, form_structure->field(1)->heuristic_type()); | 762 EXPECT_EQ(NAME_MIDDLE, form_structure->field(1)->heuristic_type()); |
| 762 EXPECT_EQ(NAME_LAST, form_structure->field(2)->heuristic_type()); | 763 EXPECT_EQ(NAME_LAST, form_structure->field(2)->heuristic_type()); |
| 763 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(3)->heuristic_type()); | 764 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(3)->heuristic_type()); |
| 764 } | 765 } |
| 765 | 766 |
| 766 // Tests the heuristics and server predictions are not run for forms with less | 767 // Tests the heuristics and server predictions are not run for forms with less |
| 767 // than 3 fields. | 768 // than 3 fields. |
| 768 TEST_F(FormStructureTest, | 769 TEST_F(FormStructureTest, |
| 769 HeuristicsAndServerPredictions_SmallForm_NoAutocompleteAttribute) { | 770 HeuristicsAndServerPredictions_SmallForm_NoAutocompleteAttribute) { |
| 770 scoped_ptr<FormStructure> form_structure; | 771 std::unique_ptr<FormStructure> form_structure; |
| 771 FormData form; | 772 FormData form; |
| 772 | 773 |
| 773 FormFieldData field; | 774 FormFieldData field; |
| 774 field.form_control_type = "text"; | 775 field.form_control_type = "text"; |
| 775 | 776 |
| 776 field.label = ASCIIToUTF16("First Name"); | 777 field.label = ASCIIToUTF16("First Name"); |
| 777 field.name = ASCIIToUTF16("firstname"); | 778 field.name = ASCIIToUTF16("firstname"); |
| 778 form.fields.push_back(field); | 779 form.fields.push_back(field); |
| 779 | 780 |
| 780 field.label = ASCIIToUTF16("Last Name"); | 781 field.label = ASCIIToUTF16("Last Name"); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 792 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type()); | 793 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type()); |
| 793 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); | 794 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); |
| 794 EXPECT_EQ(NO_SERVER_DATA, form_structure->field(0)->server_type()); | 795 EXPECT_EQ(NO_SERVER_DATA, form_structure->field(0)->server_type()); |
| 795 EXPECT_EQ(NO_SERVER_DATA, form_structure->field(1)->server_type()); | 796 EXPECT_EQ(NO_SERVER_DATA, form_structure->field(1)->server_type()); |
| 796 } | 797 } |
| 797 | 798 |
| 798 // Tests the heuristics and server predictions are not run for forms with less | 799 // Tests the heuristics and server predictions are not run for forms with less |
| 799 // than 3 fields, even if an autocomplete attribute is specified. | 800 // than 3 fields, even if an autocomplete attribute is specified. |
| 800 TEST_F(FormStructureTest, | 801 TEST_F(FormStructureTest, |
| 801 HeuristicsAndServerPredictions_SmallForm_ValidAutocompleteAttribute) { | 802 HeuristicsAndServerPredictions_SmallForm_ValidAutocompleteAttribute) { |
| 802 scoped_ptr<FormStructure> form_structure; | 803 std::unique_ptr<FormStructure> form_structure; |
| 803 FormData form; | 804 FormData form; |
| 804 | 805 |
| 805 FormFieldData field; | 806 FormFieldData field; |
| 806 field.form_control_type = "text"; | 807 field.form_control_type = "text"; |
| 807 | 808 |
| 808 // Set a valid autocompelete attribute to the first field. | 809 // Set a valid autocompelete attribute to the first field. |
| 809 field.label = ASCIIToUTF16("First Name"); | 810 field.label = ASCIIToUTF16("First Name"); |
| 810 field.name = ASCIIToUTF16("firstname"); | 811 field.name = ASCIIToUTF16("firstname"); |
| 811 field.autocomplete_attribute = "given-name"; | 812 field.autocomplete_attribute = "given-name"; |
| 812 form.fields.push_back(field); | 813 form.fields.push_back(field); |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1031 // Normally, the two separate address fields would cause us to detect two | 1032 // Normally, the two separate address fields would cause us to detect two |
| 1032 // separate sections; but because there is an author-specified section in this | 1033 // separate sections; but because there is an author-specified section in this |
| 1033 // form, we do not apply these usual heuristics. | 1034 // form, we do not apply these usual heuristics. |
| 1034 EXPECT_EQ(ASCIIToUTF16("one"), form_structure.field(0)->name); | 1035 EXPECT_EQ(ASCIIToUTF16("one"), form_structure.field(0)->name); |
| 1035 EXPECT_EQ(ASCIIToUTF16("two"), form_structure.field(3)->name); | 1036 EXPECT_EQ(ASCIIToUTF16("two"), form_structure.field(3)->name); |
| 1036 EXPECT_EQ(form_structure.field(0)->section(), | 1037 EXPECT_EQ(form_structure.field(0)->section(), |
| 1037 form_structure.field(3)->section()); | 1038 form_structure.field(3)->section()); |
| 1038 } | 1039 } |
| 1039 | 1040 |
| 1040 TEST_F(FormStructureTest, HeuristicsSample8) { | 1041 TEST_F(FormStructureTest, HeuristicsSample8) { |
| 1041 scoped_ptr<FormStructure> form_structure; | 1042 std::unique_ptr<FormStructure> form_structure; |
| 1042 FormData form; | 1043 FormData form; |
| 1043 | 1044 |
| 1044 FormFieldData field; | 1045 FormFieldData field; |
| 1045 field.form_control_type = "text"; | 1046 field.form_control_type = "text"; |
| 1046 | 1047 |
| 1047 field.label = ASCIIToUTF16("Your First Name:"); | 1048 field.label = ASCIIToUTF16("Your First Name:"); |
| 1048 field.name = ASCIIToUTF16("bill.first"); | 1049 field.name = ASCIIToUTF16("bill.first"); |
| 1049 form.fields.push_back(field); | 1050 form.fields.push_back(field); |
| 1050 | 1051 |
| 1051 field.label = ASCIIToUTF16("Your Last Name:"); | 1052 field.label = ASCIIToUTF16("Your Last Name:"); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1108 // Country. | 1109 // Country. |
| 1109 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type()); | 1110 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type()); |
| 1110 // Phone. | 1111 // Phone. |
| 1111 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, | 1112 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, |
| 1112 form_structure->field(8)->heuristic_type()); | 1113 form_structure->field(8)->heuristic_type()); |
| 1113 // Submit. | 1114 // Submit. |
| 1114 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(9)->heuristic_type()); | 1115 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(9)->heuristic_type()); |
| 1115 } | 1116 } |
| 1116 | 1117 |
| 1117 TEST_F(FormStructureTest, HeuristicsSample6) { | 1118 TEST_F(FormStructureTest, HeuristicsSample6) { |
| 1118 scoped_ptr<FormStructure> form_structure; | 1119 std::unique_ptr<FormStructure> form_structure; |
| 1119 FormData form; | 1120 FormData form; |
| 1120 | 1121 |
| 1121 FormFieldData field; | 1122 FormFieldData field; |
| 1122 field.form_control_type = "text"; | 1123 field.form_control_type = "text"; |
| 1123 | 1124 |
| 1124 field.label = ASCIIToUTF16("E-mail address"); | 1125 field.label = ASCIIToUTF16("E-mail address"); |
| 1125 field.name = ASCIIToUTF16("email"); | 1126 field.name = ASCIIToUTF16("email"); |
| 1126 form.fields.push_back(field); | 1127 form.fields.push_back(field); |
| 1127 | 1128 |
| 1128 field.label = ASCIIToUTF16("Full name"); | 1129 field.label = ASCIIToUTF16("Full name"); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 // Zip. | 1171 // Zip. |
| 1171 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(5)->heuristic_type()); | 1172 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(5)->heuristic_type()); |
| 1172 // Submit. | 1173 // Submit. |
| 1173 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type()); | 1174 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type()); |
| 1174 } | 1175 } |
| 1175 | 1176 |
| 1176 // Tests a sequence of FormFields where only labels are supplied to heuristics | 1177 // Tests a sequence of FormFields where only labels are supplied to heuristics |
| 1177 // for matching. This works because FormFieldData labels are matched in the | 1178 // for matching. This works because FormFieldData labels are matched in the |
| 1178 // case that input element ids (or |name| fields) are missing. | 1179 // case that input element ids (or |name| fields) are missing. |
| 1179 TEST_F(FormStructureTest, HeuristicsLabelsOnly) { | 1180 TEST_F(FormStructureTest, HeuristicsLabelsOnly) { |
| 1180 scoped_ptr<FormStructure> form_structure; | 1181 std::unique_ptr<FormStructure> form_structure; |
| 1181 FormData form; | 1182 FormData form; |
| 1182 | 1183 |
| 1183 FormFieldData field; | 1184 FormFieldData field; |
| 1184 field.form_control_type = "text"; | 1185 field.form_control_type = "text"; |
| 1185 | 1186 |
| 1186 field.label = ASCIIToUTF16("First Name"); | 1187 field.label = ASCIIToUTF16("First Name"); |
| 1187 field.name = base::string16(); | 1188 field.name = base::string16(); |
| 1188 form.fields.push_back(field); | 1189 form.fields.push_back(field); |
| 1189 | 1190 |
| 1190 field.label = ASCIIToUTF16("Last Name"); | 1191 field.label = ASCIIToUTF16("Last Name"); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1235 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type()); | 1236 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type()); |
| 1236 // Address Line 2. | 1237 // Address Line 2. |
| 1237 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(5)->heuristic_type()); | 1238 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(5)->heuristic_type()); |
| 1238 // Zip. | 1239 // Zip. |
| 1239 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type()); | 1240 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type()); |
| 1240 // Submit. | 1241 // Submit. |
| 1241 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type()); | 1242 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type()); |
| 1242 } | 1243 } |
| 1243 | 1244 |
| 1244 TEST_F(FormStructureTest, HeuristicsCreditCardInfo) { | 1245 TEST_F(FormStructureTest, HeuristicsCreditCardInfo) { |
| 1245 scoped_ptr<FormStructure> form_structure; | 1246 std::unique_ptr<FormStructure> form_structure; |
| 1246 FormData form; | 1247 FormData form; |
| 1247 | 1248 |
| 1248 FormFieldData field; | 1249 FormFieldData field; |
| 1249 field.form_control_type = "text"; | 1250 field.form_control_type = "text"; |
| 1250 | 1251 |
| 1251 field.label = ASCIIToUTF16("Name on Card"); | 1252 field.label = ASCIIToUTF16("Name on Card"); |
| 1252 field.name = ASCIIToUTF16("name_on_card"); | 1253 field.name = ASCIIToUTF16("name_on_card"); |
| 1253 form.fields.push_back(field); | 1254 form.fields.push_back(field); |
| 1254 | 1255 |
| 1255 field.label = ASCIIToUTF16("Card Number"); | 1256 field.label = ASCIIToUTF16("Card Number"); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1289 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 1290 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
| 1290 form_structure->field(3)->heuristic_type()); | 1291 form_structure->field(3)->heuristic_type()); |
| 1291 // CVV. | 1292 // CVV. |
| 1292 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, | 1293 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, |
| 1293 form_structure->field(4)->heuristic_type()); | 1294 form_structure->field(4)->heuristic_type()); |
| 1294 // Submit. | 1295 // Submit. |
| 1295 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(5)->heuristic_type()); | 1296 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(5)->heuristic_type()); |
| 1296 } | 1297 } |
| 1297 | 1298 |
| 1298 TEST_F(FormStructureTest, HeuristicsCreditCardInfoWithUnknownCardField) { | 1299 TEST_F(FormStructureTest, HeuristicsCreditCardInfoWithUnknownCardField) { |
| 1299 scoped_ptr<FormStructure> form_structure; | 1300 std::unique_ptr<FormStructure> form_structure; |
| 1300 FormData form; | 1301 FormData form; |
| 1301 | 1302 |
| 1302 FormFieldData field; | 1303 FormFieldData field; |
| 1303 field.form_control_type = "text"; | 1304 field.form_control_type = "text"; |
| 1304 | 1305 |
| 1305 field.label = ASCIIToUTF16("Name on Card"); | 1306 field.label = ASCIIToUTF16("Name on Card"); |
| 1306 field.name = ASCIIToUTF16("name_on_card"); | 1307 field.name = ASCIIToUTF16("name_on_card"); |
| 1307 form.fields.push_back(field); | 1308 form.fields.push_back(field); |
| 1308 | 1309 |
| 1309 // This is not a field we know how to process. But we should skip over it | 1310 // This is not a field we know how to process. But we should skip over it |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1351 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 1352 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
| 1352 form_structure->field(4)->heuristic_type()); | 1353 form_structure->field(4)->heuristic_type()); |
| 1353 // CVV. | 1354 // CVV. |
| 1354 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, | 1355 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, |
| 1355 form_structure->field(5)->heuristic_type()); | 1356 form_structure->field(5)->heuristic_type()); |
| 1356 // Submit. | 1357 // Submit. |
| 1357 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type()); | 1358 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type()); |
| 1358 } | 1359 } |
| 1359 | 1360 |
| 1360 TEST_F(FormStructureTest, ThreeAddressLines) { | 1361 TEST_F(FormStructureTest, ThreeAddressLines) { |
| 1361 scoped_ptr<FormStructure> form_structure; | 1362 std::unique_ptr<FormStructure> form_structure; |
| 1362 FormData form; | 1363 FormData form; |
| 1363 | 1364 |
| 1364 FormFieldData field; | 1365 FormFieldData field; |
| 1365 field.form_control_type = "text"; | 1366 field.form_control_type = "text"; |
| 1366 | 1367 |
| 1367 field.label = ASCIIToUTF16("Address Line1"); | 1368 field.label = ASCIIToUTF16("Address Line1"); |
| 1368 field.name = ASCIIToUTF16("Address"); | 1369 field.name = ASCIIToUTF16("Address"); |
| 1369 form.fields.push_back(field); | 1370 form.fields.push_back(field); |
| 1370 | 1371 |
| 1371 field.label = ASCIIToUTF16("Address Line2"); | 1372 field.label = ASCIIToUTF16("Address Line2"); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1391 // Address Line 2. | 1392 // Address Line 2. |
| 1392 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); | 1393 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); |
| 1393 // Address Line 3. | 1394 // Address Line 3. |
| 1394 EXPECT_EQ(ADDRESS_HOME_LINE3, form_structure->field(2)->heuristic_type()); | 1395 EXPECT_EQ(ADDRESS_HOME_LINE3, form_structure->field(2)->heuristic_type()); |
| 1395 // City. | 1396 // City. |
| 1396 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type()); | 1397 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type()); |
| 1397 } | 1398 } |
| 1398 | 1399 |
| 1399 // Numbered address lines after line two are ignored. | 1400 // Numbered address lines after line two are ignored. |
| 1400 TEST_F(FormStructureTest, SurplusAddressLinesIgnored) { | 1401 TEST_F(FormStructureTest, SurplusAddressLinesIgnored) { |
| 1401 scoped_ptr<FormStructure> form_structure; | 1402 std::unique_ptr<FormStructure> form_structure; |
| 1402 FormData form; | 1403 FormData form; |
| 1403 | 1404 |
| 1404 FormFieldData field; | 1405 FormFieldData field; |
| 1405 field.form_control_type = "text"; | 1406 field.form_control_type = "text"; |
| 1406 | 1407 |
| 1407 field.label = ASCIIToUTF16("Address Line1"); | 1408 field.label = ASCIIToUTF16("Address Line1"); |
| 1408 field.name = ASCIIToUTF16("shipping.address.addressLine1"); | 1409 field.name = ASCIIToUTF16("shipping.address.addressLine1"); |
| 1409 form.fields.push_back(field); | 1410 form.fields.push_back(field); |
| 1410 | 1411 |
| 1411 field.label = ASCIIToUTF16("Address Line2"); | 1412 field.label = ASCIIToUTF16("Address Line2"); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1434 // Address Line 4 (ignored). | 1435 // Address Line 4 (ignored). |
| 1435 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type()); | 1436 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type()); |
| 1436 } | 1437 } |
| 1437 | 1438 |
| 1438 // This example comes from expedia.com where they used to use a "Suite" label | 1439 // This example comes from expedia.com where they used to use a "Suite" label |
| 1439 // to indicate a suite or apartment number (the form has changed since this | 1440 // to indicate a suite or apartment number (the form has changed since this |
| 1440 // test was written). We interpret this as address line 2. And the following | 1441 // test was written). We interpret this as address line 2. And the following |
| 1441 // "Street address second line" we interpret as address line 3. | 1442 // "Street address second line" we interpret as address line 3. |
| 1442 // See http://crbug.com/48197 for details. | 1443 // See http://crbug.com/48197 for details. |
| 1443 TEST_F(FormStructureTest, ThreeAddressLinesExpedia) { | 1444 TEST_F(FormStructureTest, ThreeAddressLinesExpedia) { |
| 1444 scoped_ptr<FormStructure> form_structure; | 1445 std::unique_ptr<FormStructure> form_structure; |
| 1445 FormData form; | 1446 FormData form; |
| 1446 | 1447 |
| 1447 FormFieldData field; | 1448 FormFieldData field; |
| 1448 field.form_control_type = "text"; | 1449 field.form_control_type = "text"; |
| 1449 | 1450 |
| 1450 field.label = ASCIIToUTF16("Street:"); | 1451 field.label = ASCIIToUTF16("Street:"); |
| 1451 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads1"); | 1452 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads1"); |
| 1452 form.fields.push_back(field); | 1453 form.fields.push_back(field); |
| 1453 | 1454 |
| 1454 field.label = ASCIIToUTF16("Suite or Apt:"); | 1455 field.label = ASCIIToUTF16("Suite or Apt:"); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1476 // Address Line 3. | 1477 // Address Line 3. |
| 1477 EXPECT_EQ(ADDRESS_HOME_LINE3, form_structure->field(2)->heuristic_type()); | 1478 EXPECT_EQ(ADDRESS_HOME_LINE3, form_structure->field(2)->heuristic_type()); |
| 1478 // City. | 1479 // City. |
| 1479 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type()); | 1480 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type()); |
| 1480 } | 1481 } |
| 1481 | 1482 |
| 1482 // This example comes from ebay.com where the word "suite" appears in the label | 1483 // This example comes from ebay.com where the word "suite" appears in the label |
| 1483 // and the name "address2" clearly indicates that this is the address line 2. | 1484 // and the name "address2" clearly indicates that this is the address line 2. |
| 1484 // See http://crbug.com/48197 for details. | 1485 // See http://crbug.com/48197 for details. |
| 1485 TEST_F(FormStructureTest, TwoAddressLinesEbay) { | 1486 TEST_F(FormStructureTest, TwoAddressLinesEbay) { |
| 1486 scoped_ptr<FormStructure> form_structure; | 1487 std::unique_ptr<FormStructure> form_structure; |
| 1487 FormData form; | 1488 FormData form; |
| 1488 | 1489 |
| 1489 FormFieldData field; | 1490 FormFieldData field; |
| 1490 field.form_control_type = "text"; | 1491 field.form_control_type = "text"; |
| 1491 | 1492 |
| 1492 field.label = ASCIIToUTF16("Address Line1"); | 1493 field.label = ASCIIToUTF16("Address Line1"); |
| 1493 field.name = ASCIIToUTF16("address1"); | 1494 field.name = ASCIIToUTF16("address1"); |
| 1494 form.fields.push_back(field); | 1495 form.fields.push_back(field); |
| 1495 | 1496 |
| 1496 field.label = ASCIIToUTF16("Floor number, suite number, etc"); | 1497 field.label = ASCIIToUTF16("Floor number, suite number, etc"); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1509 | 1510 |
| 1510 // Address Line 1. | 1511 // Address Line 1. |
| 1511 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); | 1512 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); |
| 1512 // Address Line 2. | 1513 // Address Line 2. |
| 1513 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); | 1514 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); |
| 1514 // City. | 1515 // City. |
| 1515 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(2)->heuristic_type()); | 1516 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(2)->heuristic_type()); |
| 1516 } | 1517 } |
| 1517 | 1518 |
| 1518 TEST_F(FormStructureTest, HeuristicsStateWithProvince) { | 1519 TEST_F(FormStructureTest, HeuristicsStateWithProvince) { |
| 1519 scoped_ptr<FormStructure> form_structure; | 1520 std::unique_ptr<FormStructure> form_structure; |
| 1520 FormData form; | 1521 FormData form; |
| 1521 | 1522 |
| 1522 FormFieldData field; | 1523 FormFieldData field; |
| 1523 field.form_control_type = "text"; | 1524 field.form_control_type = "text"; |
| 1524 | 1525 |
| 1525 field.label = ASCIIToUTF16("Address Line1"); | 1526 field.label = ASCIIToUTF16("Address Line1"); |
| 1526 field.name = ASCIIToUTF16("Address"); | 1527 field.name = ASCIIToUTF16("Address"); |
| 1527 form.fields.push_back(field); | 1528 form.fields.push_back(field); |
| 1528 | 1529 |
| 1529 field.label = ASCIIToUTF16("Address Line2"); | 1530 field.label = ASCIIToUTF16("Address Line2"); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1543 // Address Line 1. | 1544 // Address Line 1. |
| 1544 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); | 1545 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); |
| 1545 // Address Line 2. | 1546 // Address Line 2. |
| 1546 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); | 1547 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); |
| 1547 // State. | 1548 // State. |
| 1548 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(2)->heuristic_type()); | 1549 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(2)->heuristic_type()); |
| 1549 } | 1550 } |
| 1550 | 1551 |
| 1551 // This example comes from lego.com's checkout page. | 1552 // This example comes from lego.com's checkout page. |
| 1552 TEST_F(FormStructureTest, HeuristicsWithBilling) { | 1553 TEST_F(FormStructureTest, HeuristicsWithBilling) { |
| 1553 scoped_ptr<FormStructure> form_structure; | 1554 std::unique_ptr<FormStructure> form_structure; |
| 1554 FormData form; | 1555 FormData form; |
| 1555 | 1556 |
| 1556 FormFieldData field; | 1557 FormFieldData field; |
| 1557 field.form_control_type = "text"; | 1558 field.form_control_type = "text"; |
| 1558 | 1559 |
| 1559 field.label = ASCIIToUTF16("First Name*:"); | 1560 field.label = ASCIIToUTF16("First Name*:"); |
| 1560 field.name = ASCIIToUTF16("editBillingAddress$firstNameBox"); | 1561 field.name = ASCIIToUTF16("editBillingAddress$firstNameBox"); |
| 1561 form.fields.push_back(field); | 1562 form.fields.push_back(field); |
| 1562 | 1563 |
| 1563 field.label = ASCIIToUTF16("Last Name*:"); | 1564 field.label = ASCIIToUTF16("Last Name*:"); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1614 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type()); | 1615 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type()); |
| 1615 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(6)->heuristic_type()); | 1616 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(6)->heuristic_type()); |
| 1616 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type()); | 1617 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type()); |
| 1617 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(8)->heuristic_type()); | 1618 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(8)->heuristic_type()); |
| 1618 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, | 1619 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, |
| 1619 form_structure->field(9)->heuristic_type()); | 1620 form_structure->field(9)->heuristic_type()); |
| 1620 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(10)->heuristic_type()); | 1621 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(10)->heuristic_type()); |
| 1621 } | 1622 } |
| 1622 | 1623 |
| 1623 TEST_F(FormStructureTest, ThreePartPhoneNumber) { | 1624 TEST_F(FormStructureTest, ThreePartPhoneNumber) { |
| 1624 scoped_ptr<FormStructure> form_structure; | 1625 std::unique_ptr<FormStructure> form_structure; |
| 1625 FormData form; | 1626 FormData form; |
| 1626 | 1627 |
| 1627 FormFieldData field; | 1628 FormFieldData field; |
| 1628 field.form_control_type = "text"; | 1629 field.form_control_type = "text"; |
| 1629 | 1630 |
| 1630 field.label = ASCIIToUTF16("Phone:"); | 1631 field.label = ASCIIToUTF16("Phone:"); |
| 1631 field.name = ASCIIToUTF16("dayphone1"); | 1632 field.name = ASCIIToUTF16("dayphone1"); |
| 1632 field.max_length = 0; | 1633 field.max_length = 0; |
| 1633 form.fields.push_back(field); | 1634 form.fields.push_back(field); |
| 1634 | 1635 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1661 EXPECT_EQ(PHONE_HOME_NUMBER, | 1662 EXPECT_EQ(PHONE_HOME_NUMBER, |
| 1662 form_structure->field(1)->heuristic_type()); | 1663 form_structure->field(1)->heuristic_type()); |
| 1663 // Phone number suffix. | 1664 // Phone number suffix. |
| 1664 EXPECT_EQ(PHONE_HOME_NUMBER, | 1665 EXPECT_EQ(PHONE_HOME_NUMBER, |
| 1665 form_structure->field(2)->heuristic_type()); | 1666 form_structure->field(2)->heuristic_type()); |
| 1666 // Phone extension. | 1667 // Phone extension. |
| 1667 EXPECT_EQ(PHONE_HOME_EXTENSION, form_structure->field(3)->heuristic_type()); | 1668 EXPECT_EQ(PHONE_HOME_EXTENSION, form_structure->field(3)->heuristic_type()); |
| 1668 } | 1669 } |
| 1669 | 1670 |
| 1670 TEST_F(FormStructureTest, HeuristicsInfernoCC) { | 1671 TEST_F(FormStructureTest, HeuristicsInfernoCC) { |
| 1671 scoped_ptr<FormStructure> form_structure; | 1672 std::unique_ptr<FormStructure> form_structure; |
| 1672 FormData form; | 1673 FormData form; |
| 1673 | 1674 |
| 1674 FormFieldData field; | 1675 FormFieldData field; |
| 1675 field.form_control_type = "text"; | 1676 field.form_control_type = "text"; |
| 1676 | 1677 |
| 1677 field.label = ASCIIToUTF16("Name on Card"); | 1678 field.label = ASCIIToUTF16("Name on Card"); |
| 1678 field.name = ASCIIToUTF16("name_on_card"); | 1679 field.name = ASCIIToUTF16("name_on_card"); |
| 1679 form.fields.push_back(field); | 1680 form.fields.push_back(field); |
| 1680 | 1681 |
| 1681 field.label = ASCIIToUTF16("Address"); | 1682 field.label = ASCIIToUTF16("Address"); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1711 // Expiration Date. | 1712 // Expiration Date. |
| 1712 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); | 1713 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); |
| 1713 // Expiration Year. | 1714 // Expiration Year. |
| 1714 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 1715 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
| 1715 form_structure->field(4)->heuristic_type()); | 1716 form_structure->field(4)->heuristic_type()); |
| 1716 } | 1717 } |
| 1717 | 1718 |
| 1718 // Tests that the heuristics detect split credit card names if they appear in | 1719 // Tests that the heuristics detect split credit card names if they appear in |
| 1719 // the middle of the form. | 1720 // the middle of the form. |
| 1720 TEST_F(FormStructureTest, HeuristicsInferCCNames_NamesNotFirst) { | 1721 TEST_F(FormStructureTest, HeuristicsInferCCNames_NamesNotFirst) { |
| 1721 scoped_ptr<FormStructure> form_structure; | 1722 std::unique_ptr<FormStructure> form_structure; |
| 1722 FormData form; | 1723 FormData form; |
| 1723 | 1724 |
| 1724 FormFieldData field; | 1725 FormFieldData field; |
| 1725 field.form_control_type = "text"; | 1726 field.form_control_type = "text"; |
| 1726 | 1727 |
| 1727 field.label = ASCIIToUTF16("Card number"); | 1728 field.label = ASCIIToUTF16("Card number"); |
| 1728 field.name = ASCIIToUTF16("ccnumber"); | 1729 field.name = ASCIIToUTF16("ccnumber"); |
| 1729 form.fields.push_back(field); | 1730 form.fields.push_back(field); |
| 1730 | 1731 |
| 1731 field.label = ASCIIToUTF16("First name"); | 1732 field.label = ASCIIToUTF16("First name"); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1769 form_structure->field(4)->heuristic_type()); | 1770 form_structure->field(4)->heuristic_type()); |
| 1770 // CVC code. | 1771 // CVC code. |
| 1771 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, | 1772 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, |
| 1772 form_structure->field(5)->heuristic_type()); | 1773 form_structure->field(5)->heuristic_type()); |
| 1773 } | 1774 } |
| 1774 | 1775 |
| 1775 // Tests that the heuristics detect split credit card names if they appear at | 1776 // Tests that the heuristics detect split credit card names if they appear at |
| 1776 // the beginning of the form. The first name has to contains some credit card | 1777 // the beginning of the form. The first name has to contains some credit card |
| 1777 // keyword. | 1778 // keyword. |
| 1778 TEST_F(FormStructureTest, HeuristicsInferCCNames_NamesFirst) { | 1779 TEST_F(FormStructureTest, HeuristicsInferCCNames_NamesFirst) { |
| 1779 scoped_ptr<FormStructure> form_structure; | 1780 std::unique_ptr<FormStructure> form_structure; |
| 1780 FormData form; | 1781 FormData form; |
| 1781 | 1782 |
| 1782 FormFieldData field; | 1783 FormFieldData field; |
| 1783 field.form_control_type = "text"; | 1784 field.form_control_type = "text"; |
| 1784 | 1785 |
| 1785 field.label = ASCIIToUTF16("Cardholder Name"); | 1786 field.label = ASCIIToUTF16("Cardholder Name"); |
| 1786 field.name = ASCIIToUTF16("cc_first_name"); | 1787 field.name = ASCIIToUTF16("cc_first_name"); |
| 1787 form.fields.push_back(field); | 1788 form.fields.push_back(field); |
| 1788 | 1789 |
| 1789 field.label = ASCIIToUTF16("Last name"); | 1790 field.label = ASCIIToUTF16("Last name"); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1975 | 1976 |
| 1976 // Check that we fail if there are only bad form(s). | 1977 // Check that we fail if there are only bad form(s). |
| 1977 ScopedVector<FormStructure> bad_forms; | 1978 ScopedVector<FormStructure> bad_forms; |
| 1978 bad_forms.push_back(new FormStructure(malformed_form)); | 1979 bad_forms.push_back(new FormStructure(malformed_form)); |
| 1979 AutofillQueryContents encoded_query5; | 1980 AutofillQueryContents encoded_query5; |
| 1980 EXPECT_FALSE(FormStructure::EncodeQueryRequest( | 1981 EXPECT_FALSE(FormStructure::EncodeQueryRequest( |
| 1981 bad_forms.get(), &encoded_signatures, &encoded_query5)); | 1982 bad_forms.get(), &encoded_signatures, &encoded_query5)); |
| 1982 } | 1983 } |
| 1983 | 1984 |
| 1984 TEST_F(FormStructureTest, EncodeUploadRequest) { | 1985 TEST_F(FormStructureTest, EncodeUploadRequest) { |
| 1985 scoped_ptr<FormStructure> form_structure; | 1986 std::unique_ptr<FormStructure> form_structure; |
| 1986 std::vector<ServerFieldTypeSet> possible_field_types; | 1987 std::vector<ServerFieldTypeSet> possible_field_types; |
| 1987 FormData form; | 1988 FormData form; |
| 1988 form_structure.reset(new FormStructure(form)); | 1989 form_structure.reset(new FormStructure(form)); |
| 1989 form_structure->DetermineHeuristicTypes(); | 1990 form_structure->DetermineHeuristicTypes(); |
| 1990 | 1991 |
| 1991 FormFieldData field; | 1992 FormFieldData field; |
| 1992 field.form_control_type = "text"; | 1993 field.form_control_type = "text"; |
| 1993 | 1994 |
| 1994 field.label = ASCIIToUTF16("First Name"); | 1995 field.label = ASCIIToUTF16("First Name"); |
| 1995 field.name = ASCIIToUTF16("firstname"); | 1996 field.name = ASCIIToUTF16("firstname"); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2151 for (size_t i = 0; i < form_structure->field_count(); ++i) | 2152 for (size_t i = 0; i < form_structure->field_count(); ++i) |
| 2152 form_structure->field(i)->set_possible_types(possible_field_types[i]); | 2153 form_structure->field(i)->set_possible_types(possible_field_types[i]); |
| 2153 | 2154 |
| 2154 AutofillUploadContents encoded_upload4; | 2155 AutofillUploadContents encoded_upload4; |
| 2155 EXPECT_FALSE(form_structure->EncodeUploadRequest( | 2156 EXPECT_FALSE(form_structure->EncodeUploadRequest( |
| 2156 available_field_types, false, std::string(), true, &encoded_upload4)); | 2157 available_field_types, false, std::string(), true, &encoded_upload4)); |
| 2157 } | 2158 } |
| 2158 | 2159 |
| 2159 TEST_F(FormStructureTest, | 2160 TEST_F(FormStructureTest, |
| 2160 EncodeUploadRequestWithAdditionalPasswordFormSignature) { | 2161 EncodeUploadRequestWithAdditionalPasswordFormSignature) { |
| 2161 scoped_ptr<FormStructure> form_structure; | 2162 std::unique_ptr<FormStructure> form_structure; |
| 2162 std::vector<ServerFieldTypeSet> possible_field_types; | 2163 std::vector<ServerFieldTypeSet> possible_field_types; |
| 2163 FormData form; | 2164 FormData form; |
| 2164 form_structure.reset(new FormStructure(form)); | 2165 form_structure.reset(new FormStructure(form)); |
| 2165 form_structure->DetermineHeuristicTypes(); | 2166 form_structure->DetermineHeuristicTypes(); |
| 2166 | 2167 |
| 2167 FormFieldData field; | 2168 FormFieldData field; |
| 2168 field.label = ASCIIToUTF16("First Name"); | 2169 field.label = ASCIIToUTF16("First Name"); |
| 2169 field.name = ASCIIToUTF16("firstname"); | 2170 field.name = ASCIIToUTF16("firstname"); |
| 2170 field.autocomplete_attribute = "given-name"; | 2171 field.autocomplete_attribute = "given-name"; |
| 2171 form.fields.push_back(field); | 2172 form.fields.push_back(field); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2250 AutofillUploadContents encoded_upload; | 2251 AutofillUploadContents encoded_upload; |
| 2251 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, true, | 2252 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, true, |
| 2252 "42", true, &encoded_upload)); | 2253 "42", true, &encoded_upload)); |
| 2253 | 2254 |
| 2254 std::string encoded_upload_string; | 2255 std::string encoded_upload_string; |
| 2255 encoded_upload.SerializeToString(&encoded_upload_string); | 2256 encoded_upload.SerializeToString(&encoded_upload_string); |
| 2256 EXPECT_EQ(expected_upload_string, encoded_upload_string); | 2257 EXPECT_EQ(expected_upload_string, encoded_upload_string); |
| 2257 } | 2258 } |
| 2258 | 2259 |
| 2259 TEST_F(FormStructureTest, EncodeUploadRequest_WithAutocomplete) { | 2260 TEST_F(FormStructureTest, EncodeUploadRequest_WithAutocomplete) { |
| 2260 scoped_ptr<FormStructure> form_structure; | 2261 std::unique_ptr<FormStructure> form_structure; |
| 2261 std::vector<ServerFieldTypeSet> possible_field_types; | 2262 std::vector<ServerFieldTypeSet> possible_field_types; |
| 2262 FormData form; | 2263 FormData form; |
| 2263 form_structure.reset(new FormStructure(form)); | 2264 form_structure.reset(new FormStructure(form)); |
| 2264 form_structure->DetermineHeuristicTypes(); | 2265 form_structure->DetermineHeuristicTypes(); |
| 2265 | 2266 |
| 2266 FormFieldData field; | 2267 FormFieldData field; |
| 2267 field.form_control_type = "text"; | 2268 field.form_control_type = "text"; |
| 2268 | 2269 |
| 2269 field.label = ASCIIToUTF16("First Name"); | 2270 field.label = ASCIIToUTF16("First Name"); |
| 2270 field.name = ASCIIToUTF16("firstname"); | 2271 field.name = ASCIIToUTF16("firstname"); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2321 AutofillUploadContents encoded_upload; | 2322 AutofillUploadContents encoded_upload; |
| 2322 EXPECT_TRUE(form_structure->EncodeUploadRequest( | 2323 EXPECT_TRUE(form_structure->EncodeUploadRequest( |
| 2323 available_field_types, true, std::string(), true, &encoded_upload)); | 2324 available_field_types, true, std::string(), true, &encoded_upload)); |
| 2324 | 2325 |
| 2325 std::string encoded_upload_string; | 2326 std::string encoded_upload_string; |
| 2326 encoded_upload.SerializeToString(&encoded_upload_string); | 2327 encoded_upload.SerializeToString(&encoded_upload_string); |
| 2327 EXPECT_EQ(expected_upload_string, encoded_upload_string); | 2328 EXPECT_EQ(expected_upload_string, encoded_upload_string); |
| 2328 } | 2329 } |
| 2329 | 2330 |
| 2330 TEST_F(FormStructureTest, EncodeUploadRequest_ObservedSubmissionFalse) { | 2331 TEST_F(FormStructureTest, EncodeUploadRequest_ObservedSubmissionFalse) { |
| 2331 scoped_ptr<FormStructure> form_structure; | 2332 std::unique_ptr<FormStructure> form_structure; |
| 2332 std::vector<ServerFieldTypeSet> possible_field_types; | 2333 std::vector<ServerFieldTypeSet> possible_field_types; |
| 2333 FormData form; | 2334 FormData form; |
| 2334 form_structure.reset(new FormStructure(form)); | 2335 form_structure.reset(new FormStructure(form)); |
| 2335 form_structure->DetermineHeuristicTypes(); | 2336 form_structure->DetermineHeuristicTypes(); |
| 2336 | 2337 |
| 2337 FormFieldData field; | 2338 FormFieldData field; |
| 2338 field.form_control_type = "text"; | 2339 field.form_control_type = "text"; |
| 2339 | 2340 |
| 2340 field.label = ASCIIToUTF16("First Name"); | 2341 field.label = ASCIIToUTF16("First Name"); |
| 2341 field.name = ASCIIToUTF16("firstname"); | 2342 field.name = ASCIIToUTF16("firstname"); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2390 EXPECT_TRUE(form_structure->EncodeUploadRequest( | 2391 EXPECT_TRUE(form_structure->EncodeUploadRequest( |
| 2391 available_field_types, true, std::string(), | 2392 available_field_types, true, std::string(), |
| 2392 /* observed_submission= */ false, &encoded_upload)); | 2393 /* observed_submission= */ false, &encoded_upload)); |
| 2393 | 2394 |
| 2394 std::string encoded_upload_string; | 2395 std::string encoded_upload_string; |
| 2395 encoded_upload.SerializeToString(&encoded_upload_string); | 2396 encoded_upload.SerializeToString(&encoded_upload_string); |
| 2396 EXPECT_EQ(expected_upload_string, encoded_upload_string); | 2397 EXPECT_EQ(expected_upload_string, encoded_upload_string); |
| 2397 } | 2398 } |
| 2398 | 2399 |
| 2399 TEST_F(FormStructureTest, EncodeUploadRequest_WithLabels) { | 2400 TEST_F(FormStructureTest, EncodeUploadRequest_WithLabels) { |
| 2400 scoped_ptr<FormStructure> form_structure; | 2401 std::unique_ptr<FormStructure> form_structure; |
| 2401 std::vector<ServerFieldTypeSet> possible_field_types; | 2402 std::vector<ServerFieldTypeSet> possible_field_types; |
| 2402 FormData form; | 2403 FormData form; |
| 2403 form_structure.reset(new FormStructure(form)); | 2404 form_structure.reset(new FormStructure(form)); |
| 2404 form_structure->DetermineHeuristicTypes(); | 2405 form_structure->DetermineHeuristicTypes(); |
| 2405 | 2406 |
| 2406 FormFieldData field; | 2407 FormFieldData field; |
| 2407 field.form_control_type = "text"; | 2408 field.form_control_type = "text"; |
| 2408 | 2409 |
| 2409 // No label for the first field. | 2410 // No label for the first field. |
| 2410 form.fields.push_back(field); | 2411 form.fields.push_back(field); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2455 EXPECT_TRUE(form_structure->EncodeUploadRequest( | 2456 EXPECT_TRUE(form_structure->EncodeUploadRequest( |
| 2456 available_field_types, true, std::string(), true, &encoded_upload)); | 2457 available_field_types, true, std::string(), true, &encoded_upload)); |
| 2457 | 2458 |
| 2458 std::string encoded_upload_string; | 2459 std::string encoded_upload_string; |
| 2459 encoded_upload.SerializeToString(&encoded_upload_string); | 2460 encoded_upload.SerializeToString(&encoded_upload_string); |
| 2460 EXPECT_EQ(expected_upload_string, encoded_upload_string); | 2461 EXPECT_EQ(expected_upload_string, encoded_upload_string); |
| 2461 } | 2462 } |
| 2462 | 2463 |
| 2463 // Test that the form name is sent in the upload request. | 2464 // Test that the form name is sent in the upload request. |
| 2464 TEST_F(FormStructureTest, EncodeUploadRequest_WithFormName) { | 2465 TEST_F(FormStructureTest, EncodeUploadRequest_WithFormName) { |
| 2465 scoped_ptr<FormStructure> form_structure; | 2466 std::unique_ptr<FormStructure> form_structure; |
| 2466 std::vector<ServerFieldTypeSet> possible_field_types; | 2467 std::vector<ServerFieldTypeSet> possible_field_types; |
| 2467 FormData form; | 2468 FormData form; |
| 2468 // Setting the form name which we expect to see in the upload. | 2469 // Setting the form name which we expect to see in the upload. |
| 2469 form.name = ASCIIToUTF16("myform"); | 2470 form.name = ASCIIToUTF16("myform"); |
| 2470 form_structure.reset(new FormStructure(form)); | 2471 form_structure.reset(new FormStructure(form)); |
| 2471 form_structure->DetermineHeuristicTypes(); | 2472 form_structure->DetermineHeuristicTypes(); |
| 2472 | 2473 |
| 2473 FormFieldData field; | 2474 FormFieldData field; |
| 2474 field.form_control_type = "text"; | 2475 field.form_control_type = "text"; |
| 2475 | 2476 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2519 AutofillUploadContents encoded_upload; | 2520 AutofillUploadContents encoded_upload; |
| 2520 EXPECT_TRUE(form_structure->EncodeUploadRequest( | 2521 EXPECT_TRUE(form_structure->EncodeUploadRequest( |
| 2521 available_field_types, true, std::string(), true, &encoded_upload)); | 2522 available_field_types, true, std::string(), true, &encoded_upload)); |
| 2522 | 2523 |
| 2523 std::string encoded_upload_string; | 2524 std::string encoded_upload_string; |
| 2524 encoded_upload.SerializeToString(&encoded_upload_string); | 2525 encoded_upload.SerializeToString(&encoded_upload_string); |
| 2525 EXPECT_EQ(expected_upload_string, encoded_upload_string); | 2526 EXPECT_EQ(expected_upload_string, encoded_upload_string); |
| 2526 } | 2527 } |
| 2527 | 2528 |
| 2528 TEST_F(FormStructureTest, EncodeUploadRequestPartialMetadata) { | 2529 TEST_F(FormStructureTest, EncodeUploadRequestPartialMetadata) { |
| 2529 scoped_ptr<FormStructure> form_structure; | 2530 std::unique_ptr<FormStructure> form_structure; |
| 2530 std::vector<ServerFieldTypeSet> possible_field_types; | 2531 std::vector<ServerFieldTypeSet> possible_field_types; |
| 2531 FormData form; | 2532 FormData form; |
| 2532 form_structure.reset(new FormStructure(form)); | 2533 form_structure.reset(new FormStructure(form)); |
| 2533 form_structure->DetermineHeuristicTypes(); | 2534 form_structure->DetermineHeuristicTypes(); |
| 2534 | 2535 |
| 2535 FormFieldData field; | 2536 FormFieldData field; |
| 2536 field.form_control_type = "text"; | 2537 field.form_control_type = "text"; |
| 2537 | 2538 |
| 2538 // Some fields don't have "name" or "autocomplete" attributes, and some have | 2539 // Some fields don't have "name" or "autocomplete" attributes, and some have |
| 2539 // neither. | 2540 // neither. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2592 | 2593 |
| 2593 std::string encoded_upload_string; | 2594 std::string encoded_upload_string; |
| 2594 encoded_upload.SerializeToString(&encoded_upload_string); | 2595 encoded_upload.SerializeToString(&encoded_upload_string); |
| 2595 EXPECT_EQ(expected_upload_string, encoded_upload_string); | 2596 EXPECT_EQ(expected_upload_string, encoded_upload_string); |
| 2596 } | 2597 } |
| 2597 | 2598 |
| 2598 // Sending field metadata to the server is disabled. | 2599 // Sending field metadata to the server is disabled. |
| 2599 TEST_F(FormStructureTest, EncodeUploadRequest_DisabledMetadataTrial) { | 2600 TEST_F(FormStructureTest, EncodeUploadRequest_DisabledMetadataTrial) { |
| 2600 DisableAutofillMetadataFieldTrial(); | 2601 DisableAutofillMetadataFieldTrial(); |
| 2601 | 2602 |
| 2602 scoped_ptr<FormStructure> form_structure; | 2603 std::unique_ptr<FormStructure> form_structure; |
| 2603 std::vector<ServerFieldTypeSet> possible_field_types; | 2604 std::vector<ServerFieldTypeSet> possible_field_types; |
| 2604 FormData form; | 2605 FormData form; |
| 2605 form_structure.reset(new FormStructure(form)); | 2606 form_structure.reset(new FormStructure(form)); |
| 2606 form_structure->DetermineHeuristicTypes(); | 2607 form_structure->DetermineHeuristicTypes(); |
| 2607 | 2608 |
| 2608 FormFieldData field; | 2609 FormFieldData field; |
| 2609 field.form_control_type = "text"; | 2610 field.form_control_type = "text"; |
| 2610 | 2611 |
| 2611 field.label = ASCIIToUTF16("First Name"); | 2612 field.label = ASCIIToUTF16("First Name"); |
| 2612 field.name = ASCIIToUTF16("firstname"); | 2613 field.name = ASCIIToUTF16("firstname"); |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2925 available_field_types.insert(NAME_FIRST); | 2926 available_field_types.insert(NAME_FIRST); |
| 2926 available_field_types.insert(NAME_LAST); | 2927 available_field_types.insert(NAME_LAST); |
| 2927 available_field_types.insert(EMAIL_ADDRESS); | 2928 available_field_types.insert(EMAIL_ADDRESS); |
| 2928 available_field_types.insert(ADDRESS_HOME_LINE1); | 2929 available_field_types.insert(ADDRESS_HOME_LINE1); |
| 2929 available_field_types.insert(ADDRESS_HOME_LINE2); | 2930 available_field_types.insert(ADDRESS_HOME_LINE2); |
| 2930 available_field_types.insert(ADDRESS_HOME_CITY); | 2931 available_field_types.insert(ADDRESS_HOME_CITY); |
| 2931 available_field_types.insert(ADDRESS_HOME_STATE); | 2932 available_field_types.insert(ADDRESS_HOME_STATE); |
| 2932 available_field_types.insert(COMPANY_NAME); | 2933 available_field_types.insert(COMPANY_NAME); |
| 2933 | 2934 |
| 2934 // Check that multiple types for the field are processed correctly. | 2935 // Check that multiple types for the field are processed correctly. |
| 2935 scoped_ptr<FormStructure> form_structure; | 2936 std::unique_ptr<FormStructure> form_structure; |
| 2936 std::vector<ServerFieldTypeSet> possible_field_types; | 2937 std::vector<ServerFieldTypeSet> possible_field_types; |
| 2937 FormData form; | 2938 FormData form; |
| 2938 | 2939 |
| 2939 FormFieldData field; | 2940 FormFieldData field; |
| 2940 field.form_control_type = "text"; | 2941 field.form_control_type = "text"; |
| 2941 | 2942 |
| 2942 field.label = ASCIIToUTF16("email"); | 2943 field.label = ASCIIToUTF16("email"); |
| 2943 field.name = ASCIIToUTF16("email"); | 2944 field.name = ASCIIToUTF16("email"); |
| 2944 form.fields.push_back(field); | 2945 form.fields.push_back(field); |
| 2945 possible_field_types.push_back(ServerFieldTypeSet()); | 2946 possible_field_types.push_back(ServerFieldTypeSet()); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3051 AutofillUploadContents encoded_upload4; | 3052 AutofillUploadContents encoded_upload4; |
| 3052 EXPECT_TRUE(form_structure->EncodeUploadRequest( | 3053 EXPECT_TRUE(form_structure->EncodeUploadRequest( |
| 3053 available_field_types, false, std::string(), true, &encoded_upload4)); | 3054 available_field_types, false, std::string(), true, &encoded_upload4)); |
| 3054 | 3055 |
| 3055 encoded_upload4.SerializeToString(&encoded_upload_string); | 3056 encoded_upload4.SerializeToString(&encoded_upload_string); |
| 3056 EXPECT_EQ(expected_upload_string, encoded_upload_string); | 3057 EXPECT_EQ(expected_upload_string, encoded_upload_string); |
| 3057 } | 3058 } |
| 3058 | 3059 |
| 3059 TEST_F(FormStructureTest, CheckFormSignature) { | 3060 TEST_F(FormStructureTest, CheckFormSignature) { |
| 3060 // Check that form signature is created correctly. | 3061 // Check that form signature is created correctly. |
| 3061 scoped_ptr<FormStructure> form_structure; | 3062 std::unique_ptr<FormStructure> form_structure; |
| 3062 FormData form; | 3063 FormData form; |
| 3063 | 3064 |
| 3064 FormFieldData field; | 3065 FormFieldData field; |
| 3065 field.form_control_type = "text"; | 3066 field.form_control_type = "text"; |
| 3066 | 3067 |
| 3067 field.label = ASCIIToUTF16("email"); | 3068 field.label = ASCIIToUTF16("email"); |
| 3068 field.name = ASCIIToUTF16("email"); | 3069 field.name = ASCIIToUTF16("email"); |
| 3069 form.fields.push_back(field); | 3070 form.fields.push_back(field); |
| 3070 | 3071 |
| 3071 field.label = ASCIIToUTF16("First Name"); | 3072 field.label = ASCIIToUTF16("First Name"); |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3581 prefix = FormStructure::FindLongestCommonPrefix(strings); | 3582 prefix = FormStructure::FindLongestCommonPrefix(strings); |
| 3582 EXPECT_EQ(ASCIIToUTF16("1234567890123456"), prefix); | 3583 EXPECT_EQ(ASCIIToUTF16("1234567890123456"), prefix); |
| 3583 | 3584 |
| 3584 // Empty vector. | 3585 // Empty vector. |
| 3585 strings.clear(); | 3586 strings.clear(); |
| 3586 prefix = FormStructure::FindLongestCommonPrefix(strings); | 3587 prefix = FormStructure::FindLongestCommonPrefix(strings); |
| 3587 EXPECT_EQ(ASCIIToUTF16(""), prefix); | 3588 EXPECT_EQ(ASCIIToUTF16(""), prefix); |
| 3588 } | 3589 } |
| 3589 | 3590 |
| 3590 } // namespace autofill | 3591 } // namespace autofill |
| OLD | NEW |