1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <vector> 6 7 #include "base/memory/ref_counted.h" 8 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_vector.h" 10 #include "base/string16.h" 11 #include "base/string_number_conversions.h" 12 #include "base/stringprintf.h" 13 #include "base/tuple.h" 14 #include "base/utf_string_conversions.h" 15 #include "chrome/browser/autocomplete_history_manager.h" 16 #include "chrome/browser/autofill/autofill_common_test.h" 17 #include "chrome/browser/autofill/autofill_manager.h" 18 #include "chrome/browser/autofill/autofill_profile.h" 19 #include "chrome/browser/autofill/credit_card.h" 20 #include "chrome/browser/autofill/personal_data_manager.h" 21 #include "chrome/browser/prefs/pref_service.h" 22 #include "chrome/browser/profiles/profile.h" 23 #include "chrome/browser/ui/browser.h" 24 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 25 #include "chrome/browser/ui/tab_contents/test_tab_contents_wrapper.h" 26 #include "chrome/common/autofill_messages.h" 27 #include "chrome/common/pref_names.h" 28 #include "chrome/test/testing_profile.h" 29 #include "content/browser/tab_contents/test_tab_contents.h" 30 #include "googleurl/src/gurl.h" 31 #include "grit/generated_resources.h" 32 #include "ipc/ipc_test_sink.h" 33 #include "testing/gmock/include/gmock/gmock.h" 34 #include "testing/gtest/include/gtest/gtest.h" 35 #include "ui/base/l10n/l10n_util.h" 36 #include "webkit/glue/form_data.h" 37 #include "webkit/glue/form_field.h" 38 39 using webkit_glue::FormData; 40 using webkit_glue::FormField; 41 42 namespace { 43 44 // The page ID sent to the AutofillManager from the RenderView, used to send 45 // an IPC message back to the renderer. 46 const int kDefaultPageID = 137; 47 48 typedef Tuple5<int, 49 std::vector<string16>, 50 std::vector<string16>, 51 std::vector<string16>, 52 std::vector<int> > AutofillParam; 53 54 class TestPersonalDataManager : public PersonalDataManager { 55 public: 56 TestPersonalDataManager() { 57 CreateTestAutofillProfiles(&web_profiles_); 58 CreateTestCreditCards(&credit_cards_); 59 } 60 61 MOCK_METHOD1(SaveImportedProfile, void(const AutofillProfile&)); 62 63 AutofillProfile* GetProfileWithGUID(const char* guid) { 64 for (std::vector<AutofillProfile *>::iterator it = web_profiles_.begin(); 65 it != web_profiles_.end(); ++it) { 66 if (!(*it)->guid().compare(guid)) 67 return *it; 68 } 69 return NULL; 70 } 71 72 void AddProfile(AutofillProfile* profile) { 73 web_profiles_->push_back(profile); 74 } 75 76 void AddCreditCard(CreditCard* credit_card) { 77 credit_cards_->push_back(credit_card); 78 } 79 80 void ClearAutofillProfiles() { 81 web_profiles_.reset(); 82 } 83 84 void ClearCreditCards() { 85 credit_cards_.reset(); 86 } 87 88 void CreateTestCreditCardsYearAndMonth(const char* year, const char* month) { 89 ClearCreditCards(); 90 CreditCard* credit_card = new CreditCard; 91 autofill_test::SetCreditCardInfo(credit_card, "Miku Hatsune", 92 "4234567890654321", // Visa 93 month, year); 94 credit_card->set_guid("00000000-0000-0000-0000-000000000007"); 95 credit_cards_->push_back(credit_card); 96 } 97 98 private: 99 void CreateTestAutofillProfiles(ScopedVector<AutofillProfile>* profiles) { 100 AutofillProfile* profile = new AutofillProfile; 101 autofill_test::SetProfileInfo(profile, "Elvis", "Aaron", 102 "Presley", "theking (at) gmail.com", "RCA", 103 "3734 Elvis Presley Blvd.", "Apt. 10", 104 "Memphis", "Tennessee", "38116", "USA", 105 "12345678901", ""); 106 profile->set_guid("00000000-0000-0000-0000-000000000001"); 107 profiles->push_back(profile); 108 profile = new AutofillProfile; 109 autofill_test::SetProfileInfo(profile, "Charles", "Hardin", 110 "Holley", "buddy (at) gmail.com", "Decca", 111 "123 Apple St.", "unit 6", "Lubbock", 112 "Texas", "79401", "USA", "23456789012", 113 ""); 114 profile->set_guid("00000000-0000-0000-0000-000000000002"); 115 profiles->push_back(profile); 116 profile = new AutofillProfile; 117 autofill_test::SetProfileInfo(profile, "", "", "", "", "", "", "", 118 "", "", "", "", "", ""); 119 profile->set_guid("00000000-0000-0000-0000-000000000003"); 120 profiles->push_back(profile); 121 } 122 123 void CreateTestCreditCards(ScopedVector<CreditCard>* credit_cards) { 124 CreditCard* credit_card = new CreditCard; 125 autofill_test::SetCreditCardInfo(credit_card, "Elvis Presley", 126 "4234 5678 9012 3456", // Visa 127 "04", "2012"); 128 credit_card->set_guid("00000000-0000-0000-0000-000000000004"); 129 credit_cards->push_back(credit_card); 130 131 credit_card = new CreditCard; 132 autofill_test::SetCreditCardInfo(credit_card, "Buddy Holly", 133 "5187654321098765", // Mastercard 134 "10", "2014"); 135 credit_card->set_guid("00000000-0000-0000-0000-000000000005"); 136 credit_cards->push_back(credit_card); 137 138 credit_card = new CreditCard; 139 autofill_test::SetCreditCardInfo(credit_card, "", "", "", ""); 140 credit_card->set_guid("00000000-0000-0000-0000-000000000006"); 141 credit_cards->push_back(credit_card); 142 } 143 144 DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager); 145 }; 146 147 // Populates |form| with data corresponding to a simple address form. 148 // Note that this actually appends fields to the form data, which can be useful 149 // for building up more complex test forms. 150 void CreateTestAddressFormData(FormData* form) { 151 form->name = ASCIIToUTF16("MyForm"); 152 form->method = ASCIIToUTF16("POST"); 153 form->origin = GURL("http://myform.com/form.html"); 154 form->action = GURL("http://myform.com/submit.html"); 155 form->user_submitted = true; 156 157 FormField field; 158 autofill_test::CreateTestFormField( 159 "First Name", "firstname", "", "text", &field); 160 form->fields.push_back(field); 161 autofill_test::CreateTestFormField( 162 "Middle Name", "middlename", "", "text", &field); 163 form->fields.push_back(field); 164 autofill_test::CreateTestFormField( 165 "Last Name", "lastname", "", "text", &field); 166 form->fields.push_back(field); 167 autofill_test::CreateTestFormField( 168 "Address Line 1", "addr1", "", "text", &field); 169 form->fields.push_back(field); 170 autofill_test::CreateTestFormField( 171 "Address Line 2", "addr2", "", "text", &field); 172 form->fields.push_back(field); 173 autofill_test::CreateTestFormField( 174 "City", "city", "", "text", &field); 175 form->fields.push_back(field); 176 autofill_test::CreateTestFormField( 177 "State", "state", "", "text", &field); 178 form->fields.push_back(field); 179 autofill_test::CreateTestFormField( 180 "Postal Code", "zipcode", "", "text", &field); 181 form->fields.push_back(field); 182 autofill_test::CreateTestFormField( 183 "Country", "country", "", "text", &field); 184 form->fields.push_back(field); 185 autofill_test::CreateTestFormField( 186 "Phone Number", "phonenumber", "", "tel", &field); 187 form->fields.push_back(field); 188 autofill_test::CreateTestFormField( 189 "Fax", "fax", "", "text", &field); 190 form->fields.push_back(field); 191 autofill_test::CreateTestFormField( 192 "Email", "email", "", "email", &field); 193 form->fields.push_back(field); 194 } 195 196 // Populates |form| with data corresponding to a simple credit card form. 197 // Note that this actually appends fields to the form data, which can be useful 198 // for building up more complex test forms. 199 void CreateTestCreditCardFormData(FormData* form, 200 bool is_https, 201 bool use_month_type) { 202 form->name = ASCIIToUTF16("MyForm"); 203 form->method = ASCIIToUTF16("POST"); 204 if (is_https) { 205 form->origin = GURL("https://myform.com/form.html"); 206 form->action = GURL("https://myform.com/submit.html"); 207 } else { 208 form->origin = GURL("http://myform.com/form.html"); 209 form->action = GURL("http://myform.com/submit.html"); 210 } 211 form->user_submitted = true; 212 213 FormField field; 214 autofill_test::CreateTestFormField( 215 "Name on Card", "nameoncard", "", "text", &field); 216 form->fields.push_back(field); 217 autofill_test::CreateTestFormField( 218 "Card Number", "cardnumber", "", "text", &field); 219 form->fields.push_back(field); 220 if (use_month_type) { 221 autofill_test::CreateTestFormField( 222 "Expiration Date", "ccmonth", "", "month", &field); 223 form->fields.push_back(field); 224 } else { 225 autofill_test::CreateTestFormField( 226 "Expiration Date", "ccmonth", "", "text", &field); 227 form->fields.push_back(field); 228 autofill_test::CreateTestFormField( 229 "", "ccyear", "", "text", &field); 230 form->fields.push_back(field); 231 } 232 } 233 234 void ExpectSuggestions(int page_id, 235 const std::vector<string16>& values, 236 const std::vector<string16>& labels, 237 const std::vector<string16>& icons, 238 const std::vector<int>& unique_ids, 239 int expected_page_id, 240 size_t expected_num_suggestions, 241 const string16 expected_values[], 242 const string16 expected_labels[], 243 const string16 expected_icons[], 244 const int expected_unique_ids[]) { 245 EXPECT_EQ(expected_page_id, page_id); 246 ASSERT_EQ(expected_num_suggestions, values.size()); 247 ASSERT_EQ(expected_num_suggestions, labels.size()); 248 ASSERT_EQ(expected_num_suggestions, icons.size()); 249 ASSERT_EQ(expected_num_suggestions, unique_ids.size()); 250 for (size_t i = 0; i < expected_num_suggestions; ++i) { 251 SCOPED_TRACE(StringPrintf("i: %" PRIuS, i)); 252 EXPECT_EQ(expected_values[i], values[i]); 253 EXPECT_EQ(expected_labels[i], labels[i]); 254 EXPECT_EQ(expected_icons[i], icons[i]); 255 EXPECT_EQ(expected_unique_ids[i], unique_ids[i]); 256 } 257 } 258 259 // Verifies that the |filled_form| has been filled with the given data. 260 // Verifies address fields if |has_address_fields| is true, and verifies 261 // credit card fields if |has_credit_card_fields| is true. Verifies both if both 262 // are true. |use_month_type| is used for credit card input month type. 263 void ExpectFilledForm(int page_id, 264 const FormData& filled_form, 265 int expected_page_id, 266 const char* first, 267 const char* middle, 268 const char* last, 269 const char* address1, 270 const char* address2, 271 const char* city, 272 const char* state, 273 const char* postal_code, 274 const char* country, 275 const char* phone, 276 const char* fax, 277 const char* email, 278 const char* name_on_card, 279 const char* card_number, 280 const char* expiration_month, 281 const char* expiration_year, 282 bool has_address_fields, 283 bool has_credit_card_fields, 284 bool use_month_type) { 285 // The number of fields in the address and credit card forms created above. 286 const size_t kAddressFormSize = 12; 287 const size_t kCreditCardFormSize = use_month_type ? 3 : 4; 288 289 EXPECT_EQ(expected_page_id, page_id); 290 EXPECT_EQ(ASCIIToUTF16("MyForm"), filled_form.name); 291 EXPECT_EQ(ASCIIToUTF16("POST"), filled_form.method); 292 if (has_credit_card_fields) { 293 EXPECT_EQ(GURL("https://myform.com/form.html"), filled_form.origin); 294 EXPECT_EQ(GURL("https://myform.com/submit.html"), filled_form.action); 295 } else { 296 EXPECT_EQ(GURL("http://myform.com/form.html"), filled_form.origin); 297 EXPECT_EQ(GURL("http://myform.com/submit.html"), filled_form.action); 298 } 299 EXPECT_TRUE(filled_form.user_submitted); 300 301 size_t form_size = 0; 302 if (has_address_fields) 303 form_size += kAddressFormSize; 304 if (has_credit_card_fields) 305 form_size += kCreditCardFormSize; 306 ASSERT_EQ(form_size, filled_form.fields.size()); 307 308 FormField field; 309 if (has_address_fields) { 310 autofill_test::CreateTestFormField( 311 "First Name", "firstname", first, "text", &field); 312 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[0])); 313 autofill_test::CreateTestFormField( 314 "Middle Name", "middlename", middle, "text", &field); 315 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[1])); 316 autofill_test::CreateTestFormField( 317 "Last Name", "lastname", last, "text", &field); 318 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[2])); 319 autofill_test::CreateTestFormField( 320 "Address Line 1", "addr1", address1, "text", &field); 321 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[3])); 322 autofill_test::CreateTestFormField( 323 "Address Line 2", "addr2", address2, "text", &field); 324 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[4])); 325 autofill_test::CreateTestFormField( 326 "City", "city", city, "text", &field); 327 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[5])); 328 autofill_test::CreateTestFormField( 329 "State", "state", state, "text", &field); 330 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[6])); 331 autofill_test::CreateTestFormField( 332 "Postal Code", "zipcode", postal_code, "text", &field); 333 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[7])); 334 autofill_test::CreateTestFormField( 335 "Country", "country", country, "text", &field); 336 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[8])); 337 autofill_test::CreateTestFormField( 338 "Phone Number", "phonenumber", phone, "tel", &field); 339 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[9])); 340 autofill_test::CreateTestFormField( 341 "Fax", "fax", fax, "text", &field); 342 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[10])); 343 autofill_test::CreateTestFormField( 344 "Email", "email", email, "email", &field); 345 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[11])); 346 } 347 348 if (has_credit_card_fields) { 349 size_t offset = has_address_fields? kAddressFormSize : 0; 350 autofill_test::CreateTestFormField( 351 "Name on Card", "nameoncard", name_on_card, "text", &field); 352 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[offset + 0])); 353 autofill_test::CreateTestFormField( 354 "Card Number", "cardnumber", card_number, "text", &field); 355 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[offset + 1])); 356 if (use_month_type) { 357 std::string exp_year = expiration_year; 358 std::string exp_month = expiration_month; 359 std::string date; 360 if (!exp_year.empty() && !exp_month.empty()) 361 date = exp_year + "-" + exp_month; 362 autofill_test::CreateTestFormField( 363 "Expiration Date", "ccmonth", date.c_str(), "month", &field); 364 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[offset + 2])); 365 } else { 366 autofill_test::CreateTestFormField( 367 "Expiration Date", "ccmonth", expiration_month, "text", &field); 368 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[offset + 2])); 369 autofill_test::CreateTestFormField( 370 "", "ccyear", expiration_year, "text", &field); 371 EXPECT_TRUE(field.StrictlyEqualsHack(filled_form.fields[offset + 3])); 372 } 373 } 374 } 375 376 void ExpectFilledAddressFormElvis(int page_id, 377 const FormData& filled_form, 378 int expected_page_id, 379 bool has_credit_card_fields) { 380 ExpectFilledForm(page_id, filled_form, expected_page_id, "Elvis", "Aaron", 381 "Presley", "3734 Elvis Presley Blvd.", "Apt. 10", "Memphis", 382 "Tennessee", "38116", "United States", "12345678901", "", 383 "theking (at) gmail.com", "", "", "", "", true, 384 has_credit_card_fields, false); 385 } 386 387 void ExpectFilledCreditCardFormElvis(int page_id, 388 const FormData& filled_form, 389 int expected_page_id, 390 bool has_address_fields) { 391 ExpectFilledForm(page_id, filled_form, expected_page_id, 392 "", "", "", "", "", "", "", "", "", "", "", "", 393 "Elvis Presley", "4234567890123456", "04", "2012", 394 has_address_fields, true, false); 395 } 396 397 void ExpectFilledCreditCardYearMonthWithYearMonth(int page_id, 398 const FormData& filled_form, 399 int expected_page_id, 400 bool has_address_fields, 401 const char* year, 402 const char* month) { 403 ExpectFilledForm(page_id, filled_form, expected_page_id, 404 "", "", "", "", "", "", "", "", "", "", "", "", 405 "Miku Hatsune", "4234567890654321", month, year, 406 has_address_fields, true, true); 407 } 408 409 class TestAutofillManager : public AutofillManager { 410 public: 411 TestAutofillManager(TabContents* tab_contents, 412 TestPersonalDataManager* personal_manager) 413 : AutofillManager(tab_contents, personal_manager), 414 autofill_enabled_(true) { 415 test_personal_data_ = personal_manager; 416 } 417 418 virtual bool IsAutofillEnabled() const { return autofill_enabled_; } 419 420 void set_autofill_enabled(bool autofill_enabled) { 421 autofill_enabled_ = autofill_enabled; 422 } 423 424 AutofillProfile* GetProfileWithGUID(const char* guid) { 425 return test_personal_data_->GetProfileWithGUID(guid); 426 } 427 428 void AddProfile(AutofillProfile* profile) { 429 test_personal_data_->AddProfile(profile); 430 } 431 432 void AddCreditCard(CreditCard* credit_card) { 433 test_personal_data_->AddCreditCard(credit_card); 434 } 435 436 int GetPackedCreditCardID(int credit_card_id) { 437 return PackGUIDs(IDToGUID(credit_card_id), GUIDPair(std::string(), 0)); 438 } 439 440 virtual int GUIDToID(const GUIDPair& guid) OVERRIDE { 441 if (guid.first.empty()) 442 return 0; 443 444 int id; 445 EXPECT_TRUE(base::StringToInt(guid.first.substr(guid.first.rfind("-") + 1), 446 &id)); 447 return id; 448 } 449 450 virtual const GUIDPair IDToGUID(int id) OVERRIDE { 451 EXPECT_TRUE(id >= 0); 452 if (id <= 0) 453 return GUIDPair(std::string(), 0); 454 455 return GUIDPair(base::StringPrintf("00000000-0000-0000-0000-%012d", id), 0); 456 } 457 458 void AddSeenForm(FormStructure* form) { 459 form_structures()->push_back(form); 460 } 461 462 private: 463 TestPersonalDataManager* test_personal_data_; 464 bool autofill_enabled_; 465 466 DISALLOW_COPY_AND_ASSIGN(TestAutofillManager); 467 }; 468 469 } // namespace 470 471 class AutofillManagerTest : public TabContentsWrapperTestHarness { 472 public: 473 typedef AutofillManager::GUIDPair GUIDPair; 474 475 AutofillManagerTest() {} 476 virtual ~AutofillManagerTest() { 477 // Order of destruction is important as AutofillManager relies on 478 // PersonalDataManager to be around when it gets destroyed. 479 autofill_manager_.reset(NULL); 480 test_personal_data_ = NULL; 481 } 482 483 virtual void SetUp() { 484 TabContentsWrapperTestHarness::SetUp(); 485 test_personal_data_ = new TestPersonalDataManager(); 486 autofill_manager_.reset(new TestAutofillManager(contents(), 487 test_personal_data_.get())); 488 } 489 490 Profile* profile() { return contents()->profile(); } 491 492 void GetAutofillSuggestions(int query_id, 493 const webkit_glue::FormData& form, 494 const webkit_glue::FormField& field) { 495 autofill_manager_->OnQueryFormFieldAutofill(query_id, form, field); 496 } 497 498 void GetAutofillSuggestions(const webkit_glue::FormData& form, 499 const webkit_glue::FormField& field) { 500 GetAutofillSuggestions(kDefaultPageID, form, field); 501 } 502 503 void AutocompleteSuggestionsReturned(const std::vector<string16>& result) { 504 contents_wrapper()->autocomplete_history_manager()-> 505 SendSuggestions(&result); 506 } 507 508 void FormsSeen(const std::vector<webkit_glue::FormData>& forms) { 509 autofill_manager_->OnFormsSeen(forms); 510 } 511 512 void FormSubmitted(const FormData& form) { 513 autofill_manager_->OnFormSubmitted(form); 514 } 515 516 void FillAutofillFormData(int query_id, 517 const webkit_glue::FormData& form, 518 const webkit_glue::FormField& field, 519 int unique_id) { 520 autofill_manager_->OnFillAutofillFormData(query_id, form, field, unique_id); 521 } 522 523 bool GetAutofillSuggestionsMessage(int* page_id, 524 std::vector<string16>* values, 525 std::vector<string16>* labels, 526 std::vector<string16>* icons, 527 std::vector<int>* unique_ids) { 528 const uint32 kMsgID = AutofillMsg_SuggestionsReturned::ID; 529 const IPC::Message* message = 530 process()->sink().GetFirstMessageMatching(kMsgID); 531 if (!message) 532 return false; 533 534 AutofillParam autofill_param; 535 AutofillMsg_SuggestionsReturned::Read(message, &autofill_param); 536 if (page_id) 537 *page_id = autofill_param.a; 538 if (values) 539 *values = autofill_param.b; 540 if (labels) 541 *labels = autofill_param.c; 542 if (icons) 543 *icons = autofill_param.d; 544 if (unique_ids) 545 *unique_ids = autofill_param.e; 546 547 contents_wrapper()->autocomplete_history_manager()->CancelPendingQuery(); 548 process()->sink().ClearMessages(); 549 return true; 550 } 551 552 bool GetAutofillFormDataFilledMessage(int *page_id, FormData* results) { 553 const uint32 kMsgID = AutofillMsg_FormDataFilled::ID; 554 const IPC::Message* message = 555 process()->sink().GetFirstMessageMatching(kMsgID); 556 if (!message) 557 return false; 558 Tuple2<int, FormData> autofill_param; 559 AutofillMsg_FormDataFilled::Read(message, &autofill_param); 560 if (page_id) 561 *page_id = autofill_param.a; 562 if (results) 563 *results = autofill_param.b; 564 565 process()->sink().ClearMessages(); 566 return true; 567 } 568 569 protected: 570 scoped_ptr<TestAutofillManager> autofill_manager_; 571 scoped_refptr<TestPersonalDataManager> test_personal_data_; 572 573 private: 574 DISALLOW_COPY_AND_ASSIGN(AutofillManagerTest); 575 }; 576 577 class TestFormStructure : public FormStructure { 578 public: 579 explicit TestFormStructure(const FormData& form) : FormStructure(form) {} 580 virtual ~TestFormStructure() {} 581 582 void SetFieldTypes(const std::vector<AutofillFieldType>& heuristic_types, 583 const std::vector<AutofillFieldType>& server_types) { 584 ASSERT_EQ(field_count(), heuristic_types.size()); 585 ASSERT_EQ(field_count(), server_types.size()); 586 587 for (size_t i = 0; i < field_count(); ++i) { 588 AutofillField* field = (*fields())[i]; 589 ASSERT_TRUE(field); 590 field->set_heuristic_type(heuristic_types[i]); 591 field->set_server_type(server_types[i]); 592 } 593 594 UpdateAutofillCount(); 595 } 596 597 private: 598 DISALLOW_COPY_AND_ASSIGN(TestFormStructure); 599 }; 600 601 // Test that we return all address profile suggestions when all form fields are 602 // empty. 603 TEST_F(AutofillManagerTest, GetProfileSuggestionsEmptyValue) { 604 // Set up our form data. 605 FormData form; 606 CreateTestAddressFormData(&form); 607 std::vector<FormData> forms(1, form); 608 FormsSeen(forms); 609 610 const FormField& field = form.fields[0]; 611 GetAutofillSuggestions(form, field); 612 613 // No suggestions provided, so send an empty vector as the results. 614 // This triggers the combined message send. 615 AutocompleteSuggestionsReturned(std::vector<string16>()); 616 617 // Test that we sent the right message to the renderer. 618 int page_id = 0; 619 std::vector<string16> values; 620 std::vector<string16> labels; 621 std::vector<string16> icons; 622 std::vector<int> unique_ids; 623 GetAutofillSuggestionsMessage( 624 &page_id, &values, &labels, &icons, &unique_ids); 625 626 string16 expected_values[] = { 627 ASCIIToUTF16("Elvis"), 628 ASCIIToUTF16("Charles") 629 }; 630 // Inferred labels include full first relevant field, which in this case is 631 // the address line 1. 632 string16 expected_labels[] = { 633 ASCIIToUTF16("3734 Elvis Presley Blvd."), 634 ASCIIToUTF16("123 Apple St.") 635 }; 636 string16 expected_icons[] = {string16(), string16()}; 637 int expected_unique_ids[] = {1, 2}; 638 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 639 kDefaultPageID, arraysize(expected_values), expected_values, 640 expected_labels, expected_icons, expected_unique_ids); 641 } 642 643 // Test that we return only matching address profile suggestions when the 644 // selected form field has been partially filled out. 645 TEST_F(AutofillManagerTest, GetProfileSuggestionsMatchCharacter) { 646 // Set up our form data. 647 FormData form; 648 CreateTestAddressFormData(&form); 649 std::vector<FormData> forms(1, form); 650 FormsSeen(forms); 651 652 FormField field; 653 autofill_test::CreateTestFormField("First Name", "firstname", "E", "text", 654 &field); 655 GetAutofillSuggestions(form, field); 656 657 // No suggestions provided, so send an empty vector as the results. 658 // This triggers the combined message send. 659 AutocompleteSuggestionsReturned(std::vector<string16>()); 660 661 // Test that we sent the right message to the renderer. 662 int page_id = 0; 663 std::vector<string16> values; 664 std::vector<string16> labels; 665 std::vector<string16> icons; 666 std::vector<int> unique_ids; 667 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 668 &unique_ids)); 669 670 string16 expected_values[] = {ASCIIToUTF16("Elvis")}; 671 string16 expected_labels[] = {ASCIIToUTF16("3734 Elvis Presley Blvd.")}; 672 string16 expected_icons[] = {string16()}; 673 int expected_unique_ids[] = {1}; 674 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 675 kDefaultPageID, arraysize(expected_values), expected_values, 676 expected_labels, expected_icons, expected_unique_ids); 677 } 678 679 // Test that we return no suggestions when the form has no relevant fields. 680 TEST_F(AutofillManagerTest, GetProfileSuggestionsUnknownFields) { 681 // Set up our form data. 682 FormData form; 683 form.name = ASCIIToUTF16("MyForm"); 684 form.method = ASCIIToUTF16("POST"); 685 form.origin = GURL("http://myform.com/form.html"); 686 form.action = GURL("http://myform.com/submit.html"); 687 form.user_submitted = true; 688 689 FormField field; 690 autofill_test::CreateTestFormField("Username", "username", "", "text", 691 &field); 692 form.fields.push_back(field); 693 autofill_test::CreateTestFormField("Password", "password", "", "password", 694 &field); 695 form.fields.push_back(field); 696 autofill_test::CreateTestFormField("Quest", "quest", "", "quest", &field); 697 form.fields.push_back(field); 698 autofill_test::CreateTestFormField("Color", "color", "", "text", &field); 699 form.fields.push_back(field); 700 701 std::vector<FormData> forms(1, form); 702 FormsSeen(forms); 703 704 GetAutofillSuggestions(form, field); 705 EXPECT_FALSE(GetAutofillSuggestionsMessage(NULL, NULL, NULL, NULL, NULL)); 706 } 707 708 // Test that we cull duplicate profile suggestions. 709 TEST_F(AutofillManagerTest, GetProfileSuggestionsWithDuplicates) { 710 // Set up our form data. 711 FormData form; 712 CreateTestAddressFormData(&form); 713 std::vector<FormData> forms(1, form); 714 FormsSeen(forms); 715 716 // Add a duplicate profile. 717 AutofillProfile* duplicate_profile = 718 new AutofillProfile( 719 *(autofill_manager_->GetProfileWithGUID( 720 "00000000-0000-0000-0000-000000000001"))); 721 autofill_manager_->AddProfile(duplicate_profile); 722 723 const FormField& field = form.fields[0]; 724 GetAutofillSuggestions(form, field); 725 726 // No suggestions provided, so send an empty vector as the results. 727 // This triggers the combined message send. 728 AutocompleteSuggestionsReturned(std::vector<string16>()); 729 730 // Test that we sent the right message to the renderer. 731 int page_id = 0; 732 std::vector<string16> values; 733 std::vector<string16> labels; 734 std::vector<string16> icons; 735 std::vector<int> unique_ids; 736 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 737 &unique_ids)); 738 739 string16 expected_values[] = { 740 ASCIIToUTF16("Elvis"), 741 ASCIIToUTF16("Charles") 742 }; 743 string16 expected_labels[] = { 744 ASCIIToUTF16("3734 Elvis Presley Blvd."), 745 ASCIIToUTF16("123 Apple St.") 746 }; 747 string16 expected_icons[] = {string16(), string16()}; 748 int expected_unique_ids[] = {1, 2}; 749 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 750 kDefaultPageID, arraysize(expected_values), expected_values, 751 expected_labels, expected_icons, expected_unique_ids); 752 } 753 754 // Test that we return no suggestions when autofill is disabled. 755 TEST_F(AutofillManagerTest, GetProfileSuggestionsAutofillDisabledByUser) { 756 // Set up our form data. 757 FormData form; 758 CreateTestAddressFormData(&form); 759 std::vector<FormData> forms(1, form); 760 FormsSeen(forms); 761 762 // Disable Autofill. 763 autofill_manager_->set_autofill_enabled(false); 764 765 const FormField& field = form.fields[0]; 766 GetAutofillSuggestions(form, field); 767 EXPECT_FALSE(GetAutofillSuggestionsMessage(NULL, NULL, NULL, NULL, NULL)); 768 } 769 770 // Test that we return a warning explaining that autofill suggestions are 771 // unavailable when the form method is GET rather than POST. 772 TEST_F(AutofillManagerTest, GetProfileSuggestionsMethodGet) { 773 // Set up our form data. 774 FormData form; 775 CreateTestAddressFormData(&form); 776 form.method = ASCIIToUTF16("GET"); 777 std::vector<FormData> forms(1, form); 778 FormsSeen(forms); 779 780 const FormField& field = form.fields[0]; 781 GetAutofillSuggestions(form, field); 782 783 // No suggestions provided, so send an empty vector as the results. 784 // This triggers the combined message send. 785 AutocompleteSuggestionsReturned(std::vector<string16>()); 786 787 // Test that we sent the right message to the renderer. 788 int page_id = 0; 789 std::vector<string16> values; 790 std::vector<string16> labels; 791 std::vector<string16> icons; 792 std::vector<int> unique_ids; 793 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 794 &unique_ids)); 795 796 string16 expected_values[] = { 797 l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED) 798 }; 799 string16 expected_labels[] = {string16()}; 800 string16 expected_icons[] = {string16()}; 801 int expected_unique_ids[] = {-1}; 802 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 803 kDefaultPageID, arraysize(expected_values), expected_values, 804 expected_labels, expected_icons, expected_unique_ids); 805 806 // Now add some Autocomplete suggestions. We should return the autocomplete 807 // suggestions and the warning; these will be culled by the renderer. 808 const int kPageID2 = 2; 809 GetAutofillSuggestions(kPageID2, form, field); 810 811 std::vector<string16> suggestions; 812 suggestions.push_back(ASCIIToUTF16("Jay")); 813 suggestions.push_back(ASCIIToUTF16("Jason")); 814 AutocompleteSuggestionsReturned(suggestions); 815 816 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 817 &unique_ids)); 818 819 string16 expected_values2[] = { 820 l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED), 821 ASCIIToUTF16("Jay"), 822 ASCIIToUTF16("Jason") 823 }; 824 string16 expected_labels2[] = {string16(), string16(), string16()}; 825 string16 expected_icons2[] = {string16(), string16(), string16()}; 826 int expected_unique_ids2[] = {-1, 0, 0}; 827 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 828 kPageID2, arraysize(expected_values2), expected_values2, 829 expected_labels2, expected_icons2, expected_unique_ids2); 830 831 // Now clear the test profiles and try again -- we shouldn't return a warning. 832 test_personal_data_->ClearAutofillProfiles(); 833 GetAutofillSuggestions(form, field); 834 EXPECT_FALSE(GetAutofillSuggestionsMessage(NULL, NULL, NULL, NULL, NULL)); 835 } 836 837 // Test that we return all credit card profile suggestions when all form fields 838 // are empty. 839 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsEmptyValue) { 840 // Set up our form data. 841 FormData form; 842 CreateTestCreditCardFormData(&form, true, false); 843 std::vector<FormData> forms(1, form); 844 FormsSeen(forms); 845 846 FormField field = form.fields[1]; 847 GetAutofillSuggestions(form, field); 848 849 // No suggestions provided, so send an empty vector as the results. 850 // This triggers the combined message send. 851 AutocompleteSuggestionsReturned(std::vector<string16>()); 852 853 // Test that we sent the right message to the renderer. 854 int page_id = 0; 855 std::vector<string16> values; 856 std::vector<string16> labels; 857 std::vector<string16> icons; 858 std::vector<int> unique_ids; 859 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 860 &unique_ids)); 861 862 string16 expected_values[] = { 863 ASCIIToUTF16("************3456"), 864 ASCIIToUTF16("************8765") 865 }; 866 string16 expected_labels[] = {ASCIIToUTF16("*3456"), ASCIIToUTF16("*8765")}; 867 string16 expected_icons[] = { 868 ASCIIToUTF16("visaCC"), 869 ASCIIToUTF16("genericCC") 870 }; 871 int expected_unique_ids[] = { 872 autofill_manager_->GetPackedCreditCardID(4), 873 autofill_manager_->GetPackedCreditCardID(5) 874 }; 875 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 876 kDefaultPageID, arraysize(expected_values), expected_values, 877 expected_labels, expected_icons, expected_unique_ids); 878 } 879 880 // Test that we return only matching credit card profile suggestions when the 881 // selected form field has been partially filled out. 882 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsMatchCharacter) { 883 // Set up our form data. 884 FormData form; 885 CreateTestCreditCardFormData(&form, true, false); 886 std::vector<FormData> forms(1, form); 887 FormsSeen(forms); 888 889 FormField field; 890 autofill_test::CreateTestFormField( 891 "Card Number", "cardnumber", "4", "text", &field); 892 GetAutofillSuggestions(form, field); 893 894 // No suggestions provided, so send an empty vector as the results. 895 // This triggers the combined message send. 896 AutocompleteSuggestionsReturned(std::vector<string16>()); 897 898 // Test that we sent the right message to the renderer. 899 int page_id = 0; 900 std::vector<string16> values; 901 std::vector<string16> labels; 902 std::vector<string16> icons; 903 std::vector<int> unique_ids; 904 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 905 &unique_ids)); 906 907 string16 expected_values[] = {ASCIIToUTF16("************3456")}; 908 string16 expected_labels[] = {ASCIIToUTF16("*3456")}; 909 string16 expected_icons[] = {ASCIIToUTF16("visaCC")}; 910 int expected_unique_ids[] = {autofill_manager_->GetPackedCreditCardID(4)}; 911 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 912 kDefaultPageID, arraysize(expected_values), expected_values, 913 expected_labels, expected_icons, expected_unique_ids); 914 } 915 916 // Test that we return credit card profile suggestions when the selected form 917 // field is not the credit card number field. 918 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsNonCCNumber) { 919 // Set up our form data. 920 FormData form; 921 CreateTestCreditCardFormData(&form, true, false); 922 std::vector<FormData> forms(1, form); 923 FormsSeen(forms); 924 925 const FormField& field = form.fields[0]; 926 GetAutofillSuggestions(form, field); 927 928 // No suggestions provided, so send an empty vector as the results. 929 // This triggers the combined message send. 930 AutocompleteSuggestionsReturned(std::vector<string16>()); 931 932 // Test that we sent the right message to the renderer. 933 int page_id = 0; 934 std::vector<string16> values; 935 std::vector<string16> labels; 936 std::vector<string16> icons; 937 std::vector<int> unique_ids; 938 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 939 &unique_ids)); 940 941 string16 expected_values[] = { 942 ASCIIToUTF16("Elvis Presley"), 943 ASCIIToUTF16("Buddy Holly") 944 }; 945 string16 expected_labels[] = {ASCIIToUTF16("*3456"), ASCIIToUTF16("*8765")}; 946 string16 expected_icons[] = { 947 ASCIIToUTF16("visaCC"), 948 ASCIIToUTF16("genericCC") 949 }; 950 int expected_unique_ids[] = { 951 autofill_manager_->GetPackedCreditCardID(4), 952 autofill_manager_->GetPackedCreditCardID(5) 953 }; 954 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 955 kDefaultPageID, arraysize(expected_values), expected_values, 956 expected_labels, expected_icons, expected_unique_ids); 957 } 958 959 // Test that we return a warning explaining that credit card profile suggestions 960 // are unavailable when the form is not https. 961 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsNonHTTPS) { 962 // Set up our form data. 963 FormData form; 964 CreateTestCreditCardFormData(&form, false, false); 965 std::vector<FormData> forms(1, form); 966 FormsSeen(forms); 967 968 const FormField& field = form.fields[0]; 969 GetAutofillSuggestions(form, field); 970 971 // No suggestions provided, so send an empty vector as the results. 972 // This triggers the combined message send. 973 AutocompleteSuggestionsReturned(std::vector<string16>()); 974 975 // Test that we sent the right message to the renderer. 976 int page_id = 0; 977 std::vector<string16> values; 978 std::vector<string16> labels; 979 std::vector<string16> icons; 980 std::vector<int> unique_ids; 981 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 982 &unique_ids)); 983 984 string16 expected_values[] = { 985 l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION) 986 }; 987 string16 expected_labels[] = {string16()}; 988 string16 expected_icons[] = {string16()}; 989 int expected_unique_ids[] = {-1}; 990 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 991 kDefaultPageID, arraysize(expected_values), expected_values, 992 expected_labels, expected_icons, expected_unique_ids); 993 994 // Now add some Autocomplete suggestions. We should show the autocomplete 995 // suggestions and the warning. 996 const int kPageID2 = 2; 997 GetAutofillSuggestions(kPageID2, form, field); 998 999 std::vector<string16> suggestions; 1000 suggestions.push_back(ASCIIToUTF16("Jay")); 1001 suggestions.push_back(ASCIIToUTF16("Jason")); 1002 AutocompleteSuggestionsReturned(suggestions); 1003 1004 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1005 &unique_ids)); 1006 string16 expected_values2[] = { 1007 l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION), 1008 ASCIIToUTF16("Jay"), 1009 ASCIIToUTF16("Jason") 1010 }; 1011 string16 expected_labels2[] = {string16(), string16(), string16()}; 1012 string16 expected_icons2[] = {string16(), string16(), string16()}; 1013 int expected_unique_ids2[] = {-1, 0, 0}; 1014 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1015 kPageID2, arraysize(expected_values2), expected_values2, 1016 expected_labels2, expected_icons2, expected_unique_ids2); 1017 1018 // Clear the test credit cards and try again -- we shouldn't return a warning. 1019 test_personal_data_->ClearCreditCards(); 1020 GetAutofillSuggestions(form, field); 1021 EXPECT_FALSE(GetAutofillSuggestionsMessage(NULL, NULL, NULL, NULL, NULL)); 1022 } 1023 1024 // Test that we return all credit card suggestions in the case that two cards 1025 // have the same obfuscated number. 1026 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsRepeatedObfuscatedNumber) { 1027 // Add a credit card with the same obfuscated number as Elvis's. 1028 // |credit_card| will be owned by the mock PersonalDataManager. 1029 CreditCard* credit_card = new CreditCard; 1030 autofill_test::SetCreditCardInfo(credit_card, "Elvis Presley", 1031 "5231567890123456", // Mastercard 1032 "04", "2012"); 1033 credit_card->set_guid("00000000-0000-0000-0000-000000000007"); 1034 autofill_manager_->AddCreditCard(credit_card); 1035 1036 // Set up our form data. 1037 FormData form; 1038 CreateTestCreditCardFormData(&form, true, false); 1039 std::vector<FormData> forms(1, form); 1040 FormsSeen(forms); 1041 1042 FormField field = form.fields[1]; 1043 GetAutofillSuggestions(form, field); 1044 1045 // No suggestions provided, so send an empty vector as the results. 1046 // This triggers the combined message send. 1047 AutocompleteSuggestionsReturned(std::vector<string16>()); 1048 1049 // Test that we sent the right message to the renderer. 1050 int page_id = 0; 1051 std::vector<string16> values; 1052 std::vector<string16> labels; 1053 std::vector<string16> icons; 1054 std::vector<int> unique_ids; 1055 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1056 &unique_ids)); 1057 1058 string16 expected_values[] = { 1059 ASCIIToUTF16("************3456"), 1060 ASCIIToUTF16("************8765"), 1061 ASCIIToUTF16("************3456") 1062 }; 1063 string16 expected_labels[] = { 1064 ASCIIToUTF16("*3456"), 1065 ASCIIToUTF16("*8765"), 1066 ASCIIToUTF16("*3456"), 1067 }; 1068 string16 expected_icons[] = { 1069 ASCIIToUTF16("visaCC"), 1070 ASCIIToUTF16("genericCC"), 1071 ASCIIToUTF16("masterCardCC") 1072 }; 1073 int expected_unique_ids[] = { 1074 autofill_manager_->GetPackedCreditCardID(4), 1075 autofill_manager_->GetPackedCreditCardID(5), 1076 autofill_manager_->GetPackedCreditCardID(7) 1077 }; 1078 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1079 kDefaultPageID, arraysize(expected_values), expected_values, 1080 expected_labels, expected_icons, expected_unique_ids); 1081 } 1082 1083 // Test that we return profile and credit card suggestions for combined forms. 1084 TEST_F(AutofillManagerTest, GetAddressAndCreditCardSuggestions) { 1085 // Set up our form data. 1086 FormData form; 1087 CreateTestAddressFormData(&form); 1088 CreateTestCreditCardFormData(&form, true, false); 1089 std::vector<FormData> forms(1, form); 1090 FormsSeen(forms); 1091 1092 FormField field = form.fields[0]; 1093 GetAutofillSuggestions(form, field); 1094 1095 // No suggestions provided, so send an empty vector as the results. 1096 // This triggers the combined message send. 1097 AutocompleteSuggestionsReturned(std::vector<string16>()); 1098 1099 // Test that we sent the right address suggestions to the renderer. 1100 int page_id = 0; 1101 std::vector<string16> values; 1102 std::vector<string16> labels; 1103 std::vector<string16> icons; 1104 std::vector<int> unique_ids; 1105 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1106 &unique_ids)); 1107 1108 string16 expected_values[] = { 1109 ASCIIToUTF16("Elvis"), 1110 ASCIIToUTF16("Charles") 1111 }; 1112 string16 expected_labels[] = { 1113 ASCIIToUTF16("3734 Elvis Presley Blvd."), 1114 ASCIIToUTF16("123 Apple St.") 1115 }; 1116 string16 expected_icons[] = {string16(), string16()}; 1117 int expected_unique_ids[] = {1, 2}; 1118 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1119 kDefaultPageID, arraysize(expected_values), expected_values, 1120 expected_labels, expected_icons, expected_unique_ids); 1121 1122 const int kPageID2 = 2; 1123 autofill_test::CreateTestFormField( 1124 "Card Number", "cardnumber", "", "text", &field); 1125 GetAutofillSuggestions(kPageID2, form, field); 1126 1127 // No suggestions provided, so send an empty vector as the results. 1128 // This triggers the combined message send. 1129 AutocompleteSuggestionsReturned(std::vector<string16>()); 1130 1131 // Test that we sent the credit card suggestions to the renderer. 1132 page_id = 0; 1133 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1134 &unique_ids)); 1135 1136 string16 expected_values2[] = { 1137 ASCIIToUTF16("************3456"), 1138 ASCIIToUTF16("************8765") 1139 }; 1140 string16 expected_labels2[] = {ASCIIToUTF16("*3456"), ASCIIToUTF16("*8765")}; 1141 string16 expected_icons2[] = { 1142 ASCIIToUTF16("visaCC"), 1143 ASCIIToUTF16("genericCC") 1144 }; 1145 int expected_unique_ids2[] = { 1146 autofill_manager_->GetPackedCreditCardID(4), 1147 autofill_manager_->GetPackedCreditCardID(5) 1148 }; 1149 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1150 kPageID2, arraysize(expected_values2), expected_values2, 1151 expected_labels2, expected_icons2, expected_unique_ids2); 1152 } 1153 1154 // Test that for non-https forms with both address and credit card fields, we 1155 // only return address suggestions. Instead of credit card suggestions, we 1156 // should return a warning explaining that credit card profile suggestions are 1157 // unavailable when the form is not https. 1158 TEST_F(AutofillManagerTest, GetAddressAndCreditCardSuggestionsNonHttps) { 1159 // Set up our form data. 1160 FormData form; 1161 CreateTestAddressFormData(&form); 1162 CreateTestCreditCardFormData(&form, false, false); 1163 std::vector<FormData> forms(1, form); 1164 FormsSeen(forms); 1165 1166 FormField field = form.fields[0]; 1167 GetAutofillSuggestions(form, field); 1168 1169 // No suggestions provided, so send an empty vector as the results. 1170 // This triggers the combined message send. 1171 AutocompleteSuggestionsReturned(std::vector<string16>()); 1172 1173 // Test that we sent the right address suggestions to the renderer. 1174 int page_id = 0; 1175 std::vector<string16> values; 1176 std::vector<string16> labels; 1177 std::vector<string16> icons; 1178 std::vector<int> unique_ids; 1179 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1180 &unique_ids)); 1181 1182 string16 expected_values[] = { 1183 ASCIIToUTF16("Elvis"), 1184 ASCIIToUTF16("Charles") 1185 }; 1186 string16 expected_labels[] = { 1187 ASCIIToUTF16("3734 Elvis Presley Blvd."), 1188 ASCIIToUTF16("123 Apple St.") 1189 }; 1190 string16 expected_icons[] = {string16(), string16()}; 1191 int expected_unique_ids[] = {1, 2}; 1192 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1193 kDefaultPageID, arraysize(expected_values), expected_values, 1194 expected_labels, expected_icons, expected_unique_ids); 1195 1196 autofill_test::CreateTestFormField( 1197 "Card Number", "cardnumber", "", "text", &field); 1198 const int kPageID2 = 2; 1199 GetAutofillSuggestions(kPageID2, form, field); 1200 1201 // No suggestions provided, so send an empty vector as the results. 1202 // This triggers the combined message send. 1203 AutocompleteSuggestionsReturned(std::vector<string16>()); 1204 1205 // Test that we sent the right message to the renderer. 1206 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1207 &unique_ids)); 1208 1209 string16 expected_values2[] = { 1210 l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION) 1211 }; 1212 string16 expected_labels2[] = {string16()}; 1213 string16 expected_icons2[] = {string16()}; 1214 int expected_unique_ids2[] = {-1}; 1215 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1216 kPageID2, arraysize(expected_values2), expected_values2, 1217 expected_labels2, expected_icons2, expected_unique_ids2); 1218 1219 // Clear the test credit cards and try again -- we shouldn't return a warning. 1220 test_personal_data_->ClearCreditCards(); 1221 GetAutofillSuggestions(form, field); 1222 EXPECT_FALSE(GetAutofillSuggestionsMessage(NULL, NULL, NULL, NULL, NULL)); 1223 } 1224 1225 // Test that we correctly combine autofill and autocomplete suggestions. 1226 TEST_F(AutofillManagerTest, GetCombinedAutofillAndAutocompleteSuggestions) { 1227 // Set up our form data. 1228 FormData form; 1229 CreateTestAddressFormData(&form); 1230 std::vector<FormData> forms(1, form); 1231 FormsSeen(forms); 1232 1233 const FormField& field = form.fields[0]; 1234 GetAutofillSuggestions(form, field); 1235 1236 // Add some Autocomplete suggestions. 1237 // This triggers the combined message send. 1238 std::vector<string16> suggestions; 1239 suggestions.push_back(ASCIIToUTF16("Jay")); 1240 // This suggestion is a duplicate, and should be trimmed. 1241 suggestions.push_back(ASCIIToUTF16("Elvis")); 1242 suggestions.push_back(ASCIIToUTF16("Jason")); 1243 AutocompleteSuggestionsReturned(suggestions); 1244 1245 // Test that we sent the right message to the renderer. 1246 int page_id = 0; 1247 std::vector<string16> values; 1248 std::vector<string16> labels; 1249 std::vector<string16> icons; 1250 std::vector<int> unique_ids; 1251 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1252 &unique_ids)); 1253 1254 string16 expected_values[] = { 1255 ASCIIToUTF16("Elvis"), 1256 ASCIIToUTF16("Charles"), 1257 ASCIIToUTF16("Jay"), 1258 ASCIIToUTF16("Jason") 1259 }; 1260 string16 expected_labels[] = { 1261 ASCIIToUTF16("3734 Elvis Presley Blvd."), 1262 ASCIIToUTF16("123 Apple St."), 1263 string16(), 1264 string16() 1265 }; 1266 string16 expected_icons[] = {string16(), string16(), string16(), string16()}; 1267 int expected_unique_ids[] = {1, 2, 0, 0}; 1268 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1269 kDefaultPageID, arraysize(expected_values), expected_values, 1270 expected_labels, expected_icons, expected_unique_ids); 1271 } 1272 1273 // Test that we return autocomplete-like suggestions when trying to autofill 1274 // already filled forms. 1275 TEST_F(AutofillManagerTest, GetFieldSuggestionsWhenFormIsAutofilled) { 1276 // Set up our form data. 1277 FormData form; 1278 CreateTestAddressFormData(&form); 1279 std::vector<FormData> forms(1, form); 1280 FormsSeen(forms); 1281 1282 // Mark one of the fields as filled. 1283 form.fields[2].is_autofilled = true; 1284 const FormField& field = form.fields[0]; 1285 GetAutofillSuggestions(form, field); 1286 1287 // No suggestions provided, so send an empty vector as the results. 1288 // This triggers the combined message send. 1289 AutocompleteSuggestionsReturned(std::vector<string16>()); 1290 1291 // Test that we sent the right message to the renderer. 1292 int page_id = 0; 1293 std::vector<string16> values; 1294 std::vector<string16> labels; 1295 std::vector<string16> icons; 1296 std::vector<int> unique_ids; 1297 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1298 &unique_ids)); 1299 string16 expected_values[] = { 1300 ASCIIToUTF16("Elvis"), 1301 ASCIIToUTF16("Charles") 1302 }; 1303 string16 expected_labels[] = {string16(), string16()}; 1304 string16 expected_icons[] = {string16(), string16()}; 1305 int expected_unique_ids[] = {1, 2}; 1306 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1307 kDefaultPageID, arraysize(expected_values), expected_values, 1308 expected_labels, expected_icons, expected_unique_ids); 1309 } 1310 1311 // Test that nothing breaks when there are autocomplete suggestions but no 1312 // autofill suggestions. 1313 TEST_F(AutofillManagerTest, GetFieldSuggestionsForAutocompleteOnly) { 1314 // Set up our form data. 1315 FormData form; 1316 CreateTestAddressFormData(&form); 1317 FormField field; 1318 autofill_test::CreateTestFormField( 1319 "Some Field", "somefield", "", "text", &field); 1320 form.fields.push_back(field); 1321 std::vector<FormData> forms(1, form); 1322 FormsSeen(forms); 1323 1324 GetAutofillSuggestions(form, field); 1325 1326 // Add some Autocomplete suggestions. 1327 // This triggers the combined message send. 1328 std::vector<string16> suggestions; 1329 suggestions.push_back(ASCIIToUTF16("one")); 1330 suggestions.push_back(ASCIIToUTF16("two")); 1331 AutocompleteSuggestionsReturned(suggestions); 1332 1333 // Test that we sent the right message to the renderer. 1334 int page_id = 0; 1335 std::vector<string16> values; 1336 std::vector<string16> labels; 1337 std::vector<string16> icons; 1338 std::vector<int> unique_ids; 1339 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1340 &unique_ids)); 1341 1342 string16 expected_values[] = { 1343 ASCIIToUTF16("one"), 1344 ASCIIToUTF16("two") 1345 }; 1346 string16 expected_labels[] = {string16(), string16()}; 1347 string16 expected_icons[] = {string16(), string16()}; 1348 int expected_unique_ids[] = {0, 0}; 1349 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1350 kDefaultPageID, arraysize(expected_values), expected_values, 1351 expected_labels, expected_icons, expected_unique_ids); 1352 } 1353 1354 // Test that we do not return duplicate values drawn from multiple profiles when 1355 // filling an already filled field. 1356 TEST_F(AutofillManagerTest, GetFieldSuggestionsWithDuplicateValues) { 1357 // Set up our form data. 1358 FormData form; 1359 CreateTestAddressFormData(&form); 1360 std::vector<FormData> forms(1, form); 1361 FormsSeen(forms); 1362 1363 // |profile| will be owned by the mock PersonalDataManager. 1364 AutofillProfile* profile = new AutofillProfile; 1365 autofill_test::SetProfileInfo(profile, "Elvis", "", "", "", "", 1366 "", "", "", "", "", "", "", ""); 1367 profile->set_guid("00000000-0000-0000-0000-000000000101"); 1368 autofill_manager_->AddProfile(profile); 1369 1370 FormField& field = form.fields[0]; 1371 field.is_autofilled = true; 1372 field.value = ASCIIToUTF16("Elvis"); 1373 GetAutofillSuggestions(form, field); 1374 1375 // No suggestions provided, so send an empty vector as the results. 1376 // This triggers the combined message send. 1377 AutocompleteSuggestionsReturned(std::vector<string16>()); 1378 1379 // Test that we sent the right message to the renderer. 1380 int page_id = 0; 1381 std::vector<string16> values; 1382 std::vector<string16> labels; 1383 std::vector<string16> icons; 1384 std::vector<int> unique_ids; 1385 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1386 &unique_ids)); 1387 1388 string16 expected_values[] = { ASCIIToUTF16("Elvis") }; 1389 string16 expected_labels[] = { string16() }; 1390 string16 expected_icons[] = { string16() }; 1391 int expected_unique_ids[] = { 1 }; 1392 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1393 kDefaultPageID, arraysize(expected_values), expected_values, 1394 expected_labels, expected_icons, expected_unique_ids); 1395 } 1396 1397 // Test that a non-default value is suggested for multi-valued profile, on an 1398 // unfilled form. 1399 TEST_F(AutofillManagerTest, GetFieldSuggestionsForMultiValuedProfileUnfilled) { 1400 // Set up our form data. 1401 FormData form; 1402 CreateTestAddressFormData(&form); 1403 std::vector<FormData> forms(1, form); 1404 FormsSeen(forms); 1405 1406 // |profile| will be owned by the mock PersonalDataManager. 1407 AutofillProfile* profile = new AutofillProfile; 1408 autofill_test::SetProfileInfo(profile, "Elvis", "", "Presley", "me (at) x.com", "", 1409 "", "", "", "", "", "", "", ""); 1410 profile->set_guid("00000000-0000-0000-0000-000000000101"); 1411 std::vector<string16> multi_values(2); 1412 multi_values[0] = ASCIIToUTF16("Elvis Presley"); 1413 multi_values[1] = ASCIIToUTF16("Cynthia Love"); 1414 profile->SetMultiInfo(NAME_FULL, multi_values); 1415 autofill_manager_->AddProfile(profile); 1416 1417 // Get the first name field. And start out with "Cy", hoping for "Cynthia". 1418 FormField& field = form.fields[0]; 1419 field.value = ASCIIToUTF16("Cy"); 1420 field.is_autofilled = false; 1421 GetAutofillSuggestions(form, field); 1422 1423 // Trigger the |Send|. 1424 AutocompleteSuggestionsReturned(std::vector<string16>()); 1425 1426 // Test that we sent the right message to the renderer. 1427 int page_id = 0; 1428 std::vector<string16> values; 1429 std::vector<string16> labels; 1430 std::vector<string16> icons; 1431 std::vector<int> unique_ids; 1432 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1433 &unique_ids)); 1434 1435 string16 expected_values[] = { ASCIIToUTF16("Cynthia") }; 1436 string16 expected_labels[] = { ASCIIToUTF16("me (at) x.com") }; 1437 string16 expected_icons[] = { string16() }; 1438 int expected_unique_ids[] = { 101 }; 1439 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1440 kDefaultPageID, arraysize(expected_values), expected_values, 1441 expected_labels, expected_icons, expected_unique_ids); 1442 } 1443 1444 // Test that all values are suggested for multi-valued profile, on a filled 1445 // form. This is the per-field "override" case. 1446 TEST_F(AutofillManagerTest, GetFieldSuggestionsForMultiValuedProfileFilled) { 1447 // Set up our form data. 1448 FormData form; 1449 CreateTestAddressFormData(&form); 1450 std::vector<FormData> forms(1, form); 1451 FormsSeen(forms); 1452 1453 // |profile| will be owned by the mock PersonalDataManager. 1454 AutofillProfile* profile = new AutofillProfile; 1455 profile->set_guid("00000000-0000-0000-0000-000000000102"); 1456 std::vector<string16> multi_values(3); 1457 multi_values[0] = ASCIIToUTF16("Travis Smith"); 1458 multi_values[1] = ASCIIToUTF16("Cynthia Love"); 1459 multi_values[2] = ASCIIToUTF16("Zac Mango"); 1460 profile->SetMultiInfo(NAME_FULL, multi_values); 1461 autofill_manager_->AddProfile(profile); 1462 1463 // Get the first name field. And start out with "Travis", hoping for all the 1464 // multi-valued variants as suggestions. 1465 FormField& field = form.fields[0]; 1466 field.value = ASCIIToUTF16("Travis"); 1467 field.is_autofilled = true; 1468 GetAutofillSuggestions(form, field); 1469 1470 // Trigger the |Send|. 1471 AutocompleteSuggestionsReturned(std::vector<string16>()); 1472 1473 // Test that we sent the right message to the renderer. 1474 int page_id = 0; 1475 std::vector<string16> values; 1476 std::vector<string16> labels; 1477 std::vector<string16> icons; 1478 std::vector<int> unique_ids; 1479 EXPECT_TRUE(GetAutofillSuggestionsMessage(&page_id, &values, &labels, &icons, 1480 &unique_ids)); 1481 1482 string16 expected_values[] = { 1483 ASCIIToUTF16("Travis"), 1484 ASCIIToUTF16("Cynthia"), 1485 ASCIIToUTF16("Zac") 1486 }; 1487 string16 expected_labels[] = { string16(), string16(), string16() }; 1488 string16 expected_icons[] = { string16(), string16(), string16() }; 1489 int expected_unique_ids[] = { 102, 102, 102 }; 1490 ExpectSuggestions(page_id, values, labels, icons, unique_ids, 1491 kDefaultPageID, arraysize(expected_values), expected_values, 1492 expected_labels, expected_icons, expected_unique_ids); 1493 } 1494 1495 // Test that we correctly fill an address form. 1496 TEST_F(AutofillManagerTest, FillAddressForm) { 1497 // Set up our form data. 1498 FormData form; 1499 CreateTestAddressFormData(&form); 1500 std::vector<FormData> forms(1, form); 1501 FormsSeen(forms); 1502 1503 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 1504 GUIDPair empty(std::string(), 0); 1505 FillAutofillFormData( 1506 kDefaultPageID, form, form.fields[0], 1507 autofill_manager_->PackGUIDs(empty, guid)); 1508 1509 int page_id = 0; 1510 FormData results; 1511 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1512 ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, false); 1513 } 1514 1515 // Test that we correctly fill a credit card form. 1516 TEST_F(AutofillManagerTest, FillCreditCardForm) { 1517 // Set up our form data. 1518 FormData form; 1519 CreateTestCreditCardFormData(&form, true, false); 1520 std::vector<FormData> forms(1, form); 1521 FormsSeen(forms); 1522 1523 GUIDPair guid("00000000-0000-0000-0000-000000000004", 0); 1524 GUIDPair empty(std::string(), 0); 1525 FillAutofillFormData( 1526 kDefaultPageID, form, *form.fields.begin(), 1527 autofill_manager_->PackGUIDs(guid, empty)); 1528 1529 int page_id = 0; 1530 FormData results; 1531 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1532 ExpectFilledCreditCardFormElvis(page_id, results, kDefaultPageID, false); 1533 } 1534 1535 // Test that we correctly fill a credit card form with month input type. 1536 // 1. year empty, month empty 1537 TEST_F(AutofillManagerTest, FillCreditCardFormNoYearNoMonth) { 1538 // Same as the SetUp(), but generate 4 credit cards with year month 1539 // combination. 1540 test_personal_data_->CreateTestCreditCardsYearAndMonth("", ""); 1541 // Set up our form data. 1542 FormData form; 1543 CreateTestCreditCardFormData(&form, true, true); 1544 std::vector<FormData> forms(1, form); 1545 FormsSeen(forms); 1546 1547 GUIDPair guid("00000000-0000-0000-0000-000000000007", 0); 1548 GUIDPair empty(std::string(), 0); 1549 FillAutofillFormData( 1550 kDefaultPageID, form, *form.fields.begin(), 1551 autofill_manager_->PackGUIDs(guid, empty)); 1552 1553 int page_id = 0; 1554 FormData results; 1555 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1556 ExpectFilledCreditCardYearMonthWithYearMonth(page_id, results, 1557 kDefaultPageID, false, "", ""); 1558 } 1559 1560 1561 // Test that we correctly fill a credit card form with month input type. 1562 // 2. year empty, month non-empty 1563 TEST_F(AutofillManagerTest, FillCreditCardFormNoYearMonth) { 1564 // Same as the SetUp(), but generate 4 credit cards with year month 1565 // combination. 1566 test_personal_data_->CreateTestCreditCardsYearAndMonth("", "04"); 1567 // Set up our form data. 1568 FormData form; 1569 CreateTestCreditCardFormData(&form, true, true); 1570 std::vector<FormData> forms(1, form); 1571 FormsSeen(forms); 1572 1573 GUIDPair guid("00000000-0000-0000-0000-000000000007", 0); 1574 GUIDPair empty(std::string(), 0); 1575 FillAutofillFormData( 1576 kDefaultPageID, form, *form.fields.begin(), 1577 autofill_manager_->PackGUIDs(guid, empty)); 1578 1579 int page_id = 0; 1580 FormData results; 1581 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1582 ExpectFilledCreditCardYearMonthWithYearMonth(page_id, results, 1583 kDefaultPageID, false, "", "04"); 1584 } 1585 1586 // Test that we correctly fill a credit card form with month input type. 1587 // 3. year non-empty, month empty 1588 TEST_F(AutofillManagerTest, FillCreditCardFormYearNoMonth) { 1589 // Same as the SetUp(), but generate 4 credit cards with year month 1590 // combination. 1591 test_personal_data_->CreateTestCreditCardsYearAndMonth("2012", ""); 1592 // Set up our form data. 1593 FormData form; 1594 CreateTestCreditCardFormData(&form, true, true); 1595 std::vector<FormData> forms(1, form); 1596 FormsSeen(forms); 1597 1598 GUIDPair guid("00000000-0000-0000-0000-000000000007", 0); 1599 GUIDPair empty(std::string(), 0); 1600 FillAutofillFormData( 1601 kDefaultPageID, form, *form.fields.begin(), 1602 autofill_manager_->PackGUIDs(guid, empty)); 1603 1604 int page_id = 0; 1605 FormData results; 1606 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1607 ExpectFilledCreditCardYearMonthWithYearMonth(page_id, results, 1608 kDefaultPageID, false, "2012", ""); 1609 } 1610 1611 // Test that we correctly fill a credit card form with month input type. 1612 // 4. year non-empty, month empty 1613 TEST_F(AutofillManagerTest, FillCreditCardFormYearMonth) { 1614 // Same as the SetUp(), but generate 4 credit cards with year month 1615 // combination. 1616 test_personal_data_->ClearCreditCards(); 1617 test_personal_data_->CreateTestCreditCardsYearAndMonth("2012", "04"); 1618 // Set up our form data. 1619 FormData form; 1620 CreateTestCreditCardFormData(&form, true, true); 1621 std::vector<FormData> forms(1, form); 1622 FormsSeen(forms); 1623 1624 GUIDPair guid("00000000-0000-0000-0000-000000000007", 0); 1625 GUIDPair empty(std::string(), 0); 1626 FillAutofillFormData( 1627 kDefaultPageID, form, *form.fields.begin(), 1628 autofill_manager_->PackGUIDs(guid, empty)); 1629 1630 int page_id = 0; 1631 FormData results; 1632 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1633 ExpectFilledCreditCardYearMonthWithYearMonth(page_id, results, 1634 kDefaultPageID, false, "2012", "04"); 1635 } 1636 1637 // Test that we correctly fill a combined address and credit card form. 1638 TEST_F(AutofillManagerTest, FillAddressAndCreditCardForm) { 1639 // Set up our form data. 1640 FormData form; 1641 CreateTestAddressFormData(&form); 1642 CreateTestCreditCardFormData(&form, true, false); 1643 std::vector<FormData> forms(1, form); 1644 FormsSeen(forms); 1645 1646 // First fill the address data. 1647 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 1648 GUIDPair empty(std::string(), 0); 1649 FillAutofillFormData(kDefaultPageID, form, form.fields[0], 1650 autofill_manager_->PackGUIDs(empty, guid)); 1651 1652 int page_id = 0; 1653 FormData results; 1654 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1655 { 1656 SCOPED_TRACE("Address"); 1657 ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, true); 1658 } 1659 1660 // Now fill the credit card data. 1661 const int kPageID2 = 2; 1662 GUIDPair guid2("00000000-0000-0000-0000-000000000004", 0); 1663 FillAutofillFormData( 1664 kPageID2, form, form.fields.back(), 1665 autofill_manager_->PackGUIDs(guid2, empty)); 1666 1667 page_id = 0; 1668 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1669 { 1670 SCOPED_TRACE("Credit card"); 1671 ExpectFilledCreditCardFormElvis(page_id, results, kPageID2, true); 1672 } 1673 } 1674 1675 // Test that we correctly fill a form that has multiple logical sections, e.g. 1676 // both a billing and a shipping address. 1677 TEST_F(AutofillManagerTest, FillFormWithMultipleSections) { 1678 // Set up our form data. 1679 FormData form; 1680 CreateTestAddressFormData(&form); 1681 const size_t kAddressFormSize = form.fields.size(); 1682 CreateTestAddressFormData(&form); 1683 for (size_t i = kAddressFormSize; i < form.fields.size(); ++i) { 1684 // Make sure the fields have distinct names. 1685 form.fields[i].name = form.fields[i].name + ASCIIToUTF16("_"); 1686 } 1687 std::vector<FormData> forms(1, form); 1688 FormsSeen(forms); 1689 1690 // Fill the first section. 1691 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 1692 GUIDPair empty(std::string(), 0); 1693 FillAutofillFormData(kDefaultPageID, form, form.fields[0], 1694 autofill_manager_->PackGUIDs(empty, guid)); 1695 1696 int page_id = 0; 1697 FormData results; 1698 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1699 { 1700 SCOPED_TRACE("Address 1"); 1701 1702 // The second address section should be empty. 1703 ASSERT_EQ(results.fields.size(), 2*kAddressFormSize); 1704 for (size_t i = kAddressFormSize; i < form.fields.size(); ++i) { 1705 EXPECT_EQ(string16(), results.fields[i].value); 1706 } 1707 1708 // The first address section should be filled with Elvis's data. 1709 results.fields.resize(kAddressFormSize); 1710 ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, false); 1711 } 1712 1713 // Fill the second section, with the initiating field somewhere in the middle 1714 // of the section. 1715 const int kPageID2 = 2; 1716 GUIDPair guid2("00000000-0000-0000-0000-000000000001", 0); 1717 ASSERT_LT(9U, kAddressFormSize); 1718 FillAutofillFormData(kPageID2, form, form.fields[kAddressFormSize + 9], 1719 autofill_manager_->PackGUIDs(empty, guid2)); 1720 1721 page_id = 0; 1722 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1723 { 1724 SCOPED_TRACE("Address 2"); 1725 ASSERT_EQ(results.fields.size(), form.fields.size()); 1726 1727 // The first address section should be empty. 1728 ASSERT_EQ(results.fields.size(), 2*kAddressFormSize); 1729 for (size_t i = 0; i < kAddressFormSize; ++i) { 1730 EXPECT_EQ(string16(), results.fields[i].value); 1731 } 1732 1733 // The second address section should be filled with Elvis's data. 1734 FormData secondSection = results; 1735 secondSection.fields.erase(secondSection.fields.begin(), 1736 secondSection.fields.begin() + kAddressFormSize); 1737 for (size_t i = 0; i < kAddressFormSize; ++i) { 1738 // Restore the expected field names. 1739 string16 name = secondSection.fields[i].name; 1740 string16 original_name = name.substr(0, name.size() - 1); 1741 secondSection.fields[i].name = original_name; 1742 } 1743 ExpectFilledAddressFormElvis(page_id, secondSection, kPageID2, false); 1744 } 1745 } 1746 1747 // Test that we correctly fill a form that has a single logical section with 1748 // multiple email address fields. 1749 TEST_F(AutofillManagerTest, FillFormWithMultipleEmails) { 1750 // Set up our form data. 1751 FormData form; 1752 CreateTestAddressFormData(&form); 1753 FormField field; 1754 autofill_test::CreateTestFormField( 1755 "Confirm email", "email2", "", "text", &field); 1756 form.fields.push_back(field); 1757 1758 std::vector<FormData> forms(1, form); 1759 FormsSeen(forms); 1760 1761 // Fill the form. 1762 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 1763 GUIDPair empty(std::string(), 0); 1764 FillAutofillFormData(kDefaultPageID, form, form.fields[0], 1765 autofill_manager_->PackGUIDs(empty, guid)); 1766 1767 int page_id = 0; 1768 FormData results; 1769 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1770 1771 // The second email address should be filled. 1772 EXPECT_EQ(ASCIIToUTF16("theking (at) gmail.com"), results.fields.back().value); 1773 1774 // The remainder of the form should be filled as usual. 1775 results.fields.pop_back(); 1776 ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, false); 1777 } 1778 1779 // Test that we correctly fill a previously auto-filled form. 1780 TEST_F(AutofillManagerTest, FillAutofilledForm) { 1781 // Set up our form data. 1782 FormData form; 1783 CreateTestAddressFormData(&form); 1784 // Mark one of the address fields as autofilled. 1785 form.fields[4].is_autofilled = true; 1786 CreateTestCreditCardFormData(&form, true, false); 1787 std::vector<FormData> forms(1, form); 1788 FormsSeen(forms); 1789 1790 // First fill the address data. 1791 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 1792 GUIDPair empty(std::string(), 0); 1793 FillAutofillFormData( 1794 kDefaultPageID, form, *form.fields.begin(), 1795 autofill_manager_->PackGUIDs(empty, guid)); 1796 1797 int page_id = 0; 1798 FormData results; 1799 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1800 { 1801 SCOPED_TRACE("Address"); 1802 ExpectFilledForm(page_id, results, kDefaultPageID, 1803 "Elvis", "", "", "", "", "", "", "", "", "", "", "", 1804 "", "", "", "", true, true, false); 1805 } 1806 1807 // Now fill the credit card data. 1808 const int kPageID2 = 2; 1809 GUIDPair guid2("00000000-0000-0000-0000-000000000004", 0); 1810 FillAutofillFormData( 1811 kPageID2, form, form.fields.back(), 1812 autofill_manager_->PackGUIDs(guid2, empty)); 1813 1814 page_id = 0; 1815 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1816 { 1817 SCOPED_TRACE("Credit card 1"); 1818 ExpectFilledCreditCardFormElvis(page_id, results, kPageID2, true); 1819 } 1820 1821 // Now set the credit card fields to also be auto-filled, and try again to 1822 // fill the credit card data 1823 for (std::vector<FormField>::iterator iter = form.fields.begin(); 1824 iter != form.fields.end(); 1825 ++iter) { 1826 iter->is_autofilled = true; 1827 } 1828 1829 const int kPageID3 = 3; 1830 FillAutofillFormData( 1831 kPageID3, form, *form.fields.rbegin(), 1832 autofill_manager_->PackGUIDs(guid2, empty)); 1833 1834 page_id = 0; 1835 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1836 { 1837 SCOPED_TRACE("Credit card 2"); 1838 ExpectFilledForm(page_id, results, kPageID3, 1839 "", "", "", "", "", "", "", "", "", "", "", "", 1840 "", "", "", "2012", true, true, false); 1841 } 1842 } 1843 1844 // Test that we correctly fill a phone number split across multiple fields. 1845 TEST_F(AutofillManagerTest, FillPhoneNumber) { 1846 // Set up our form data. 1847 FormData form; 1848 form.name = ASCIIToUTF16("MyPhoneForm"); 1849 form.method = ASCIIToUTF16("POST"); 1850 form.origin = GURL("http://myform.com/phone_form.html"); 1851 form.action = GURL("http://myform.com/phone_submit.html"); 1852 form.user_submitted = true; 1853 1854 FormField field; 1855 autofill_test::CreateTestFormField( 1856 "country code", "country code", "", "text", &field); 1857 field.max_length = 1; 1858 form.fields.push_back(field); 1859 autofill_test::CreateTestFormField( 1860 "area code", "area code", "", "text", &field); 1861 field.max_length = 3; 1862 form.fields.push_back(field); 1863 autofill_test::CreateTestFormField( 1864 "phone", "phone prefix", "1", "text", &field); 1865 field.max_length = 3; 1866 form.fields.push_back(field); 1867 autofill_test::CreateTestFormField( 1868 "-", "phone suffix", "", "text", &field); 1869 field.max_length = 4; 1870 form.fields.push_back(field); 1871 autofill_test::CreateTestFormField( 1872 "Phone Extension", "ext", "", "text", &field); 1873 field.max_length = 3; 1874 form.fields.push_back(field); 1875 1876 std::vector<FormData> forms(1, form); 1877 FormsSeen(forms); 1878 1879 AutofillProfile *work_profile = autofill_manager_->GetProfileWithGUID( 1880 "00000000-0000-0000-0000-000000000002"); 1881 ASSERT_TRUE(work_profile != NULL); 1882 string16 saved_phone = work_profile->GetInfo(PHONE_HOME_NUMBER); 1883 1884 GUIDPair guid(work_profile->guid(), 0); 1885 GUIDPair empty(std::string(), 0); 1886 1887 char test_data[] = "1234567890123456"; 1888 for (int i = arraysize(test_data) - 1; i >= 0; --i) { 1889 test_data[i] = 0; 1890 SCOPED_TRACE(StringPrintf("Testing phone: %s", test_data)); 1891 work_profile->SetInfo(PHONE_HOME_NUMBER, ASCIIToUTF16(test_data)); 1892 // The page ID sent to the AutofillManager from the RenderView, used to send 1893 // an IPC message back to the renderer. 1894 int page_id = 100 - i; 1895 FillAutofillFormData( 1896 page_id, form, *form.fields.begin(), 1897 autofill_manager_->PackGUIDs(empty, guid)); 1898 page_id = 0; 1899 FormData results; 1900 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1901 1902 if (i != 7) { 1903 EXPECT_EQ(ASCIIToUTF16(test_data), results.fields[2].value); 1904 EXPECT_EQ(ASCIIToUTF16(test_data), results.fields[3].value); 1905 } else { 1906 // The only size that is parsed and split, right now is 7: 1907 EXPECT_EQ(ASCIIToUTF16("123"), results.fields[2].value); 1908 EXPECT_EQ(ASCIIToUTF16("4567"), results.fields[3].value); 1909 } 1910 } 1911 1912 work_profile->SetInfo(PHONE_HOME_NUMBER, saved_phone); 1913 } 1914 1915 // Test that we can still fill a form when a field has been removed from it. 1916 TEST_F(AutofillManagerTest, FormChangesRemoveField) { 1917 // Set up our form data. 1918 FormData form; 1919 CreateTestAddressFormData(&form); 1920 1921 // Add a field -- we'll remove it again later. 1922 FormField field; 1923 autofill_test::CreateTestFormField("Some", "field", "", "text", &field); 1924 form.fields.insert(form.fields.begin() + 3, field); 1925 1926 std::vector<FormData> forms(1, form); 1927 FormsSeen(forms); 1928 1929 // Now, after the call to |FormsSeen|, we remove the field before filling. 1930 form.fields.erase(form.fields.begin() + 3); 1931 1932 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 1933 GUIDPair empty(std::string(), 0); 1934 FillAutofillFormData( 1935 kDefaultPageID, form, form.fields[0], 1936 autofill_manager_->PackGUIDs(empty, guid)); 1937 1938 int page_id = 0; 1939 FormData results; 1940 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1941 ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, false); 1942 } 1943 1944 // Test that we can still fill a form when a field has been added to it. 1945 TEST_F(AutofillManagerTest, FormChangesAddField) { 1946 // The offset of the fax field in the address form. 1947 const int kFaxFieldOffset = 10; 1948 1949 // Set up our form data. 1950 FormData form; 1951 CreateTestAddressFormData(&form); 1952 1953 // Remove the fax field -- we'll add it back later. 1954 std::vector<FormField>::iterator pos = form.fields.begin() + kFaxFieldOffset; 1955 FormField field = *pos; 1956 pos = form.fields.erase(pos); 1957 1958 std::vector<FormData> forms(1, form); 1959 FormsSeen(forms); 1960 1961 // Now, after the call to |FormsSeen|, we restore the field before filling. 1962 form.fields.insert(pos, field); 1963 1964 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 1965 GUIDPair empty(std::string(), 0); 1966 FillAutofillFormData( 1967 kDefaultPageID, form, form.fields[0], 1968 autofill_manager_->PackGUIDs(empty, guid)); 1969 1970 int page_id = 0; 1971 FormData results; 1972 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1973 ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, false); 1974 } 1975 1976 // Test that we are able to save form data when forms are submitted. 1977 TEST_F(AutofillManagerTest, FormSubmitted) { 1978 // Set up our form data. 1979 FormData form; 1980 CreateTestAddressFormData(&form); 1981 std::vector<FormData> forms(1, form); 1982 FormsSeen(forms); 1983 1984 // Fill the form. 1985 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 1986 GUIDPair empty(std::string(), 0); 1987 FillAutofillFormData(kDefaultPageID, form, form.fields[0], 1988 autofill_manager_->PackGUIDs(empty, guid)); 1989 1990 int page_id = 0; 1991 FormData results; 1992 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 1993 ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, false); 1994 1995 // Simulate form submission. We should call into the PDM to try to save the 1996 // filled data. 1997 EXPECT_CALL(*test_personal_data_, SaveImportedProfile(::testing::_)).Times(1); 1998 FormSubmitted(results); 1999 } 2000 2001 // Test that we are able to save form data when forms are submitted and we only 2002 // have server data for the field types. 2003 TEST_F(AutofillManagerTest, FormSubmittedServerTypes) { 2004 // Set up our form data. 2005 FormData form; 2006 CreateTestAddressFormData(&form); 2007 2008 // Simulate having seen this form on page load. 2009 // |form_structure| will be owned by |autofill_manager_|. 2010 TestFormStructure* form_structure = new TestFormStructure(form); 2011 form_structure->DetermineHeuristicTypes(); 2012 2013 // Clear the heuristic types, and instead set the appropriate server types. 2014 std::vector<AutofillFieldType> heuristic_types, server_types; 2015 for (size_t i = 0; i < form.fields.size(); ++i) { 2016 heuristic_types.push_back(UNKNOWN_TYPE); 2017 server_types.push_back(form_structure->field(i)->type()); 2018 } 2019 form_structure->SetFieldTypes(heuristic_types, server_types); 2020 autofill_manager_->AddSeenForm(form_structure); 2021 2022 // Fill the form. 2023 GUIDPair guid("00000000-0000-0000-0000-000000000001", 0); 2024 GUIDPair empty(std::string(), 0); 2025 FillAutofillFormData(kDefaultPageID, form, form.fields[0], 2026 autofill_manager_->PackGUIDs(empty, guid)); 2027 2028 int page_id = 0; 2029 FormData results; 2030 EXPECT_TRUE(GetAutofillFormDataFilledMessage(&page_id, &results)); 2031 ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, false); 2032 2033 // Simulate form submission. We should call into the PDM to try to save the 2034 // filled data. 2035 EXPECT_CALL(*test_personal_data_, SaveImportedProfile(::testing::_)).Times(1); 2036 FormSubmitted(results); 2037 } 2038 2039 // Checks that resetting the auxiliary profile enabled preference does the right 2040 // thing on all platforms. 2041 TEST_F(AutofillManagerTest, AuxiliaryProfilesReset) { 2042 #if defined(OS_MACOSX) 2043 // Auxiliary profiles is implemented on Mac only. It enables Mac Address 2044 // Book integration. 2045 ASSERT_TRUE(profile()->GetPrefs()->GetBoolean( 2046 prefs::kAutofillAuxiliaryProfilesEnabled)); 2047 profile()->GetPrefs()->SetBoolean( 2048 prefs::kAutofillAuxiliaryProfilesEnabled, false); 2049 profile()->GetPrefs()->ClearPref(prefs::kAutofillAuxiliaryProfilesEnabled); 2050 ASSERT_TRUE(profile()->GetPrefs()->GetBoolean( 2051 prefs::kAutofillAuxiliaryProfilesEnabled)); 2052 #else 2053 ASSERT_FALSE(profile()->GetPrefs()->GetBoolean( 2054 prefs::kAutofillAuxiliaryProfilesEnabled)); 2055 profile()->GetPrefs()->SetBoolean( 2056 prefs::kAutofillAuxiliaryProfilesEnabled, true); 2057 profile()->GetPrefs()->ClearPref(prefs::kAutofillAuxiliaryProfilesEnabled); 2058 ASSERT_FALSE(profile()->GetPrefs()->GetBoolean( 2059 prefs::kAutofillAuxiliaryProfilesEnabled)); 2060 #endif 2061 } 2062