Home | History | Annotate | Download | only in browser
      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
      3 // found in the LICENSE file.
      4 
      5 #include <algorithm>
      6 #include <vector>
      7 
      8 #include "base/command_line.h"
      9 #include "base/format_macros.h"
     10 #include "base/memory/ref_counted.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/memory/scoped_vector.h"
     13 #include "base/message_loop/message_loop.h"
     14 #include "base/prefs/pref_service.h"
     15 #include "base/run_loop.h"
     16 #include "base/strings/string16.h"
     17 #include "base/strings/string_number_conversions.h"
     18 #include "base/strings/stringprintf.h"
     19 #include "base/strings/utf_string_conversions.h"
     20 #include "base/time/time.h"
     21 #include "base/tuple.h"
     22 #include "components/autofill/core/browser/autocomplete_history_manager.h"
     23 #include "components/autofill/core/browser/autofill_manager.h"
     24 #include "components/autofill/core/browser/autofill_metrics.h"
     25 #include "components/autofill/core/browser/autofill_profile.h"
     26 #include "components/autofill/core/browser/autofill_test_utils.h"
     27 #include "components/autofill/core/browser/credit_card.h"
     28 #include "components/autofill/core/browser/personal_data_manager.h"
     29 #include "components/autofill/core/browser/popup_item_ids.h"
     30 #include "components/autofill/core/browser/test_autofill_client.h"
     31 #include "components/autofill/core/browser/test_autofill_driver.h"
     32 #include "components/autofill/core/browser/test_autofill_external_delegate.h"
     33 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
     34 #include "components/autofill/core/common/autofill_pref_names.h"
     35 #include "components/autofill/core/common/form_data.h"
     36 #include "components/autofill/core/common/form_field_data.h"
     37 #include "grit/components_strings.h"
     38 #include "testing/gmock/include/gmock/gmock.h"
     39 #include "testing/gtest/include/gtest/gtest.h"
     40 #include "ui/base/l10n/l10n_util.h"
     41 #include "ui/gfx/rect.h"
     42 #include "url/gurl.h"
     43 
     44 using base::ASCIIToUTF16;
     45 using base::UTF8ToUTF16;
     46 using testing::_;
     47 
     48 namespace autofill {
     49 
     50 typedef PersonalDataManager::GUIDPair GUIDPair;
     51 
     52 namespace {
     53 
     54 const int kDefaultPageID = 137;
     55 
     56 class TestPersonalDataManager : public PersonalDataManager {
     57  public:
     58   TestPersonalDataManager() : PersonalDataManager("en-US") {
     59     CreateTestAutofillProfiles(&web_profiles_);
     60     CreateTestCreditCards(&credit_cards_);
     61   }
     62 
     63   using PersonalDataManager::set_database;
     64   using PersonalDataManager::SetPrefService;
     65 
     66   MOCK_METHOD1(SaveImportedProfile, std::string(const AutofillProfile&));
     67 
     68   AutofillProfile* GetProfileWithGUID(const char* guid) {
     69     for (std::vector<AutofillProfile *>::iterator it = web_profiles_.begin();
     70          it != web_profiles_.end(); ++it) {
     71       if (!(*it)->guid().compare(guid))
     72         return *it;
     73     }
     74     return NULL;
     75   }
     76 
     77   CreditCard* GetCreditCardWithGUID(const char* guid) {
     78     for (std::vector<CreditCard *>::iterator it = credit_cards_.begin();
     79          it != credit_cards_.end(); ++it){
     80       if (!(*it)->guid().compare(guid))
     81         return *it;
     82     }
     83     return NULL;
     84   }
     85 
     86   void AddProfile(AutofillProfile* profile) {
     87     web_profiles_.push_back(profile);
     88   }
     89 
     90   void AddCreditCard(CreditCard* credit_card) {
     91     credit_cards_.push_back(credit_card);
     92   }
     93 
     94   virtual void RemoveByGUID(const std::string& guid) OVERRIDE {
     95     CreditCard* credit_card = GetCreditCardWithGUID(guid.c_str());
     96     if (credit_card) {
     97       credit_cards_.erase(
     98           std::find(credit_cards_.begin(), credit_cards_.end(), credit_card));
     99     }
    100 
    101     AutofillProfile* profile = GetProfileWithGUID(guid.c_str());
    102     if (profile) {
    103       web_profiles_.erase(
    104           std::find(web_profiles_.begin(), web_profiles_.end(), profile));
    105     }
    106   }
    107 
    108   // Do nothing (auxiliary profiles will be created in
    109   // CreateTestAuxiliaryProfile).
    110   virtual void LoadAuxiliaryProfiles(bool record_metrics) const OVERRIDE {}
    111 
    112   void ClearAutofillProfiles() {
    113     web_profiles_.clear();
    114   }
    115 
    116   void ClearCreditCards() {
    117     credit_cards_.clear();
    118   }
    119 
    120   void CreateTestAuxiliaryProfiles() {
    121     CreateTestAutofillProfiles(&auxiliary_profiles_);
    122   }
    123 
    124   void CreateTestCreditCardsYearAndMonth(const char* year, const char* month) {
    125     ClearCreditCards();
    126     CreditCard* credit_card = new CreditCard;
    127     test::SetCreditCardInfo(credit_card, "Miku Hatsune",
    128                             "4234567890654321", // Visa
    129                             month, year);
    130     credit_card->set_guid("00000000-0000-0000-0000-000000000007");
    131     credit_cards_.push_back(credit_card);
    132   }
    133 
    134  private:
    135   void CreateTestAutofillProfiles(ScopedVector<AutofillProfile>* profiles) {
    136     AutofillProfile* profile = new AutofillProfile;
    137     test::SetProfileInfo(profile, "Elvis", "Aaron",
    138                          "Presley", "theking (at) gmail.com", "RCA",
    139                          "3734 Elvis Presley Blvd.", "Apt. 10",
    140                          "Memphis", "Tennessee", "38116", "US",
    141                          "12345678901");
    142     profile->set_guid("00000000-0000-0000-0000-000000000001");
    143     profiles->push_back(profile);
    144     profile = new AutofillProfile;
    145     test::SetProfileInfo(profile, "Charles", "Hardin",
    146                          "Holley", "buddy (at) gmail.com", "Decca",
    147                          "123 Apple St.", "unit 6", "Lubbock",
    148                          "Texas", "79401", "US", "23456789012");
    149     profile->set_guid("00000000-0000-0000-0000-000000000002");
    150     profiles->push_back(profile);
    151     profile = new AutofillProfile;
    152     test::SetProfileInfo(
    153         profile, "", "", "", "", "", "", "", "", "", "", "", "");
    154     profile->set_guid("00000000-0000-0000-0000-000000000003");
    155     profiles->push_back(profile);
    156   }
    157 
    158   void CreateTestCreditCards(ScopedVector<CreditCard>* credit_cards) {
    159     CreditCard* credit_card = new CreditCard;
    160     test::SetCreditCardInfo(credit_card, "Elvis Presley",
    161                             "4234 5678 9012 3456",  // Visa
    162                             "04", "2012");
    163     credit_card->set_guid("00000000-0000-0000-0000-000000000004");
    164     credit_cards->push_back(credit_card);
    165 
    166     credit_card = new CreditCard;
    167     test::SetCreditCardInfo(credit_card, "Buddy Holly",
    168                             "5187654321098765",  // Mastercard
    169                             "10", "2014");
    170     credit_card->set_guid("00000000-0000-0000-0000-000000000005");
    171     credit_cards->push_back(credit_card);
    172 
    173     credit_card = new CreditCard;
    174     test::SetCreditCardInfo(credit_card, "", "", "", "");
    175     credit_card->set_guid("00000000-0000-0000-0000-000000000006");
    176     credit_cards->push_back(credit_card);
    177   }
    178 
    179   DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager);
    180 };
    181 
    182 // Populates |form| with data corresponding to a simple credit card form.
    183 // Note that this actually appends fields to the form data, which can be useful
    184 // for building up more complex test forms.
    185 void CreateTestCreditCardFormData(FormData* form,
    186                                   bool is_https,
    187                                   bool use_month_type) {
    188   form->name = ASCIIToUTF16("MyForm");
    189   if (is_https) {
    190     form->origin = GURL("https://myform.com/form.html");
    191     form->action = GURL("https://myform.com/submit.html");
    192   } else {
    193     form->origin = GURL("http://myform.com/form.html");
    194     form->action = GURL("http://myform.com/submit.html");
    195   }
    196   form->user_submitted = true;
    197 
    198   FormFieldData field;
    199   test::CreateTestFormField("Name on Card", "nameoncard", "", "text", &field);
    200   form->fields.push_back(field);
    201   test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field);
    202   form->fields.push_back(field);
    203   if (use_month_type) {
    204     test::CreateTestFormField(
    205         "Expiration Date", "ccmonth", "", "month", &field);
    206     form->fields.push_back(field);
    207   } else {
    208     test::CreateTestFormField("Expiration Date", "ccmonth", "", "text", &field);
    209     form->fields.push_back(field);
    210     test::CreateTestFormField("", "ccyear", "", "text", &field);
    211     form->fields.push_back(field);
    212   }
    213 }
    214 
    215 void ExpectFilledField(const char* expected_label,
    216                        const char* expected_name,
    217                        const char* expected_value,
    218                        const char* expected_form_control_type,
    219                        const FormFieldData& field) {
    220   SCOPED_TRACE(expected_label);
    221   EXPECT_EQ(UTF8ToUTF16(expected_label), field.label);
    222   EXPECT_EQ(UTF8ToUTF16(expected_name), field.name);
    223   EXPECT_EQ(UTF8ToUTF16(expected_value), field.value);
    224   EXPECT_EQ(expected_form_control_type, field.form_control_type);
    225 }
    226 
    227 // Verifies that the |filled_form| has been filled with the given data.
    228 // Verifies address fields if |has_address_fields| is true, and verifies
    229 // credit card fields if |has_credit_card_fields| is true. Verifies both if both
    230 // are true. |use_month_type| is used for credit card input month type.
    231 void ExpectFilledForm(int page_id,
    232                       const FormData& filled_form,
    233                       int expected_page_id,
    234                       const char* first,
    235                       const char* middle,
    236                       const char* last,
    237                       const char* address1,
    238                       const char* address2,
    239                       const char* city,
    240                       const char* state,
    241                       const char* postal_code,
    242                       const char* country,
    243                       const char* phone,
    244                       const char* email,
    245                       const char* name_on_card,
    246                       const char* card_number,
    247                       const char* expiration_month,
    248                       const char* expiration_year,
    249                       bool has_address_fields,
    250                       bool has_credit_card_fields,
    251                       bool use_month_type) {
    252   // The number of fields in the address and credit card forms created above.
    253   const size_t kAddressFormSize = 11;
    254   const size_t kCreditCardFormSize = use_month_type ? 3 : 4;
    255 
    256   EXPECT_EQ(expected_page_id, page_id);
    257   EXPECT_EQ(ASCIIToUTF16("MyForm"), filled_form.name);
    258   if (has_credit_card_fields) {
    259     EXPECT_EQ(GURL("https://myform.com/form.html"), filled_form.origin);
    260     EXPECT_EQ(GURL("https://myform.com/submit.html"), filled_form.action);
    261   } else {
    262     EXPECT_EQ(GURL("http://myform.com/form.html"), filled_form.origin);
    263     EXPECT_EQ(GURL("http://myform.com/submit.html"), filled_form.action);
    264   }
    265   EXPECT_TRUE(filled_form.user_submitted);
    266 
    267   size_t form_size = 0;
    268   if (has_address_fields)
    269     form_size += kAddressFormSize;
    270   if (has_credit_card_fields)
    271     form_size += kCreditCardFormSize;
    272   ASSERT_EQ(form_size, filled_form.fields.size());
    273 
    274   if (has_address_fields) {
    275     ExpectFilledField("First Name", "firstname", first, "text",
    276                       filled_form.fields[0]);
    277     ExpectFilledField("Middle Name", "middlename", middle, "text",
    278                       filled_form.fields[1]);
    279     ExpectFilledField("Last Name", "lastname", last, "text",
    280                       filled_form.fields[2]);
    281     ExpectFilledField("Address Line 1", "addr1", address1, "text",
    282                       filled_form.fields[3]);
    283     ExpectFilledField("Address Line 2", "addr2", address2, "text",
    284                       filled_form.fields[4]);
    285     ExpectFilledField("City", "city", city, "text",
    286                       filled_form.fields[5]);
    287     ExpectFilledField("State", "state", state, "text",
    288                       filled_form.fields[6]);
    289     ExpectFilledField("Postal Code", "zipcode", postal_code, "text",
    290                       filled_form.fields[7]);
    291     ExpectFilledField("Country", "country", country, "text",
    292                       filled_form.fields[8]);
    293     ExpectFilledField("Phone Number", "phonenumber", phone, "tel",
    294                       filled_form.fields[9]);
    295     ExpectFilledField("Email", "email", email, "email",
    296                       filled_form.fields[10]);
    297   }
    298 
    299   if (has_credit_card_fields) {
    300     size_t offset = has_address_fields? kAddressFormSize : 0;
    301     ExpectFilledField("Name on Card", "nameoncard", name_on_card, "text",
    302                       filled_form.fields[offset + 0]);
    303     ExpectFilledField("Card Number", "cardnumber", card_number, "text",
    304                       filled_form.fields[offset + 1]);
    305     if (use_month_type) {
    306       std::string exp_year = expiration_year;
    307       std::string exp_month = expiration_month;
    308       std::string date;
    309       if (!exp_year.empty() && !exp_month.empty())
    310         date = exp_year + "-" + exp_month;
    311 
    312       ExpectFilledField("Expiration Date", "ccmonth", date.c_str(), "month",
    313                         filled_form.fields[offset + 2]);
    314     } else {
    315       ExpectFilledField("Expiration Date", "ccmonth", expiration_month, "text",
    316                         filled_form.fields[offset + 2]);
    317       ExpectFilledField("", "ccyear", expiration_year, "text",
    318                         filled_form.fields[offset + 3]);
    319     }
    320   }
    321 }
    322 
    323 void ExpectFilledAddressFormElvis(int page_id,
    324                                   const FormData& filled_form,
    325                                   int expected_page_id,
    326                                   bool has_credit_card_fields) {
    327   ExpectFilledForm(page_id, filled_form, expected_page_id, "Elvis", "Aaron",
    328                    "Presley", "3734 Elvis Presley Blvd.", "Apt. 10", "Memphis",
    329                    "Tennessee", "38116", "United States", "12345678901",
    330                    "theking (at) gmail.com", "", "", "", "", true,
    331                    has_credit_card_fields, false);
    332 }
    333 
    334 void ExpectFilledCreditCardFormElvis(int page_id,
    335                                      const FormData& filled_form,
    336                                      int expected_page_id,
    337                                      bool has_address_fields) {
    338   ExpectFilledForm(page_id, filled_form, expected_page_id,
    339                    "", "", "", "", "", "", "", "", "", "", "",
    340                    "Elvis Presley", "4234567890123456", "04", "2012",
    341                    has_address_fields, true, false);
    342 }
    343 
    344 void ExpectFilledCreditCardYearMonthWithYearMonth(int page_id,
    345                                                   const FormData& filled_form,
    346                                                   int expected_page_id,
    347                                                   bool has_address_fields,
    348                                                   const char* year,
    349                                                   const char* month) {
    350   ExpectFilledForm(page_id, filled_form, expected_page_id,
    351                    "", "", "", "", "", "", "", "", "", "", "",
    352                    "Miku Hatsune", "4234567890654321", month, year,
    353                    has_address_fields, true, true);
    354 }
    355 
    356 class MockAutocompleteHistoryManager : public AutocompleteHistoryManager {
    357  public:
    358   MockAutocompleteHistoryManager(AutofillDriver* driver, AutofillClient* client)
    359       : AutocompleteHistoryManager(driver, client) {}
    360 
    361   MOCK_METHOD1(OnFormSubmitted, void(const FormData& form));
    362 
    363  private:
    364   DISALLOW_COPY_AND_ASSIGN(MockAutocompleteHistoryManager);
    365 };
    366 
    367 class MockAutofillDriver : public TestAutofillDriver {
    368  public:
    369   MockAutofillDriver() {}
    370 
    371   // Mock methods to enable testability.
    372   MOCK_METHOD3(SendFormDataToRenderer, void(int query_id,
    373                                             RendererFormDataAction action,
    374                                             const FormData& data));
    375 
    376  private:
    377   DISALLOW_COPY_AND_ASSIGN(MockAutofillDriver);
    378 };
    379 
    380 class TestAutofillManager : public AutofillManager {
    381  public:
    382   TestAutofillManager(AutofillDriver* driver,
    383                       autofill::AutofillClient* client,
    384                       TestPersonalDataManager* personal_data)
    385       : AutofillManager(driver, client, personal_data),
    386         personal_data_(personal_data),
    387         autofill_enabled_(true) {}
    388   virtual ~TestAutofillManager() {}
    389 
    390   virtual bool IsAutofillEnabled() const OVERRIDE { return autofill_enabled_; }
    391 
    392   void set_autofill_enabled(bool autofill_enabled) {
    393     autofill_enabled_ = autofill_enabled;
    394   }
    395 
    396   void set_expected_submitted_field_types(
    397       const std::vector<ServerFieldTypeSet>& expected_types) {
    398     expected_submitted_field_types_ = expected_types;
    399   }
    400 
    401   virtual void UploadFormDataAsyncCallback(
    402       const FormStructure* submitted_form,
    403       const base::TimeTicks& load_time,
    404       const base::TimeTicks& interaction_time,
    405       const base::TimeTicks& submission_time) OVERRIDE {
    406     run_loop_->Quit();
    407 
    408     // If we have expected field types set, make sure they match.
    409     if (!expected_submitted_field_types_.empty()) {
    410       ASSERT_EQ(expected_submitted_field_types_.size(),
    411                 submitted_form->field_count());
    412       for (size_t i = 0; i < expected_submitted_field_types_.size(); ++i) {
    413         SCOPED_TRACE(
    414             base::StringPrintf(
    415                 "Field %d with value %s", static_cast<int>(i),
    416                 base::UTF16ToUTF8(submitted_form->field(i)->value).c_str()));
    417         const ServerFieldTypeSet& possible_types =
    418             submitted_form->field(i)->possible_types();
    419         EXPECT_EQ(expected_submitted_field_types_[i].size(),
    420                   possible_types.size());
    421         for (ServerFieldTypeSet::const_iterator it =
    422                  expected_submitted_field_types_[i].begin();
    423              it != expected_submitted_field_types_[i].end(); ++it) {
    424           EXPECT_TRUE(possible_types.count(*it))
    425               << "Expected type: " << AutofillType(*it).ToString();
    426         }
    427       }
    428     }
    429 
    430     AutofillManager::UploadFormDataAsyncCallback(submitted_form,
    431                                                  load_time,
    432                                                  interaction_time,
    433                                                  submission_time);
    434   }
    435 
    436   // Resets the run loop so that it can wait for an asynchronous form
    437   // submission to complete.
    438   void ResetRunLoop() { run_loop_.reset(new base::RunLoop()); }
    439 
    440   // Wait for the asynchronous OnFormSubmitted() call to complete.
    441   void WaitForAsyncFormSubmit() { run_loop_->Run(); }
    442 
    443   virtual void UploadFormData(const FormStructure& submitted_form) OVERRIDE {
    444     submitted_form_signature_ = submitted_form.FormSignature();
    445   }
    446 
    447   const std::string GetSubmittedFormSignature() {
    448     return submitted_form_signature_;
    449   }
    450 
    451   AutofillProfile* GetProfileWithGUID(const char* guid) {
    452     return personal_data_->GetProfileWithGUID(guid);
    453   }
    454 
    455   CreditCard* GetCreditCardWithGUID(const char* guid) {
    456     return personal_data_->GetCreditCardWithGUID(guid);
    457   }
    458 
    459   void AddProfile(AutofillProfile* profile) {
    460     personal_data_->AddProfile(profile);
    461   }
    462 
    463   void AddCreditCard(CreditCard* credit_card) {
    464     personal_data_->AddCreditCard(credit_card);
    465   }
    466 
    467   int GetPackedCreditCardID(int credit_card_id) {
    468     std::string credit_card_guid =
    469         base::StringPrintf("00000000-0000-0000-0000-%012d", credit_card_id);
    470 
    471     return PackGUIDs(GUIDPair(credit_card_guid, 0), GUIDPair(std::string(), 0));
    472   }
    473 
    474   void AddSeenForm(FormStructure* form) {
    475     form_structures()->push_back(form);
    476   }
    477 
    478   void ClearFormStructures() {
    479     form_structures()->clear();
    480   }
    481 
    482  private:
    483   // Weak reference.
    484   TestPersonalDataManager* personal_data_;
    485 
    486   bool autofill_enabled_;
    487 
    488   scoped_ptr<base::RunLoop> run_loop_;
    489 
    490   std::string submitted_form_signature_;
    491   std::vector<ServerFieldTypeSet> expected_submitted_field_types_;
    492 
    493   DISALLOW_COPY_AND_ASSIGN(TestAutofillManager);
    494 };
    495 
    496 class TestAutofillExternalDelegate : public AutofillExternalDelegate {
    497  public:
    498   explicit TestAutofillExternalDelegate(AutofillManager* autofill_manager,
    499                                         AutofillDriver* autofill_driver)
    500       : AutofillExternalDelegate(autofill_manager, autofill_driver),
    501         on_query_seen_(false),
    502         on_suggestions_returned_seen_(false) {}
    503   virtual ~TestAutofillExternalDelegate() {}
    504 
    505   virtual void OnQuery(int query_id,
    506                        const FormData& form,
    507                        const FormFieldData& field,
    508                        const gfx::RectF& bounds,
    509                        bool display_warning) OVERRIDE {
    510     on_query_seen_ = true;
    511     on_suggestions_returned_seen_ = false;
    512   }
    513 
    514   virtual void OnSuggestionsReturned(
    515       int query_id,
    516       const std::vector<base::string16>& autofill_values,
    517       const std::vector<base::string16>& autofill_labels,
    518       const std::vector<base::string16>& autofill_icons,
    519       const std::vector<int>& autofill_unique_ids) OVERRIDE {
    520     on_suggestions_returned_seen_ = true;
    521 
    522     query_id_ = query_id;
    523     autofill_values_ = autofill_values;
    524     autofill_labels_ = autofill_labels;
    525     autofill_icons_ = autofill_icons;
    526     autofill_unique_ids_ = autofill_unique_ids;
    527   }
    528 
    529   void CheckSuggestions(int expected_page_id,
    530                         size_t expected_num_suggestions,
    531                         const base::string16 expected_values[],
    532                         const base::string16 expected_labels[],
    533                         const base::string16 expected_icons[],
    534                         const int expected_unique_ids[]) {
    535     // Ensure that these results are from the most recent query.
    536     EXPECT_TRUE(on_suggestions_returned_seen_);
    537 
    538     EXPECT_EQ(expected_page_id, query_id_);
    539     ASSERT_EQ(expected_num_suggestions, autofill_values_.size());
    540     ASSERT_EQ(expected_num_suggestions, autofill_labels_.size());
    541     ASSERT_EQ(expected_num_suggestions, autofill_icons_.size());
    542     ASSERT_EQ(expected_num_suggestions, autofill_unique_ids_.size());
    543     for (size_t i = 0; i < expected_num_suggestions; ++i) {
    544       SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i));
    545       EXPECT_EQ(expected_values[i], autofill_values_[i]);
    546       EXPECT_EQ(expected_labels[i], autofill_labels_[i]);
    547       EXPECT_EQ(expected_icons[i], autofill_icons_[i]);
    548       EXPECT_EQ(expected_unique_ids[i], autofill_unique_ids_[i]);
    549     }
    550   }
    551 
    552   bool on_query_seen() const {
    553     return on_query_seen_;
    554   }
    555 
    556   bool on_suggestions_returned_seen() const {
    557     return on_suggestions_returned_seen_;
    558   }
    559 
    560  private:
    561   // Records if OnQuery has been called yet.
    562   bool on_query_seen_;
    563 
    564   // Records if OnSuggestionsReturned has been called after the most recent
    565   // call to OnQuery.
    566   bool on_suggestions_returned_seen_;
    567 
    568   // The query id of the most recent Autofill query.
    569   int query_id_;
    570 
    571   // The results returned by the most recent Autofill query.
    572   std::vector<base::string16> autofill_values_;
    573   std::vector<base::string16> autofill_labels_;
    574   std::vector<base::string16> autofill_icons_;
    575   std::vector<int> autofill_unique_ids_;
    576 
    577   DISALLOW_COPY_AND_ASSIGN(TestAutofillExternalDelegate);
    578 };
    579 
    580 }  // namespace
    581 
    582 class AutofillManagerTest : public testing::Test {
    583  public:
    584   virtual void SetUp() OVERRIDE {
    585     autofill_client_.SetPrefs(test::PrefServiceForTesting());
    586     personal_data_.set_database(autofill_client_.GetDatabase());
    587     personal_data_.SetPrefService(autofill_client_.GetPrefs());
    588     autofill_driver_.reset(new MockAutofillDriver());
    589     autofill_manager_.reset(new TestAutofillManager(
    590         autofill_driver_.get(), &autofill_client_, &personal_data_));
    591 
    592     external_delegate_.reset(new TestAutofillExternalDelegate(
    593         autofill_manager_.get(),
    594         autofill_driver_.get()));
    595     autofill_manager_->SetExternalDelegate(external_delegate_.get());
    596   }
    597 
    598   virtual void TearDown() OVERRIDE {
    599     // Order of destruction is important as AutofillManager relies on
    600     // PersonalDataManager to be around when it gets destroyed.
    601     autofill_manager_.reset();
    602     autofill_driver_.reset();
    603 
    604     // Remove the AutofillWebDataService so TestPersonalDataManager does not
    605     // need to care about removing self as an observer in destruction.
    606     personal_data_.set_database(scoped_refptr<AutofillWebDataService>(NULL));
    607     personal_data_.SetPrefService(NULL);
    608   }
    609 
    610   void GetAutofillSuggestions(int query_id,
    611                               const FormData& form,
    612                               const FormFieldData& field) {
    613     autofill_manager_->OnQueryFormFieldAutofill(query_id,
    614                                                 form,
    615                                                 field,
    616                                                 gfx::Rect(),
    617                                                 false);
    618   }
    619 
    620   void GetAutofillSuggestions(const FormData& form,
    621                               const FormFieldData& field) {
    622     GetAutofillSuggestions(kDefaultPageID, form, field);
    623   }
    624 
    625   void AutocompleteSuggestionsReturned(
    626       const std::vector<base::string16>& result) {
    627     autofill_manager_->autocomplete_history_manager_->SendSuggestions(&result);
    628   }
    629 
    630   void FormsSeen(const std::vector<FormData>& forms) {
    631     autofill_manager_->OnFormsSeen(forms, base::TimeTicks());
    632   }
    633 
    634   void FormSubmitted(const FormData& form) {
    635     autofill_manager_->ResetRunLoop();
    636     if (autofill_manager_->OnFormSubmitted(form, base::TimeTicks::Now()))
    637       autofill_manager_->WaitForAsyncFormSubmit();
    638   }
    639 
    640   void FillAutofillFormData(int query_id,
    641                             const FormData& form,
    642                             const FormFieldData& field,
    643                             int unique_id) {
    644     autofill_manager_->FillOrPreviewForm(
    645         AutofillDriver::FORM_DATA_ACTION_FILL, query_id, form, field,
    646         unique_id);
    647   }
    648 
    649   // Calls |autofill_manager_->OnFillAutofillFormData()| with the specified
    650   // input parameters after setting up the expectation that the mock driver's
    651   // |SendFormDataToRenderer()| method will be called and saving the parameters
    652   // of that call into the |response_query_id| and |response_data| output
    653   // parameters.
    654   void FillAutofillFormDataAndSaveResults(int input_query_id,
    655                                           const FormData& input_form,
    656                                           const FormFieldData& input_field,
    657                                           int unique_id,
    658                                           int* response_query_id,
    659                                           FormData* response_data) {
    660     EXPECT_CALL(*autofill_driver_, SendFormDataToRenderer(_, _, _)).
    661         WillOnce((DoAll(testing::SaveArg<0>(response_query_id),
    662                         testing::SaveArg<2>(response_data))));
    663     FillAutofillFormData(input_query_id, input_form, input_field, unique_id);
    664   }
    665 
    666   int PackGUIDs(const GUIDPair& cc_guid, const GUIDPair& profile_guid) const {
    667     return autofill_manager_->PackGUIDs(cc_guid, profile_guid);
    668   }
    669 
    670  protected:
    671   base::MessageLoop message_loop_;
    672   TestAutofillClient autofill_client_;
    673   scoped_ptr<MockAutofillDriver> autofill_driver_;
    674   scoped_ptr<TestAutofillManager> autofill_manager_;
    675   scoped_ptr<TestAutofillExternalDelegate> external_delegate_;
    676   TestPersonalDataManager personal_data_;
    677 };
    678 
    679 class TestFormStructure : public FormStructure {
    680  public:
    681   explicit TestFormStructure(const FormData& form)
    682       : FormStructure(form) {}
    683   virtual ~TestFormStructure() {}
    684 
    685   void SetFieldTypes(const std::vector<ServerFieldType>& heuristic_types,
    686                      const std::vector<ServerFieldType>& server_types) {
    687     ASSERT_EQ(field_count(), heuristic_types.size());
    688     ASSERT_EQ(field_count(), server_types.size());
    689 
    690     for (size_t i = 0; i < field_count(); ++i) {
    691       AutofillField* form_field = field(i);
    692       ASSERT_TRUE(form_field);
    693       form_field->set_heuristic_type(heuristic_types[i]);
    694       form_field->set_server_type(server_types[i]);
    695     }
    696 
    697     UpdateAutofillCount();
    698   }
    699 
    700  private:
    701   DISALLOW_COPY_AND_ASSIGN(TestFormStructure);
    702 };
    703 
    704 // Test that we return all address profile suggestions when all form fields are
    705 // empty.
    706 TEST_F(AutofillManagerTest, GetProfileSuggestionsEmptyValue) {
    707   // Set up our form data.
    708   FormData form;
    709   test::CreateTestAddressFormData(&form);
    710   std::vector<FormData> forms(1, form);
    711   FormsSeen(forms);
    712 
    713   const FormFieldData& field = form.fields[0];
    714   GetAutofillSuggestions(form, field);
    715 
    716   // No suggestions provided, so send an empty vector as the results.
    717   // This triggers the combined message send.
    718   AutocompleteSuggestionsReturned(std::vector<base::string16>());
    719 
    720   // Test that we sent the right values to the external delegate.
    721   base::string16 expected_values[] = {
    722     ASCIIToUTF16("Elvis"),
    723     ASCIIToUTF16("Charles")
    724   };
    725   // Inferred labels include full first relevant field, which in this case is
    726   // the address line 1.
    727   base::string16 expected_labels[] = {
    728     ASCIIToUTF16("3734 Elvis Presley Blvd."),
    729     ASCIIToUTF16("123 Apple St.")
    730   };
    731   base::string16 expected_icons[] = {base::string16(), base::string16()};
    732   int expected_unique_ids[] = {1, 2};
    733   external_delegate_->CheckSuggestions(
    734       kDefaultPageID, arraysize(expected_values), expected_values,
    735       expected_labels, expected_icons, expected_unique_ids);
    736 }
    737 
    738 // Test that we return only matching address profile suggestions when the
    739 // selected form field has been partially filled out.
    740 TEST_F(AutofillManagerTest, GetProfileSuggestionsMatchCharacter) {
    741   // Set up our form data.
    742   FormData form;
    743   test::CreateTestAddressFormData(&form);
    744   std::vector<FormData> forms(1, form);
    745   FormsSeen(forms);
    746 
    747   FormFieldData field;
    748   test::CreateTestFormField("First Name", "firstname", "E", "text",&field);
    749   GetAutofillSuggestions(form, field);
    750 
    751   // No suggestions provided, so send an empty vector as the results.
    752   // This triggers the combined message send.
    753   AutocompleteSuggestionsReturned(std::vector<base::string16>());
    754 
    755   // Test that we sent the right values to the external delegate.
    756   base::string16 expected_values[] = {ASCIIToUTF16("Elvis")};
    757   base::string16 expected_labels[] = {ASCIIToUTF16("3734 Elvis Presley Blvd.")};
    758   base::string16 expected_icons[] = {base::string16()};
    759   int expected_unique_ids[] = {1};
    760   external_delegate_->CheckSuggestions(
    761       kDefaultPageID, arraysize(expected_values), expected_values,
    762       expected_labels, expected_icons, expected_unique_ids);
    763 }
    764 
    765 // Test that we return no suggestions when the form has no relevant fields.
    766 TEST_F(AutofillManagerTest, GetProfileSuggestionsUnknownFields) {
    767   // Set up our form data.
    768   FormData form;
    769   form.name = ASCIIToUTF16("MyForm");
    770   form.origin = GURL("http://myform.com/form.html");
    771   form.action = GURL("http://myform.com/submit.html");
    772   form.user_submitted = true;
    773 
    774   FormFieldData field;
    775   test::CreateTestFormField("Username", "username", "", "text",&field);
    776   form.fields.push_back(field);
    777   test::CreateTestFormField("Password", "password", "", "password",&field);
    778   form.fields.push_back(field);
    779   test::CreateTestFormField("Quest", "quest", "", "quest", &field);
    780   form.fields.push_back(field);
    781   test::CreateTestFormField("Color", "color", "", "text", &field);
    782   form.fields.push_back(field);
    783 
    784   std::vector<FormData> forms(1, form);
    785   FormsSeen(forms);
    786 
    787   GetAutofillSuggestions(form, field);
    788   EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
    789 }
    790 
    791 // Test that we cull duplicate profile suggestions.
    792 TEST_F(AutofillManagerTest, GetProfileSuggestionsWithDuplicates) {
    793   // Set up our form data.
    794   FormData form;
    795   test::CreateTestAddressFormData(&form);
    796   std::vector<FormData> forms(1, form);
    797   FormsSeen(forms);
    798 
    799   // Add a duplicate profile.
    800   AutofillProfile* duplicate_profile =
    801       new AutofillProfile(
    802           *(autofill_manager_->GetProfileWithGUID(
    803               "00000000-0000-0000-0000-000000000001")));
    804   autofill_manager_->AddProfile(duplicate_profile);
    805 
    806   const FormFieldData& field = form.fields[0];
    807   GetAutofillSuggestions(form, field);
    808 
    809   // No suggestions provided, so send an empty vector as the results.
    810   // This triggers the combined message send.
    811   AutocompleteSuggestionsReturned(std::vector<base::string16>());
    812 
    813   // Test that we sent the right values to the external delegate.
    814   base::string16 expected_values[] = {
    815     ASCIIToUTF16("Elvis"),
    816     ASCIIToUTF16("Charles")
    817   };
    818   base::string16 expected_labels[] = {
    819     ASCIIToUTF16("3734 Elvis Presley Blvd."),
    820     ASCIIToUTF16("123 Apple St.")
    821   };
    822   base::string16 expected_icons[] = {base::string16(), base::string16()};
    823   int expected_unique_ids[] = {1, 2};
    824   external_delegate_->CheckSuggestions(
    825       kDefaultPageID, arraysize(expected_values), expected_values,
    826       expected_labels, expected_icons, expected_unique_ids);
    827 }
    828 
    829 // Test that we return no suggestions when autofill is disabled.
    830 TEST_F(AutofillManagerTest, GetProfileSuggestionsAutofillDisabledByUser) {
    831   // Set up our form data.
    832   FormData form;
    833   test::CreateTestAddressFormData(&form);
    834   std::vector<FormData> forms(1, form);
    835   FormsSeen(forms);
    836 
    837   // Disable Autofill.
    838   autofill_manager_->set_autofill_enabled(false);
    839 
    840   const FormFieldData& field = form.fields[0];
    841   GetAutofillSuggestions(form, field);
    842   EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
    843 }
    844 
    845 // Test that we return all credit card profile suggestions when all form fields
    846 // are empty.
    847 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsEmptyValue) {
    848   // Set up our form data.
    849   FormData form;
    850   CreateTestCreditCardFormData(&form, true, false);
    851   std::vector<FormData> forms(1, form);
    852   FormsSeen(forms);
    853 
    854   FormFieldData field = form.fields[1];
    855   GetAutofillSuggestions(form, field);
    856 
    857   // No suggestions provided, so send an empty vector as the results.
    858   // This triggers the combined message send.
    859   AutocompleteSuggestionsReturned(std::vector<base::string16>());
    860 
    861   // Test that we sent the right values to the external delegate.
    862   base::string16 expected_values[] = {
    863     ASCIIToUTF16("************3456"),
    864     ASCIIToUTF16("************8765")
    865   };
    866   base::string16 expected_labels[] = { ASCIIToUTF16("04/12"),
    867                                        ASCIIToUTF16("10/14")};
    868   base::string16 expected_icons[] = {
    869     ASCIIToUTF16(kVisaCard),
    870     ASCIIToUTF16(kMasterCard)
    871   };
    872   int expected_unique_ids[] = {
    873     autofill_manager_->GetPackedCreditCardID(4),
    874     autofill_manager_->GetPackedCreditCardID(5)
    875   };
    876   external_delegate_->CheckSuggestions(
    877       kDefaultPageID, arraysize(expected_values), expected_values,
    878       expected_labels, expected_icons, expected_unique_ids);
    879 }
    880 
    881 // Test that we return only matching credit card profile suggestions when the
    882 // selected form field has been partially filled out.
    883 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsMatchCharacter) {
    884   // Set up our form data.
    885   FormData form;
    886   CreateTestCreditCardFormData(&form, true, false);
    887   std::vector<FormData> forms(1, form);
    888   FormsSeen(forms);
    889 
    890   FormFieldData field;
    891   test::CreateTestFormField("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<base::string16>());
    897 
    898   // Test that we sent the right values to the external delegate.
    899   base::string16 expected_values[] = {ASCIIToUTF16("************3456")};
    900   base::string16 expected_labels[] = {ASCIIToUTF16("04/12")};
    901   base::string16 expected_icons[] = {ASCIIToUTF16(kVisaCard)};
    902   int expected_unique_ids[] = {autofill_manager_->GetPackedCreditCardID(4)};
    903   external_delegate_->CheckSuggestions(
    904       kDefaultPageID, arraysize(expected_values), expected_values,
    905       expected_labels, expected_icons, expected_unique_ids);
    906 }
    907 
    908 // Test that we return credit card profile suggestions when the selected form
    909 // field is not the credit card number field.
    910 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsNonCCNumber) {
    911   // Set up our form data.
    912   FormData form;
    913   CreateTestCreditCardFormData(&form, true, false);
    914   std::vector<FormData> forms(1, form);
    915   FormsSeen(forms);
    916 
    917   const FormFieldData& field = form.fields[0];
    918   GetAutofillSuggestions(form, field);
    919 
    920   // No suggestions provided, so send an empty vector as the results.
    921   // This triggers the combined message send.
    922   AutocompleteSuggestionsReturned(std::vector<base::string16>());
    923 
    924   // Test that we sent the right values to the external delegate.
    925   base::string16 expected_values[] = {
    926     ASCIIToUTF16("Elvis Presley"),
    927     ASCIIToUTF16("Buddy Holly")
    928   };
    929   base::string16 expected_labels[] = { ASCIIToUTF16("*3456"),
    930                                        ASCIIToUTF16("*8765") };
    931   base::string16 expected_icons[] = {
    932     ASCIIToUTF16(kVisaCard),
    933     ASCIIToUTF16(kMasterCard)
    934   };
    935   int expected_unique_ids[] = {
    936     autofill_manager_->GetPackedCreditCardID(4),
    937     autofill_manager_->GetPackedCreditCardID(5)
    938   };
    939   external_delegate_->CheckSuggestions(
    940       kDefaultPageID, arraysize(expected_values), expected_values,
    941       expected_labels, expected_icons, expected_unique_ids);
    942 }
    943 
    944 // Test that we return a warning explaining that credit card profile suggestions
    945 // are unavailable when the form is not https.
    946 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsNonHTTPS) {
    947   // Set up our form data.
    948   FormData form;
    949   CreateTestCreditCardFormData(&form, false, false);
    950   std::vector<FormData> forms(1, form);
    951   FormsSeen(forms);
    952 
    953   const FormFieldData& field = form.fields[0];
    954   GetAutofillSuggestions(form, field);
    955 
    956   // No suggestions provided, so send an empty vector as the results.
    957   // This triggers the combined message send.
    958   AutocompleteSuggestionsReturned(std::vector<base::string16>());
    959 
    960   // Test that we sent the right values to the external delegate.
    961   base::string16 expected_values[] = {
    962     l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION)
    963   };
    964   base::string16 expected_labels[] = {base::string16()};
    965   base::string16 expected_icons[] = {base::string16()};
    966   int expected_unique_ids[] = {-1};
    967   external_delegate_->CheckSuggestions(
    968       kDefaultPageID, arraysize(expected_values), expected_values,
    969       expected_labels, expected_icons, expected_unique_ids);
    970 
    971   // Now add some Autocomplete suggestions. We should show the autocomplete
    972   // suggestions and the warning.
    973   const int kPageID2 = 2;
    974   GetAutofillSuggestions(kPageID2, form, field);
    975 
    976   std::vector<base::string16> suggestions;
    977   suggestions.push_back(ASCIIToUTF16("Jay"));
    978   suggestions.push_back(ASCIIToUTF16("Jason"));
    979   AutocompleteSuggestionsReturned(suggestions);
    980 
    981   base::string16 expected_values2[] = {
    982     l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION),
    983     ASCIIToUTF16("Jay"),
    984     ASCIIToUTF16("Jason")
    985   };
    986   base::string16 expected_labels2[] = { base::string16(), base::string16(),
    987                                         base::string16() };
    988   base::string16 expected_icons2[] = { base::string16(), base::string16(),
    989                                        base::string16() };
    990   int expected_unique_ids2[] = {-1, 0, 0};
    991   external_delegate_->CheckSuggestions(
    992       kPageID2, arraysize(expected_values2), expected_values2,
    993       expected_labels2, expected_icons2, expected_unique_ids2);
    994 
    995   // Clear the test credit cards and try again -- we shouldn't return a warning.
    996   personal_data_.ClearCreditCards();
    997   GetAutofillSuggestions(form, field);
    998   EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
    999 }
   1000 
   1001 // Test that we return all credit card suggestions in the case that two cards
   1002 // have the same obfuscated number.
   1003 TEST_F(AutofillManagerTest, GetCreditCardSuggestionsRepeatedObfuscatedNumber) {
   1004   // Add a credit card with the same obfuscated number as Elvis's.
   1005   // |credit_card| will be owned by the mock PersonalDataManager.
   1006   CreditCard* credit_card = new CreditCard;
   1007   test::SetCreditCardInfo(credit_card, "Elvis Presley",
   1008                           "5231567890123456",  // Mastercard
   1009                           "05", "2012");
   1010   credit_card->set_guid("00000000-0000-0000-0000-000000000007");
   1011   autofill_manager_->AddCreditCard(credit_card);
   1012 
   1013   // Set up our form data.
   1014   FormData form;
   1015   CreateTestCreditCardFormData(&form, true, false);
   1016   std::vector<FormData> forms(1, form);
   1017   FormsSeen(forms);
   1018 
   1019   FormFieldData field = form.fields[1];
   1020   GetAutofillSuggestions(form, field);
   1021 
   1022   // No suggestions provided, so send an empty vector as the results.
   1023   // This triggers the combined message send.
   1024   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1025 
   1026   // Test that we sent the right values to the external delegate.
   1027   base::string16 expected_values[] = {
   1028     ASCIIToUTF16("************3456"),
   1029     ASCIIToUTF16("************8765"),
   1030     ASCIIToUTF16("************3456")
   1031   };
   1032   base::string16 expected_labels[] = {
   1033     ASCIIToUTF16("04/12"),
   1034     ASCIIToUTF16("10/14"),
   1035     ASCIIToUTF16("05/12"),
   1036   };
   1037   base::string16 expected_icons[] = {
   1038     ASCIIToUTF16(kVisaCard),
   1039     ASCIIToUTF16(kMasterCard),
   1040     ASCIIToUTF16(kMasterCard)
   1041   };
   1042   int expected_unique_ids[] = {
   1043     autofill_manager_->GetPackedCreditCardID(4),
   1044     autofill_manager_->GetPackedCreditCardID(5),
   1045     autofill_manager_->GetPackedCreditCardID(7)
   1046   };
   1047   external_delegate_->CheckSuggestions(
   1048       kDefaultPageID, arraysize(expected_values), expected_values,
   1049       expected_labels, expected_icons, expected_unique_ids);
   1050 }
   1051 
   1052 // Test that we return profile and credit card suggestions for combined forms.
   1053 TEST_F(AutofillManagerTest, GetAddressAndCreditCardSuggestions) {
   1054   // Set up our form data.
   1055   FormData form;
   1056   test::CreateTestAddressFormData(&form);
   1057   CreateTestCreditCardFormData(&form, true, false);
   1058   std::vector<FormData> forms(1, form);
   1059   FormsSeen(forms);
   1060 
   1061   FormFieldData field = form.fields[0];
   1062   GetAutofillSuggestions(form, field);
   1063 
   1064   // No suggestions provided, so send an empty vector as the results.
   1065   // This triggers the combined message send.
   1066   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1067 
   1068   // Test that we sent the right address suggestions to the external delegate.
   1069   base::string16 expected_values[] = {
   1070     ASCIIToUTF16("Elvis"),
   1071     ASCIIToUTF16("Charles")
   1072   };
   1073   base::string16 expected_labels[] = {
   1074     ASCIIToUTF16("3734 Elvis Presley Blvd."),
   1075     ASCIIToUTF16("123 Apple St.")
   1076   };
   1077   base::string16 expected_icons[] = {base::string16(), base::string16()};
   1078   int expected_unique_ids[] = {1, 2};
   1079   external_delegate_->CheckSuggestions(
   1080       kDefaultPageID, arraysize(expected_values), expected_values,
   1081       expected_labels, expected_icons, expected_unique_ids);
   1082 
   1083   const int kPageID2 = 2;
   1084   test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field);
   1085   GetAutofillSuggestions(kPageID2, form, field);
   1086 
   1087   // No suggestions provided, so send an empty vector as the results.
   1088   // This triggers the combined message send.
   1089   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1090 
   1091   // Test that we sent the credit card suggestions to the external delegate.
   1092   base::string16 expected_values2[] = {
   1093     ASCIIToUTF16("************3456"),
   1094     ASCIIToUTF16("************8765")
   1095   };
   1096   base::string16 expected_labels2[] = { ASCIIToUTF16("04/12"),
   1097                                         ASCIIToUTF16("10/14")};
   1098   base::string16 expected_icons2[] = {
   1099     ASCIIToUTF16(kVisaCard),
   1100     ASCIIToUTF16(kMasterCard)
   1101   };
   1102   int expected_unique_ids2[] = {
   1103     autofill_manager_->GetPackedCreditCardID(4),
   1104     autofill_manager_->GetPackedCreditCardID(5)
   1105   };
   1106   external_delegate_->CheckSuggestions(
   1107       kPageID2, arraysize(expected_values2), expected_values2,
   1108       expected_labels2, expected_icons2, expected_unique_ids2);
   1109 }
   1110 
   1111 // Test that for non-https forms with both address and credit card fields, we
   1112 // only return address suggestions. Instead of credit card suggestions, we
   1113 // should return a warning explaining that credit card profile suggestions are
   1114 // unavailable when the form is not https.
   1115 TEST_F(AutofillManagerTest, GetAddressAndCreditCardSuggestionsNonHttps) {
   1116   // Set up our form data.
   1117   FormData form;
   1118   test::CreateTestAddressFormData(&form);
   1119   CreateTestCreditCardFormData(&form, false, false);
   1120   std::vector<FormData> forms(1, form);
   1121   FormsSeen(forms);
   1122 
   1123   FormFieldData field = form.fields[0];
   1124   GetAutofillSuggestions(form, field);
   1125 
   1126   // No suggestions provided, so send an empty vector as the results.
   1127   // This triggers the combined message send.
   1128   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1129 
   1130   // Test that we sent the right suggestions to the external delegate.
   1131   base::string16 expected_values[] = {
   1132     ASCIIToUTF16("Elvis"),
   1133     ASCIIToUTF16("Charles")
   1134   };
   1135   base::string16 expected_labels[] = {
   1136     ASCIIToUTF16("3734 Elvis Presley Blvd."),
   1137     ASCIIToUTF16("123 Apple St.")
   1138   };
   1139   base::string16 expected_icons[] = {base::string16(), base::string16()};
   1140   int expected_unique_ids[] = {1, 2};
   1141   external_delegate_->CheckSuggestions(
   1142       kDefaultPageID, arraysize(expected_values), expected_values,
   1143       expected_labels, expected_icons, expected_unique_ids);
   1144 
   1145   test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field);
   1146   const int kPageID2 = 2;
   1147   GetAutofillSuggestions(kPageID2, form, field);
   1148 
   1149   // No suggestions provided, so send an empty vector as the results.
   1150   // This triggers the combined message send.
   1151   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1152 
   1153   // Test that we sent the right values to the external delegate.
   1154   base::string16 expected_values2[] = {
   1155     l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION)
   1156   };
   1157   base::string16 expected_labels2[] = {base::string16()};
   1158   base::string16 expected_icons2[] = {base::string16()};
   1159   int expected_unique_ids2[] = {-1};
   1160   external_delegate_->CheckSuggestions(
   1161       kPageID2, arraysize(expected_values2), expected_values2,
   1162       expected_labels2, expected_icons2, expected_unique_ids2);
   1163 
   1164   // Clear the test credit cards and try again -- we shouldn't return a warning.
   1165   personal_data_.ClearCreditCards();
   1166   GetAutofillSuggestions(form, field);
   1167   EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
   1168 }
   1169 
   1170 // Test that we correctly combine autofill and autocomplete suggestions.
   1171 TEST_F(AutofillManagerTest, GetCombinedAutofillAndAutocompleteSuggestions) {
   1172   // Set up our form data.
   1173   FormData form;
   1174   test::CreateTestAddressFormData(&form);
   1175   std::vector<FormData> forms(1, form);
   1176   FormsSeen(forms);
   1177 
   1178   const FormFieldData& field = form.fields[0];
   1179   GetAutofillSuggestions(form, field);
   1180 
   1181   // Add some Autocomplete suggestions.
   1182   // This triggers the combined message send.
   1183   std::vector<base::string16> suggestions;
   1184   suggestions.push_back(ASCIIToUTF16("Jay"));
   1185   // This suggestion is a duplicate, and should be trimmed.
   1186   suggestions.push_back(ASCIIToUTF16("Elvis"));
   1187   suggestions.push_back(ASCIIToUTF16("Jason"));
   1188   AutocompleteSuggestionsReturned(suggestions);
   1189 
   1190   // Test that we sent the right values to the external delegate.
   1191   base::string16 expected_values[] = {
   1192     ASCIIToUTF16("Elvis"),
   1193     ASCIIToUTF16("Charles"),
   1194     ASCIIToUTF16("Jay"),
   1195     ASCIIToUTF16("Jason")
   1196   };
   1197   base::string16 expected_labels[] = {
   1198     ASCIIToUTF16("3734 Elvis Presley Blvd."),
   1199     ASCIIToUTF16("123 Apple St."),
   1200     base::string16(),
   1201     base::string16()
   1202   };
   1203   base::string16 expected_icons[] = { base::string16(), base::string16(),
   1204                                       base::string16(), base::string16()};
   1205   int expected_unique_ids[] = {1, 2, 0, 0};
   1206   external_delegate_->CheckSuggestions(
   1207       kDefaultPageID, arraysize(expected_values), expected_values,
   1208       expected_labels, expected_icons, expected_unique_ids);
   1209 }
   1210 
   1211 // Test that we return autocomplete-like suggestions when trying to autofill
   1212 // already filled forms.
   1213 TEST_F(AutofillManagerTest, GetFieldSuggestionsWhenFormIsAutofilled) {
   1214   // Set up our form data.
   1215   FormData form;
   1216   test::CreateTestAddressFormData(&form);
   1217   std::vector<FormData> forms(1, form);
   1218   FormsSeen(forms);
   1219 
   1220   // Mark one of the fields as filled.
   1221   form.fields[2].is_autofilled = true;
   1222   const FormFieldData& field = form.fields[0];
   1223   GetAutofillSuggestions(form, field);
   1224 
   1225   // No suggestions provided, so send an empty vector as the results.
   1226   // This triggers the combined message send.
   1227   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1228 
   1229   // Test that we sent the right values to the external delegate.
   1230   base::string16 expected_values[] = {
   1231     ASCIIToUTF16("Elvis"),
   1232     ASCIIToUTF16("Charles")
   1233   };
   1234   base::string16 expected_labels[] = {base::string16(), base::string16()};
   1235   base::string16 expected_icons[] = {base::string16(), base::string16()};
   1236   int expected_unique_ids[] = {1, 2};
   1237   external_delegate_->CheckSuggestions(
   1238       kDefaultPageID, arraysize(expected_values), expected_values,
   1239       expected_labels, expected_icons, expected_unique_ids);
   1240 }
   1241 
   1242 // Test that nothing breaks when there are autocomplete suggestions but no
   1243 // autofill suggestions.
   1244 TEST_F(AutofillManagerTest, GetFieldSuggestionsForAutocompleteOnly) {
   1245   // Set up our form data.
   1246   FormData form;
   1247   test::CreateTestAddressFormData(&form);
   1248   FormFieldData field;
   1249   test::CreateTestFormField("Some Field", "somefield", "", "text", &field);
   1250   form.fields.push_back(field);
   1251   std::vector<FormData> forms(1, form);
   1252   FormsSeen(forms);
   1253 
   1254   GetAutofillSuggestions(form, field);
   1255 
   1256   // Add some Autocomplete suggestions.
   1257   // This triggers the combined message send.
   1258   std::vector<base::string16> suggestions;
   1259   suggestions.push_back(ASCIIToUTF16("one"));
   1260   suggestions.push_back(ASCIIToUTF16("two"));
   1261   AutocompleteSuggestionsReturned(suggestions);
   1262 
   1263   // Test that we sent the right values to the external delegate.
   1264   base::string16 expected_values[] = {
   1265     ASCIIToUTF16("one"),
   1266     ASCIIToUTF16("two")
   1267   };
   1268   base::string16 expected_labels[] = {base::string16(), base::string16()};
   1269   base::string16 expected_icons[] = {base::string16(), base::string16()};
   1270   int expected_unique_ids[] = {0, 0};
   1271   external_delegate_->CheckSuggestions(
   1272       kDefaultPageID, arraysize(expected_values), expected_values,
   1273       expected_labels, expected_icons, expected_unique_ids);
   1274 }
   1275 
   1276 // Test that we do not return duplicate values drawn from multiple profiles when
   1277 // filling an already filled field.
   1278 TEST_F(AutofillManagerTest, GetFieldSuggestionsWithDuplicateValues) {
   1279   // Set up our form data.
   1280   FormData form;
   1281   test::CreateTestAddressFormData(&form);
   1282   std::vector<FormData> forms(1, form);
   1283   FormsSeen(forms);
   1284 
   1285   // |profile| will be owned by the mock PersonalDataManager.
   1286   AutofillProfile* profile = new AutofillProfile;
   1287   test::SetProfileInfo(
   1288       profile, "Elvis", "", "", "", "", "", "", "", "", "", "", "");
   1289   profile->set_guid("00000000-0000-0000-0000-000000000101");
   1290   autofill_manager_->AddProfile(profile);
   1291 
   1292   FormFieldData& field = form.fields[0];
   1293   field.is_autofilled = true;
   1294   field.value = ASCIIToUTF16("Elvis");
   1295   GetAutofillSuggestions(form, field);
   1296 
   1297   // No suggestions provided, so send an empty vector as the results.
   1298   // This triggers the combined message send.
   1299   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1300 
   1301   // Test that we sent the right values to the external delegate.
   1302   base::string16 expected_values[] = { ASCIIToUTF16("Elvis") };
   1303   base::string16 expected_labels[] = { base::string16() };
   1304   base::string16 expected_icons[] = { base::string16() };
   1305   int expected_unique_ids[] = { 1 };
   1306   external_delegate_->CheckSuggestions(
   1307       kDefaultPageID, arraysize(expected_values), expected_values,
   1308       expected_labels, expected_icons, expected_unique_ids);
   1309 }
   1310 
   1311 // Test that a non-default value is suggested for multi-valued profile, on an
   1312 // unfilled form.
   1313 TEST_F(AutofillManagerTest, GetFieldSuggestionsForMultiValuedProfileUnfilled) {
   1314   // Set up our form data.
   1315   FormData form;
   1316   test::CreateTestAddressFormData(&form);
   1317   std::vector<FormData> forms(1, form);
   1318   FormsSeen(forms);
   1319 
   1320   // |profile| will be owned by the mock PersonalDataManager.
   1321   AutofillProfile* profile = new AutofillProfile;
   1322   test::SetProfileInfo(profile, "Elvis", "", "Presley", "me (at) x.com", "",
   1323                        "", "", "", "", "", "", "");
   1324   profile->set_guid("00000000-0000-0000-0000-000000000101");
   1325   std::vector<base::string16> multi_values(2);
   1326   multi_values[0] = ASCIIToUTF16("Elvis");
   1327   multi_values[1] = ASCIIToUTF16("Elena");
   1328   profile->SetRawMultiInfo(NAME_FIRST, multi_values);
   1329   multi_values[0] = ASCIIToUTF16("Presley");
   1330   multi_values[1] = ASCIIToUTF16("Love");
   1331   profile->SetRawMultiInfo(NAME_LAST, multi_values);
   1332   personal_data_.ClearAutofillProfiles();
   1333   autofill_manager_->AddProfile(profile);
   1334 
   1335   {
   1336     // Get the first name field.
   1337     // Start out with "E", hoping for either "Elvis" or "Elena.
   1338     FormFieldData& field = form.fields[0];
   1339     field.value = ASCIIToUTF16("E");
   1340     field.is_autofilled = false;
   1341     GetAutofillSuggestions(form, field);
   1342 
   1343     // Trigger the |Send|.
   1344     AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1345 
   1346     // Test that we sent the right values to the external delegate.
   1347     base::string16 expected_values[] = {
   1348       ASCIIToUTF16("Elvis"),
   1349       ASCIIToUTF16("Elena")
   1350     };
   1351     base::string16 expected_labels[] = {
   1352       ASCIIToUTF16("me (at) x.com"),
   1353       ASCIIToUTF16("me (at) x.com")
   1354     };
   1355     base::string16 expected_icons[] = { base::string16(), base::string16() };
   1356     int expected_unique_ids[] = { 1, 2 };
   1357     external_delegate_->CheckSuggestions(
   1358         kDefaultPageID, arraysize(expected_values), expected_values,
   1359         expected_labels, expected_icons, expected_unique_ids);
   1360   }
   1361 
   1362   {
   1363     // Get the first name field.
   1364     // This time, start out with "Ele", hoping for "Elena".
   1365     FormFieldData& field = form.fields[0];
   1366     field.value = ASCIIToUTF16("Ele");
   1367     field.is_autofilled = false;
   1368     GetAutofillSuggestions(form, field);
   1369 
   1370     // Trigger the |Send|.
   1371     AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1372 
   1373     // Test that we sent the right values to the external delegate.
   1374     base::string16 expected_values[] = { ASCIIToUTF16("Elena") };
   1375     base::string16 expected_labels[] = { ASCIIToUTF16("me (at) x.com") };
   1376     base::string16 expected_icons[] = { base::string16() };
   1377     int expected_unique_ids[] = { 2 };
   1378     external_delegate_->CheckSuggestions(
   1379         kDefaultPageID, arraysize(expected_values), expected_values,
   1380         expected_labels, expected_icons, expected_unique_ids);
   1381   }
   1382 }
   1383 
   1384 // Test that all values are suggested for multi-valued profile, on a filled
   1385 // form.  This is the per-field "override" case.
   1386 TEST_F(AutofillManagerTest, GetFieldSuggestionsForMultiValuedProfileFilled) {
   1387   // Set up our form data.
   1388   FormData form;
   1389   test::CreateTestAddressFormData(&form);
   1390   std::vector<FormData> forms(1, form);
   1391   FormsSeen(forms);
   1392 
   1393   // |profile| will be owned by the mock PersonalDataManager.
   1394   AutofillProfile* profile = new AutofillProfile;
   1395   profile->set_guid("00000000-0000-0000-0000-000000000102");
   1396   std::vector<base::string16> multi_values(3);
   1397   multi_values[0] = ASCIIToUTF16("Travis");
   1398   multi_values[1] = ASCIIToUTF16("Cynthia");
   1399   multi_values[2] = ASCIIToUTF16("Zac");
   1400   profile->SetRawMultiInfo(NAME_FIRST, multi_values);
   1401   multi_values[0] = ASCIIToUTF16("Smith");
   1402   multi_values[1] = ASCIIToUTF16("Love");
   1403   multi_values[2] = ASCIIToUTF16("Mango");
   1404   profile->SetRawMultiInfo(NAME_LAST, multi_values);
   1405   autofill_manager_->AddProfile(profile);
   1406 
   1407   // Get the first name field.  And start out with "Travis", hoping for all the
   1408   // multi-valued variants as suggestions.
   1409   FormFieldData& field = form.fields[0];
   1410   field.value = ASCIIToUTF16("Travis");
   1411   field.is_autofilled = true;
   1412   GetAutofillSuggestions(form, field);
   1413 
   1414   // Trigger the |Send|.
   1415   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1416 
   1417   // Test that we sent the right values to the external delegate.
   1418   base::string16 expected_values[] = {
   1419     ASCIIToUTF16("Travis"),
   1420     ASCIIToUTF16("Cynthia"),
   1421     ASCIIToUTF16("Zac")
   1422   };
   1423   base::string16 expected_labels[] = { base::string16(), base::string16(),
   1424                                        base::string16() };
   1425   base::string16 expected_icons[] = { base::string16(), base::string16(),
   1426                                       base::string16() };
   1427   int expected_unique_ids[] = { 1, 2, 3 };
   1428   external_delegate_->CheckSuggestions(
   1429       kDefaultPageID, arraysize(expected_values), expected_values,
   1430       expected_labels, expected_icons, expected_unique_ids);
   1431 }
   1432 
   1433 TEST_F(AutofillManagerTest, GetProfileSuggestionsFancyPhone) {
   1434   // Set up our form data.
   1435   FormData form;
   1436   test::CreateTestAddressFormData(&form);
   1437   std::vector<FormData> forms(1, form);
   1438   FormsSeen(forms);
   1439 
   1440   AutofillProfile* profile = new AutofillProfile;
   1441   profile->set_guid("00000000-0000-0000-0000-000000000103");
   1442   profile->SetInfo(AutofillType(NAME_FULL), ASCIIToUTF16("Natty Bumppo"),
   1443                    "en-US");
   1444   profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER,
   1445                       ASCIIToUTF16("1800PRAIRIE"));
   1446   autofill_manager_->AddProfile(profile);
   1447 
   1448   const FormFieldData& field = form.fields[9];
   1449   GetAutofillSuggestions(form, field);
   1450 
   1451   // No suggestions provided, so send an empty vector as the results.
   1452   // This triggers the combined message send.
   1453   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1454 
   1455   // Test that we sent the right values to the external delegate.
   1456   base::string16 expected_values[] = {
   1457     ASCIIToUTF16("12345678901"),
   1458     ASCIIToUTF16("23456789012"),
   1459     ASCIIToUTF16("18007724743"),  // 1800PRAIRIE
   1460   };
   1461   // Inferred labels include full first relevant field, which in this case is
   1462   // the address line 1.
   1463   base::string16 expected_labels[] = {
   1464     ASCIIToUTF16("Elvis Aaron Presley"),
   1465     ASCIIToUTF16("Charles Hardin Holley"),
   1466     ASCIIToUTF16("Natty Bumppo"),
   1467   };
   1468   base::string16 expected_icons[] = { base::string16(), base::string16(),
   1469                                       base::string16()};
   1470   int expected_unique_ids[] = {1, 2, 3};
   1471   external_delegate_->CheckSuggestions(
   1472       kDefaultPageID, arraysize(expected_values), expected_values,
   1473       expected_labels, expected_icons, expected_unique_ids);
   1474 }
   1475 
   1476 TEST_F(AutofillManagerTest, GetProfileSuggestionsForPhonePrefixOrSuffix) {
   1477   // Set up our form data.
   1478   FormData form;
   1479   form.name = ASCIIToUTF16("MyForm");
   1480   form.origin = GURL("http://myform.com/form.html");
   1481   form.action = GURL("http://myform.com/submit.html");
   1482   form.user_submitted = true;
   1483 
   1484   struct {
   1485     const char* const label;
   1486     const char* const name;
   1487     size_t max_length;
   1488     const char* const autocomplete_attribute;
   1489   } test_fields[] = {{"country code", "country_code", 1, "tel-country-code"},
   1490                      {"area code", "area_code", 3, "tel-area-code"},
   1491                      {"phone", "phone_prefix", 3, "tel-local-prefix"},
   1492                      {"-", "phone_suffix", 4, "tel-local-suffix"},
   1493                      {"Phone Extension", "ext", 5, "tel-extension"}};
   1494 
   1495   FormFieldData field;
   1496   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_fields); ++i) {
   1497     test::CreateTestFormField(
   1498         test_fields[i].label, test_fields[i].name, "", "text", &field);
   1499     field.max_length = test_fields[i].max_length;
   1500     field.autocomplete_attribute = std::string();
   1501     form.fields.push_back(field);
   1502   }
   1503 
   1504   std::vector<FormData> forms(1, form);
   1505   FormsSeen(forms);
   1506 
   1507   AutofillProfile* profile = new AutofillProfile;
   1508   profile->set_guid("00000000-0000-0000-0000-000000000104");
   1509   std::vector<base::string16> multi_values(2);
   1510   multi_values[0] = ASCIIToUTF16("1800FLOWERS");
   1511   multi_values[1] = ASCIIToUTF16("14158889999");
   1512 
   1513   profile->SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, multi_values);
   1514   personal_data_.ClearAutofillProfiles();
   1515   autofill_manager_->AddProfile(profile);
   1516 
   1517   const FormFieldData& phone_prefix = form.fields[2];
   1518   GetAutofillSuggestions(form, phone_prefix);
   1519   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1520   // Test that we sent the right prefix values to the external delegate.
   1521   base::string16 expected_prefix_values[] = {ASCIIToUTF16("356"),
   1522                                              ASCIIToUTF16("888")};
   1523   base::string16 expected_prefix_labels[] = {ASCIIToUTF16("1"),
   1524                                              ASCIIToUTF16("1")};
   1525   base::string16 expected_prefix_icons[] = {base::string16(), base::string16()};
   1526   int expected_unique_ids[] = {1, 2};
   1527   external_delegate_->CheckSuggestions(kDefaultPageID,
   1528                                        arraysize(expected_prefix_values),
   1529                                        expected_prefix_values,
   1530                                        expected_prefix_labels,
   1531                                        expected_prefix_icons,
   1532                                        expected_unique_ids);
   1533 
   1534   const FormFieldData& phone_suffix = form.fields[3];
   1535   GetAutofillSuggestions(form, phone_suffix);
   1536   AutocompleteSuggestionsReturned(std::vector<base::string16>());
   1537   // Test that we sent the right suffix values to the external delegate.
   1538   base::string16 expected_suffix_values[] = {ASCIIToUTF16("9377"),
   1539                                              ASCIIToUTF16("9999")};
   1540   base::string16 expected_suffix_labels[] = {ASCIIToUTF16("1"),
   1541                                              ASCIIToUTF16("1")};
   1542   base::string16 expected_suffix_icons[] = {base::string16(), base::string16()};
   1543   external_delegate_->CheckSuggestions(kDefaultPageID,
   1544                                        arraysize(expected_suffix_values),
   1545                                        expected_suffix_values,
   1546                                        expected_suffix_labels,
   1547                                        expected_suffix_icons,
   1548                                        expected_unique_ids);
   1549 }
   1550 
   1551 // Test that we correctly fill an address form.
   1552 TEST_F(AutofillManagerTest, FillAddressForm) {
   1553   // Set up our form data.
   1554   FormData form;
   1555   test::CreateTestAddressFormData(&form);
   1556   std::vector<FormData> forms(1, form);
   1557   FormsSeen(forms);
   1558 
   1559   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   1560   GUIDPair empty(std::string(), 0);
   1561   int response_page_id = 0;
   1562   FormData response_data;
   1563   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   1564       PackGUIDs(empty, guid), &response_page_id, &response_data);
   1565   ExpectFilledAddressFormElvis(
   1566       response_page_id, response_data, kDefaultPageID, false);
   1567 }
   1568 
   1569 // Test that we correctly fill an address form from an auxiliary profile.
   1570 TEST_F(AutofillManagerTest, FillAddressFormFromAuxiliaryProfile) {
   1571   personal_data_.ClearAutofillProfiles();
   1572 #if defined(OS_MACOSX) && !defined(OS_IOS)
   1573   autofill_client_.GetPrefs()->SetBoolean(
   1574       ::autofill::prefs::kAutofillUseMacAddressBook, true);
   1575 #else
   1576   autofill_client_.GetPrefs()->SetBoolean(
   1577       ::autofill::prefs::kAutofillAuxiliaryProfilesEnabled, true);
   1578 #endif  // defined(OS_MACOSX) && !defined(OS_IOS)
   1579 
   1580   personal_data_.CreateTestAuxiliaryProfiles();
   1581 
   1582   // Set up our form data.
   1583   FormData form;
   1584   test::CreateTestAddressFormData(&form);
   1585   std::vector<FormData> forms(1, form);
   1586   FormsSeen(forms);
   1587 
   1588   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   1589   GUIDPair empty(std::string(), 0);
   1590   int response_page_id = 0;
   1591   FormData response_data;
   1592   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   1593       PackGUIDs(empty, guid), &response_page_id, &response_data);
   1594   ExpectFilledAddressFormElvis(
   1595       response_page_id, response_data, kDefaultPageID, false);
   1596 }
   1597 
   1598 // Test that we correctly fill a credit card form.
   1599 TEST_F(AutofillManagerTest, FillCreditCardForm) {
   1600   // Set up our form data.
   1601   FormData form;
   1602   CreateTestCreditCardFormData(&form, true, false);
   1603   std::vector<FormData> forms(1, form);
   1604   FormsSeen(forms);
   1605 
   1606   GUIDPair guid("00000000-0000-0000-0000-000000000004", 0);
   1607   GUIDPair empty(std::string(), 0);
   1608   int response_page_id = 0;
   1609   FormData response_data;
   1610   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
   1611       PackGUIDs(guid, empty), &response_page_id, &response_data);
   1612   ExpectFilledCreditCardFormElvis(
   1613       response_page_id, response_data, kDefaultPageID, false);
   1614 }
   1615 
   1616 // Test that we correctly fill a credit card form with month input type.
   1617 // 1. year empty, month empty
   1618 TEST_F(AutofillManagerTest, FillCreditCardFormNoYearNoMonth) {
   1619   // Same as the SetUp(), but generate 4 credit cards with year month
   1620   // combination.
   1621   personal_data_.CreateTestCreditCardsYearAndMonth("", "");
   1622   // Set up our form data.
   1623   FormData form;
   1624   CreateTestCreditCardFormData(&form, true, true);
   1625   std::vector<FormData> forms(1, form);
   1626   FormsSeen(forms);
   1627 
   1628   GUIDPair guid("00000000-0000-0000-0000-000000000007", 0);
   1629   GUIDPair empty(std::string(), 0);
   1630   int response_page_id = 0;
   1631   FormData response_data;
   1632   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
   1633       PackGUIDs(guid, empty), &response_page_id, &response_data);
   1634   ExpectFilledCreditCardYearMonthWithYearMonth(response_page_id, response_data,
   1635       kDefaultPageID, false, "", "");
   1636 }
   1637 
   1638 
   1639 // Test that we correctly fill a credit card form with month input type.
   1640 // 2. year empty, month non-empty
   1641 TEST_F(AutofillManagerTest, FillCreditCardFormNoYearMonth) {
   1642   // Same as the SetUp(), but generate 4 credit cards with year month
   1643   // combination.
   1644   personal_data_.CreateTestCreditCardsYearAndMonth("", "04");
   1645   // Set up our form data.
   1646   FormData form;
   1647   CreateTestCreditCardFormData(&form, true, true);
   1648   std::vector<FormData> forms(1, form);
   1649   FormsSeen(forms);
   1650 
   1651   GUIDPair guid("00000000-0000-0000-0000-000000000007", 0);
   1652   GUIDPair empty(std::string(), 0);
   1653   int response_page_id = 0;
   1654   FormData response_data;
   1655   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
   1656       PackGUIDs(guid, empty), &response_page_id, &response_data);
   1657   ExpectFilledCreditCardYearMonthWithYearMonth(response_page_id, response_data,
   1658       kDefaultPageID, false, "", "04");
   1659 }
   1660 
   1661 // Test that we correctly fill a credit card form with month input type.
   1662 // 3. year non-empty, month empty
   1663 TEST_F(AutofillManagerTest, FillCreditCardFormYearNoMonth) {
   1664   // Same as the SetUp(), but generate 4 credit cards with year month
   1665   // combination.
   1666   personal_data_.CreateTestCreditCardsYearAndMonth("2012", "");
   1667   // Set up our form data.
   1668   FormData form;
   1669   CreateTestCreditCardFormData(&form, true, true);
   1670   std::vector<FormData> forms(1, form);
   1671   FormsSeen(forms);
   1672 
   1673   GUIDPair guid("00000000-0000-0000-0000-000000000007", 0);
   1674   GUIDPair empty(std::string(), 0);
   1675   int response_page_id = 0;
   1676   FormData response_data;
   1677   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
   1678       PackGUIDs(guid, empty), &response_page_id, &response_data);
   1679   ExpectFilledCreditCardYearMonthWithYearMonth(response_page_id, response_data,
   1680       kDefaultPageID, false, "2012", "");
   1681 }
   1682 
   1683 // Test that we correctly fill a credit card form with month input type.
   1684 // 4. year non-empty, month empty
   1685 TEST_F(AutofillManagerTest, FillCreditCardFormYearMonth) {
   1686   // Same as the SetUp(), but generate 4 credit cards with year month
   1687   // combination.
   1688   personal_data_.ClearCreditCards();
   1689   personal_data_.CreateTestCreditCardsYearAndMonth("2012", "04");
   1690   // Set up our form data.
   1691   FormData form;
   1692   CreateTestCreditCardFormData(&form, true, true);
   1693   std::vector<FormData> forms(1, form);
   1694   FormsSeen(forms);
   1695 
   1696   GUIDPair guid("00000000-0000-0000-0000-000000000007", 0);
   1697   GUIDPair empty(std::string(), 0);
   1698   int response_page_id = 0;
   1699   FormData response_data;
   1700   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
   1701       PackGUIDs(guid, empty), &response_page_id, &response_data);
   1702   ExpectFilledCreditCardYearMonthWithYearMonth(response_page_id, response_data,
   1703       kDefaultPageID, false, "2012", "04");
   1704 }
   1705 
   1706 // Test that we correctly fill a combined address and credit card form.
   1707 TEST_F(AutofillManagerTest, FillAddressAndCreditCardForm) {
   1708   // Set up our form data.
   1709   FormData form;
   1710   test::CreateTestAddressFormData(&form);
   1711   CreateTestCreditCardFormData(&form, true, false);
   1712   std::vector<FormData> forms(1, form);
   1713   FormsSeen(forms);
   1714 
   1715   // First fill the address data.
   1716   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   1717   GUIDPair empty(std::string(), 0);
   1718   int response_page_id = 0;
   1719   FormData response_data;
   1720   {
   1721     SCOPED_TRACE("Address");
   1722     FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   1723         PackGUIDs(empty, guid), &response_page_id, &response_data);
   1724     ExpectFilledAddressFormElvis(
   1725         response_page_id, response_data, kDefaultPageID, true);
   1726   }
   1727 
   1728   // Now fill the credit card data.
   1729   const int kPageID2 = 2;
   1730   GUIDPair guid2("00000000-0000-0000-0000-000000000004", 0);
   1731   response_page_id = 0;
   1732   {
   1733     FillAutofillFormDataAndSaveResults(kPageID2, form, form.fields.back(),
   1734         PackGUIDs(guid2, empty), &response_page_id, &response_data);
   1735     SCOPED_TRACE("Credit card");
   1736     ExpectFilledCreditCardFormElvis(
   1737         response_page_id, response_data, kPageID2, true);
   1738   }
   1739 }
   1740 
   1741 // Test that we correctly fill a form that has multiple logical sections, e.g.
   1742 // both a billing and a shipping address.
   1743 TEST_F(AutofillManagerTest, FillFormWithMultipleSections) {
   1744   // Set up our form data.
   1745   FormData form;
   1746   test::CreateTestAddressFormData(&form);
   1747   const size_t kAddressFormSize = form.fields.size();
   1748   test::CreateTestAddressFormData(&form);
   1749   for (size_t i = kAddressFormSize; i < form.fields.size(); ++i) {
   1750     // Make sure the fields have distinct names.
   1751     form.fields[i].name = form.fields[i].name + ASCIIToUTF16("_");
   1752   }
   1753   std::vector<FormData> forms(1, form);
   1754   FormsSeen(forms);
   1755 
   1756   // Fill the first section.
   1757   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   1758   GUIDPair empty(std::string(), 0);
   1759   int response_page_id = 0;
   1760   FormData response_data;
   1761   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   1762       PackGUIDs(empty, guid), &response_page_id, &response_data);
   1763   {
   1764     SCOPED_TRACE("Address 1");
   1765     // The second address section should be empty.
   1766     ASSERT_EQ(response_data.fields.size(), 2*kAddressFormSize);
   1767     for (size_t i = kAddressFormSize; i < form.fields.size(); ++i) {
   1768       EXPECT_EQ(base::string16(), response_data.fields[i].value);
   1769     }
   1770 
   1771     // The first address section should be filled with Elvis's data.
   1772     response_data.fields.resize(kAddressFormSize);
   1773     ExpectFilledAddressFormElvis(
   1774         response_page_id, response_data, kDefaultPageID, false);
   1775   }
   1776 
   1777   // Fill the second section, with the initiating field somewhere in the middle
   1778   // of the section.
   1779   const int kPageID2 = 2;
   1780   GUIDPair guid2("00000000-0000-0000-0000-000000000001", 0);
   1781   ASSERT_LT(9U, kAddressFormSize);
   1782   response_page_id = 0;
   1783   FillAutofillFormDataAndSaveResults(
   1784       kPageID2, form, form.fields[kAddressFormSize + 9],
   1785       PackGUIDs(empty, guid2), &response_page_id, &response_data);
   1786   {
   1787     SCOPED_TRACE("Address 2");
   1788     ASSERT_EQ(response_data.fields.size(), form.fields.size());
   1789 
   1790     // The first address section should be empty.
   1791     ASSERT_EQ(response_data.fields.size(), 2*kAddressFormSize);
   1792     for (size_t i = 0; i < kAddressFormSize; ++i) {
   1793       EXPECT_EQ(base::string16(), response_data.fields[i].value);
   1794     }
   1795 
   1796     // The second address section should be filled with Elvis's data.
   1797     FormData secondSection = response_data;
   1798     secondSection.fields.erase(secondSection.fields.begin(),
   1799                                secondSection.fields.begin() + kAddressFormSize);
   1800     for (size_t i = 0; i < kAddressFormSize; ++i) {
   1801       // Restore the expected field names.
   1802       base::string16 name = secondSection.fields[i].name;
   1803       base::string16 original_name = name.substr(0, name.size() - 1);
   1804       secondSection.fields[i].name = original_name;
   1805     }
   1806     ExpectFilledAddressFormElvis(
   1807         response_page_id, secondSection, kPageID2, false);
   1808   }
   1809 }
   1810 
   1811 // Test that we correctly fill a form that has author-specified sections, which
   1812 // might not match our expected section breakdown.
   1813 TEST_F(AutofillManagerTest, FillFormWithAuthorSpecifiedSections) {
   1814   // Create a form with a billing section and an unnamed section, interleaved.
   1815   // The billing section includes both address and credit card fields.
   1816   FormData form;
   1817   form.name = ASCIIToUTF16("MyForm");
   1818   form.origin = GURL("https://myform.com/form.html");
   1819   form.action = GURL("https://myform.com/submit.html");
   1820   form.user_submitted = true;
   1821 
   1822   FormFieldData field;
   1823 
   1824   test::CreateTestFormField("", "country", "", "text", &field);
   1825   field.autocomplete_attribute = "section-billing country";
   1826   form.fields.push_back(field);
   1827 
   1828   test::CreateTestFormField("", "firstname", "", "text", &field);
   1829   field.autocomplete_attribute = "given-name";
   1830   form.fields.push_back(field);
   1831 
   1832   test::CreateTestFormField("", "lastname", "", "text", &field);
   1833   field.autocomplete_attribute = "family-name";
   1834   form.fields.push_back(field);
   1835 
   1836   test::CreateTestFormField("", "address", "", "text", &field);
   1837   field.autocomplete_attribute = "section-billing address-line1";
   1838   form.fields.push_back(field);
   1839 
   1840   test::CreateTestFormField("", "city", "", "text", &field);
   1841   field.autocomplete_attribute = "section-billing locality";
   1842   form.fields.push_back(field);
   1843 
   1844   test::CreateTestFormField("", "state", "", "text", &field);
   1845   field.autocomplete_attribute = "section-billing region";
   1846   form.fields.push_back(field);
   1847 
   1848   test::CreateTestFormField("", "zip", "", "text", &field);
   1849   field.autocomplete_attribute = "section-billing postal-code";
   1850   form.fields.push_back(field);
   1851 
   1852   test::CreateTestFormField("", "ccname", "", "text", &field);
   1853   field.autocomplete_attribute = "section-billing cc-name";
   1854   form.fields.push_back(field);
   1855 
   1856   test::CreateTestFormField("", "ccnumber", "", "text", &field);
   1857   field.autocomplete_attribute = "section-billing cc-number";
   1858   form.fields.push_back(field);
   1859 
   1860   test::CreateTestFormField("", "ccexp", "", "text", &field);
   1861   field.autocomplete_attribute = "section-billing cc-exp";
   1862   form.fields.push_back(field);
   1863 
   1864   test::CreateTestFormField("", "email", "", "text", &field);
   1865   field.autocomplete_attribute = "email";
   1866   form.fields.push_back(field);
   1867 
   1868   std::vector<FormData> forms(1, form);
   1869   FormsSeen(forms);
   1870 
   1871   // Fill the unnamed section.
   1872   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   1873   GUIDPair empty(std::string(), 0);
   1874   int response_page_id = 0;
   1875   FormData response_data;
   1876   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[1],
   1877       PackGUIDs(empty, guid), &response_page_id, &response_data);
   1878   {
   1879     SCOPED_TRACE("Unnamed section");
   1880     EXPECT_EQ(kDefaultPageID, response_page_id);
   1881     EXPECT_EQ(ASCIIToUTF16("MyForm"), response_data.name);
   1882     EXPECT_EQ(GURL("https://myform.com/form.html"), response_data.origin);
   1883     EXPECT_EQ(GURL("https://myform.com/submit.html"), response_data.action);
   1884     EXPECT_TRUE(response_data.user_submitted);
   1885     ASSERT_EQ(11U, response_data.fields.size());
   1886 
   1887     ExpectFilledField("", "country", "", "text", response_data.fields[0]);
   1888     ExpectFilledField("", "firstname", "Elvis", "text",
   1889                       response_data.fields[1]);
   1890     ExpectFilledField("", "lastname", "Presley", "text",
   1891                       response_data.fields[2]);
   1892     ExpectFilledField("", "address", "", "text", response_data.fields[3]);
   1893     ExpectFilledField("", "city", "", "text", response_data.fields[4]);
   1894     ExpectFilledField("", "state", "", "text", response_data.fields[5]);
   1895     ExpectFilledField("", "zip", "", "text", response_data.fields[6]);
   1896     ExpectFilledField("", "ccname", "", "text", response_data.fields[7]);
   1897     ExpectFilledField("", "ccnumber", "", "text", response_data.fields[8]);
   1898     ExpectFilledField("", "ccexp", "", "text", response_data.fields[9]);
   1899     ExpectFilledField("", "email", "theking (at) gmail.com", "text",
   1900                       response_data.fields[10]);
   1901   }
   1902 
   1903   // Fill the address portion of the billing section.
   1904   const int kPageID2 = 2;
   1905   GUIDPair guid2("00000000-0000-0000-0000-000000000001", 0);
   1906   response_page_id = 0;
   1907   FillAutofillFormDataAndSaveResults(kPageID2, form, form.fields[0],
   1908       PackGUIDs(empty, guid2), &response_page_id, &response_data);
   1909   {
   1910     SCOPED_TRACE("Billing address");
   1911     EXPECT_EQ(kPageID2, response_page_id);
   1912     EXPECT_EQ(ASCIIToUTF16("MyForm"), response_data.name);
   1913     EXPECT_EQ(GURL("https://myform.com/form.html"), response_data.origin);
   1914     EXPECT_EQ(GURL("https://myform.com/submit.html"), response_data.action);
   1915     EXPECT_TRUE(response_data.user_submitted);
   1916     ASSERT_EQ(11U, response_data.fields.size());
   1917 
   1918     ExpectFilledField("", "country", "US", "text",
   1919                       response_data.fields[0]);
   1920     ExpectFilledField("", "firstname", "", "text", response_data.fields[1]);
   1921     ExpectFilledField("", "lastname", "", "text", response_data.fields[2]);
   1922     ExpectFilledField("", "address", "3734 Elvis Presley Blvd.", "text",
   1923                       response_data.fields[3]);
   1924     ExpectFilledField("", "city", "Memphis", "text", response_data.fields[4]);
   1925     ExpectFilledField("", "state", "Tennessee", "text",
   1926                       response_data.fields[5]);
   1927     ExpectFilledField("", "zip", "38116", "text", response_data.fields[6]);
   1928     ExpectFilledField("", "ccname", "", "text", response_data.fields[7]);
   1929     ExpectFilledField("", "ccnumber", "", "text", response_data.fields[8]);
   1930     ExpectFilledField("", "ccexp", "", "text", response_data.fields[9]);
   1931     ExpectFilledField("", "email", "", "text", response_data.fields[10]);
   1932   }
   1933 
   1934   // Fill the credit card portion of the billing section.
   1935   const int kPageID3 = 3;
   1936   GUIDPair guid3("00000000-0000-0000-0000-000000000004", 0);
   1937   response_page_id = 0;
   1938   FillAutofillFormDataAndSaveResults(
   1939       kPageID3, form, form.fields[form.fields.size() - 2],
   1940       PackGUIDs(guid3, empty), &response_page_id, &response_data);
   1941   {
   1942     SCOPED_TRACE("Credit card");
   1943     EXPECT_EQ(kPageID3, response_page_id);
   1944     EXPECT_EQ(ASCIIToUTF16("MyForm"), response_data.name);
   1945     EXPECT_EQ(GURL("https://myform.com/form.html"), response_data.origin);
   1946     EXPECT_EQ(GURL("https://myform.com/submit.html"), response_data.action);
   1947     EXPECT_TRUE(response_data.user_submitted);
   1948     ASSERT_EQ(11U, response_data.fields.size());
   1949 
   1950     ExpectFilledField("", "country", "", "text", response_data.fields[0]);
   1951     ExpectFilledField("", "firstname", "", "text", response_data.fields[1]);
   1952     ExpectFilledField("", "lastname", "", "text", response_data.fields[2]);
   1953     ExpectFilledField("", "address", "", "text", response_data.fields[3]);
   1954     ExpectFilledField("", "city", "", "text", response_data.fields[4]);
   1955     ExpectFilledField("", "state", "", "text", response_data.fields[5]);
   1956     ExpectFilledField("", "zip", "", "text", response_data.fields[6]);
   1957     ExpectFilledField("", "ccname", "Elvis Presley", "text",
   1958                       response_data.fields[7]);
   1959     ExpectFilledField("", "ccnumber", "4234567890123456", "text",
   1960                       response_data.fields[8]);
   1961     ExpectFilledField("", "ccexp", "04/2012", "text", response_data.fields[9]);
   1962     ExpectFilledField("", "email", "", "text", response_data.fields[10]);
   1963   }
   1964 }
   1965 
   1966 // Test that we correctly fill a form that has a single logical section with
   1967 // multiple email address fields.
   1968 TEST_F(AutofillManagerTest, FillFormWithMultipleEmails) {
   1969   // Set up our form data.
   1970   FormData form;
   1971   test::CreateTestAddressFormData(&form);
   1972   FormFieldData field;
   1973   test::CreateTestFormField("Confirm email", "email2", "", "text", &field);
   1974   form.fields.push_back(field);
   1975 
   1976   std::vector<FormData> forms(1, form);
   1977   FormsSeen(forms);
   1978 
   1979   // Fill the form.
   1980   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   1981   GUIDPair empty(std::string(), 0);
   1982   int response_page_id = 0;
   1983   FormData response_data;
   1984   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   1985       PackGUIDs(empty, guid), &response_page_id, &response_data);
   1986 
   1987   // The second email address should be filled.
   1988   EXPECT_EQ(ASCIIToUTF16("theking (at) gmail.com"),
   1989             response_data.fields.back().value);
   1990 
   1991   // The remainder of the form should be filled as usual.
   1992   response_data.fields.pop_back();
   1993   ExpectFilledAddressFormElvis(
   1994       response_page_id, response_data, kDefaultPageID, false);
   1995 }
   1996 
   1997 // Test that we correctly fill a previously auto-filled form.
   1998 TEST_F(AutofillManagerTest, FillAutofilledForm) {
   1999   // Set up our form data.
   2000   FormData form;
   2001   test::CreateTestAddressFormData(&form);
   2002   // Mark one of the address fields as autofilled.
   2003   form.fields[4].is_autofilled = true;
   2004   CreateTestCreditCardFormData(&form, true, false);
   2005   std::vector<FormData> forms(1, form);
   2006   FormsSeen(forms);
   2007 
   2008   // First fill the address data.
   2009   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   2010   GUIDPair empty(std::string(), 0);
   2011   int response_page_id = 0;
   2012   FormData response_data;
   2013   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
   2014       PackGUIDs(empty, guid), &response_page_id, &response_data);
   2015   {
   2016     SCOPED_TRACE("Address");
   2017     ExpectFilledForm(response_page_id, response_data, kDefaultPageID,
   2018                      "Elvis", "", "", "", "", "", "", "", "", "", "", "", "",
   2019                      "", "", true, true, false);
   2020   }
   2021 
   2022   // Now fill the credit card data.
   2023   const int kPageID2 = 2;
   2024   GUIDPair guid2("00000000-0000-0000-0000-000000000004", 0);
   2025   response_page_id = 0;
   2026   FillAutofillFormDataAndSaveResults(kPageID2, form, form.fields.back(),
   2027       PackGUIDs(guid2, empty), &response_page_id, &response_data);
   2028   {
   2029     SCOPED_TRACE("Credit card 1");
   2030     ExpectFilledCreditCardFormElvis(
   2031         response_page_id, response_data, kPageID2, true);
   2032   }
   2033 
   2034   // Now set the credit card fields to also be auto-filled, and try again to
   2035   // fill the credit card data
   2036   for (std::vector<FormFieldData>::iterator iter = form.fields.begin();
   2037        iter != form.fields.end();
   2038        ++iter) {
   2039     iter->is_autofilled = true;
   2040   }
   2041 
   2042   const int kPageID3 = 3;
   2043   response_page_id = 0;
   2044   FillAutofillFormDataAndSaveResults(kPageID3, form, *form.fields.rbegin(),
   2045       PackGUIDs(guid2, empty), &response_page_id, &response_data);
   2046   {
   2047     SCOPED_TRACE("Credit card 2");
   2048     ExpectFilledForm(response_page_id, response_data, kPageID3,
   2049                      "", "", "", "", "", "", "", "", "", "", "", "", "", "",
   2050                      "2012", true, true, false);
   2051   }
   2052 }
   2053 
   2054 // Test that we correctly fill an address form with a non-default variant for a
   2055 // multi-valued field.
   2056 TEST_F(AutofillManagerTest, FillAddressFormWithVariantType) {
   2057   // Set up our form data.
   2058   FormData form;
   2059   test::CreateTestAddressFormData(&form);
   2060   std::vector<FormData> forms(1, form);
   2061   FormsSeen(forms);
   2062 
   2063   // Add a name variant to the Elvis profile.
   2064   AutofillProfile* profile = autofill_manager_->GetProfileWithGUID(
   2065       "00000000-0000-0000-0000-000000000001");
   2066 
   2067   std::vector<base::string16> name_variants;
   2068   name_variants.push_back(ASCIIToUTF16("Some"));
   2069   name_variants.push_back(profile->GetRawInfo(NAME_FIRST));
   2070   profile->SetRawMultiInfo(NAME_FIRST, name_variants);
   2071 
   2072   name_variants.clear();
   2073   name_variants.push_back(ASCIIToUTF16("Other"));
   2074   name_variants.push_back(profile->GetRawInfo(NAME_MIDDLE));
   2075   profile->SetRawMultiInfo(NAME_MIDDLE, name_variants);
   2076 
   2077   name_variants.clear();
   2078   name_variants.push_back(ASCIIToUTF16("Guy"));
   2079   name_variants.push_back(profile->GetRawInfo(NAME_LAST));
   2080   profile->SetRawMultiInfo(NAME_LAST, name_variants);
   2081 
   2082   GUIDPair guid(profile->guid(), 1);
   2083   GUIDPair empty(std::string(), 0);
   2084   int response_page_id = 0;
   2085   FormData response_data1;
   2086   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   2087       PackGUIDs(empty, guid), &response_page_id, &response_data1);
   2088   {
   2089     SCOPED_TRACE("Valid variant");
   2090     ExpectFilledAddressFormElvis(
   2091         response_page_id, response_data1, kDefaultPageID, false);
   2092   }
   2093 
   2094   // Try filling with a variant that doesn't exist.  The fields to which this
   2095   // variant would normally apply should not be filled.
   2096   const int kPageID2 = 2;
   2097   GUIDPair guid2(profile->guid(), 2);
   2098   response_page_id = 0;
   2099   FormData response_data2;
   2100   FillAutofillFormDataAndSaveResults(kPageID2, form, form.fields[0],
   2101       PackGUIDs(empty, guid2), &response_page_id, &response_data2);
   2102   {
   2103     SCOPED_TRACE("Invalid variant");
   2104     ExpectFilledForm(response_page_id, response_data2, kPageID2, "", "", "",
   2105                      "3734 Elvis Presley Blvd.", "Apt. 10", "Memphis",
   2106                      "Tennessee", "38116", "United States", "12345678901",
   2107                      "theking (at) gmail.com", "", "", "", "", true, false, false);
   2108   }
   2109 }
   2110 
   2111 // Test that we correctly fill a phone number split across multiple fields.
   2112 TEST_F(AutofillManagerTest, FillPhoneNumber) {
   2113   // In one form, rely on the maxlength attribute to imply phone number parts.
   2114   // In the other form, rely on the autocompletetype attribute.
   2115   FormData form_with_maxlength;
   2116   form_with_maxlength.name = ASCIIToUTF16("MyMaxlengthPhoneForm");
   2117   form_with_maxlength.origin = GURL("http://myform.com/phone_form.html");
   2118   form_with_maxlength.action = GURL("http://myform.com/phone_submit.html");
   2119   form_with_maxlength.user_submitted = true;
   2120   FormData form_with_autocompletetype = form_with_maxlength;
   2121   form_with_autocompletetype.name = ASCIIToUTF16("MyAutocompletetypePhoneForm");
   2122 
   2123   struct {
   2124     const char* label;
   2125     const char* name;
   2126     size_t max_length;
   2127     const char* autocomplete_attribute;
   2128   } test_fields[] = {
   2129     { "country code", "country_code", 1, "tel-country-code" },
   2130     { "area code", "area_code", 3, "tel-area-code" },
   2131     { "phone", "phone_prefix", 3, "tel-local-prefix" },
   2132     { "-", "phone_suffix", 4, "tel-local-suffix" },
   2133     { "Phone Extension", "ext", 3, "tel-extension" }
   2134   };
   2135 
   2136   FormFieldData field;
   2137   const size_t default_max_length = field.max_length;
   2138   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_fields); ++i) {
   2139     test::CreateTestFormField(
   2140         test_fields[i].label, test_fields[i].name, "", "text", &field);
   2141     field.max_length = test_fields[i].max_length;
   2142     field.autocomplete_attribute = std::string();
   2143     form_with_maxlength.fields.push_back(field);
   2144 
   2145     field.max_length = default_max_length;
   2146     field.autocomplete_attribute = test_fields[i].autocomplete_attribute;
   2147     form_with_autocompletetype.fields.push_back(field);
   2148   }
   2149 
   2150   std::vector<FormData> forms;
   2151   forms.push_back(form_with_maxlength);
   2152   forms.push_back(form_with_autocompletetype);
   2153   FormsSeen(forms);
   2154 
   2155   // We should be able to fill prefix and suffix fields for US numbers.
   2156   AutofillProfile* work_profile = autofill_manager_->GetProfileWithGUID(
   2157       "00000000-0000-0000-0000-000000000002");
   2158   ASSERT_TRUE(work_profile != NULL);
   2159   work_profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER,
   2160                            ASCIIToUTF16("16505554567"));
   2161 
   2162   GUIDPair guid(work_profile->guid(), 0);
   2163   GUIDPair empty(std::string(), 0);
   2164   int page_id = 1;
   2165   int response_page_id = 0;
   2166   FormData response_data1;
   2167   FillAutofillFormDataAndSaveResults(page_id, form_with_maxlength,
   2168       *form_with_maxlength.fields.begin(),
   2169       PackGUIDs(empty, guid), &response_page_id, &response_data1);
   2170   EXPECT_EQ(1, response_page_id);
   2171 
   2172   ASSERT_EQ(5U, response_data1.fields.size());
   2173   EXPECT_EQ(ASCIIToUTF16("1"), response_data1.fields[0].value);
   2174   EXPECT_EQ(ASCIIToUTF16("650"), response_data1.fields[1].value);
   2175   EXPECT_EQ(ASCIIToUTF16("555"), response_data1.fields[2].value);
   2176   EXPECT_EQ(ASCIIToUTF16("4567"), response_data1.fields[3].value);
   2177   EXPECT_EQ(base::string16(), response_data1.fields[4].value);
   2178 
   2179   page_id = 2;
   2180   response_page_id = 0;
   2181   FormData response_data2;
   2182   FillAutofillFormDataAndSaveResults(page_id, form_with_autocompletetype,
   2183       *form_with_autocompletetype.fields.begin(),
   2184       PackGUIDs(empty, guid), &response_page_id, &response_data2);
   2185   EXPECT_EQ(2, response_page_id);
   2186 
   2187   ASSERT_EQ(5U, response_data2.fields.size());
   2188   EXPECT_EQ(ASCIIToUTF16("1"), response_data2.fields[0].value);
   2189   EXPECT_EQ(ASCIIToUTF16("650"), response_data2.fields[1].value);
   2190   EXPECT_EQ(ASCIIToUTF16("555"), response_data2.fields[2].value);
   2191   EXPECT_EQ(ASCIIToUTF16("4567"), response_data2.fields[3].value);
   2192   EXPECT_EQ(base::string16(), response_data2.fields[4].value);
   2193 
   2194   // We should not be able to fill prefix and suffix fields for international
   2195   // numbers.
   2196   work_profile->SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("GB"));
   2197   work_profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER,
   2198                            ASCIIToUTF16("447700954321"));
   2199   page_id = 3;
   2200   response_page_id = 0;
   2201   FormData response_data3;
   2202   FillAutofillFormDataAndSaveResults(page_id, form_with_maxlength,
   2203       *form_with_maxlength.fields.begin(),
   2204       PackGUIDs(empty, guid), &response_page_id, &response_data3);
   2205   EXPECT_EQ(3, response_page_id);
   2206 
   2207   ASSERT_EQ(5U, response_data3.fields.size());
   2208   EXPECT_EQ(ASCIIToUTF16("44"), response_data3.fields[0].value);
   2209   EXPECT_EQ(ASCIIToUTF16("7700"), response_data3.fields[1].value);
   2210   EXPECT_EQ(ASCIIToUTF16("954321"), response_data3.fields[2].value);
   2211   EXPECT_EQ(ASCIIToUTF16("954321"), response_data3.fields[3].value);
   2212   EXPECT_EQ(base::string16(), response_data3.fields[4].value);
   2213 
   2214   page_id = 4;
   2215   response_page_id = 0;
   2216   FormData response_data4;
   2217   FillAutofillFormDataAndSaveResults(page_id, form_with_autocompletetype,
   2218       *form_with_autocompletetype.fields.begin(),
   2219       PackGUIDs(empty, guid), &response_page_id, &response_data4);
   2220   EXPECT_EQ(4, response_page_id);
   2221 
   2222   ASSERT_EQ(5U, response_data4.fields.size());
   2223   EXPECT_EQ(ASCIIToUTF16("44"), response_data4.fields[0].value);
   2224   EXPECT_EQ(ASCIIToUTF16("7700"), response_data4.fields[1].value);
   2225   EXPECT_EQ(ASCIIToUTF16("954321"), response_data4.fields[2].value);
   2226   EXPECT_EQ(ASCIIToUTF16("954321"), response_data4.fields[3].value);
   2227   EXPECT_EQ(base::string16(), response_data4.fields[4].value);
   2228 
   2229   // We should fill all phone fields with the same phone number variant.
   2230   std::vector<base::string16> phone_variants;
   2231   phone_variants.push_back(ASCIIToUTF16("16505554567"));
   2232   phone_variants.push_back(ASCIIToUTF16("18887771234"));
   2233   work_profile->SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
   2234   work_profile->SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, phone_variants);
   2235 
   2236   page_id = 5;
   2237   response_page_id = 0;
   2238   FormData response_data5;
   2239   GUIDPair variant_guid(work_profile->guid(), 1);
   2240   FillAutofillFormDataAndSaveResults(page_id, form_with_maxlength,
   2241       *form_with_maxlength.fields.begin(),
   2242       PackGUIDs(empty, variant_guid), &response_page_id, &response_data5);
   2243   EXPECT_EQ(5, response_page_id);
   2244 
   2245   ASSERT_EQ(5U, response_data5.fields.size());
   2246   EXPECT_EQ(ASCIIToUTF16("1"), response_data5.fields[0].value);
   2247   EXPECT_EQ(ASCIIToUTF16("888"), response_data5.fields[1].value);
   2248   EXPECT_EQ(ASCIIToUTF16("777"), response_data5.fields[2].value);
   2249   EXPECT_EQ(ASCIIToUTF16("1234"), response_data5.fields[3].value);
   2250   EXPECT_EQ(base::string16(), response_data5.fields[4].value);
   2251 }
   2252 
   2253 // Test that we can still fill a form when a field has been removed from it.
   2254 TEST_F(AutofillManagerTest, FormChangesRemoveField) {
   2255   // Set up our form data.
   2256   FormData form;
   2257   test::CreateTestAddressFormData(&form);
   2258 
   2259   // Add a field -- we'll remove it again later.
   2260   FormFieldData field;
   2261   test::CreateTestFormField("Some", "field", "", "text", &field);
   2262   form.fields.insert(form.fields.begin() + 3, field);
   2263 
   2264   std::vector<FormData> forms(1, form);
   2265   FormsSeen(forms);
   2266 
   2267   // Now, after the call to |FormsSeen|, we remove the field before filling.
   2268   form.fields.erase(form.fields.begin() + 3);
   2269 
   2270   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   2271   GUIDPair empty(std::string(), 0);
   2272   int response_page_id = 0;
   2273   FormData response_data;
   2274   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   2275       PackGUIDs(empty, guid), &response_page_id, &response_data);
   2276   ExpectFilledAddressFormElvis(
   2277       response_page_id, response_data, kDefaultPageID, false);
   2278 }
   2279 
   2280 // Test that we can still fill a form when a field has been added to it.
   2281 TEST_F(AutofillManagerTest, FormChangesAddField) {
   2282   // The offset of the phone field in the address form.
   2283   const int kPhoneFieldOffset = 9;
   2284 
   2285   // Set up our form data.
   2286   FormData form;
   2287   test::CreateTestAddressFormData(&form);
   2288 
   2289   // Remove the phone field -- we'll add it back later.
   2290   std::vector<FormFieldData>::iterator pos =
   2291       form.fields.begin() + kPhoneFieldOffset;
   2292   FormFieldData field = *pos;
   2293   pos = form.fields.erase(pos);
   2294 
   2295   std::vector<FormData> forms(1, form);
   2296   FormsSeen(forms);
   2297 
   2298   // Now, after the call to |FormsSeen|, we restore the field before filling.
   2299   form.fields.insert(pos, field);
   2300 
   2301   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   2302   GUIDPair empty(std::string(), 0);
   2303   int response_page_id = 0;
   2304   FormData response_data;
   2305   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   2306       PackGUIDs(empty, guid), &response_page_id, &response_data);
   2307   ExpectFilledAddressFormElvis(
   2308       response_page_id, response_data, kDefaultPageID, false);
   2309 }
   2310 
   2311 // Test that we are able to save form data when forms are submitted.
   2312 TEST_F(AutofillManagerTest, FormSubmitted) {
   2313   // Set up our form data.
   2314   FormData form;
   2315   test::CreateTestAddressFormData(&form);
   2316   std::vector<FormData> forms(1, form);
   2317   FormsSeen(forms);
   2318 
   2319   // Fill the form.
   2320   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   2321   GUIDPair empty(std::string(), 0);
   2322   int response_page_id = 0;
   2323   FormData response_data;
   2324   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   2325       PackGUIDs(empty, guid), &response_page_id, &response_data);
   2326   ExpectFilledAddressFormElvis(
   2327       response_page_id, response_data, kDefaultPageID, false);
   2328 
   2329   // Simulate form submission. We should call into the PDM to try to save the
   2330   // filled data.
   2331   EXPECT_CALL(personal_data_, SaveImportedProfile(::testing::_)).Times(1);
   2332   FormSubmitted(response_data);
   2333 }
   2334 
   2335 // Test that when Autocomplete is enabled and Autofill is disabled,
   2336 // form submissions are still received by AutocompleteHistoryManager.
   2337 TEST_F(AutofillManagerTest, FormSubmittedAutocompleteEnabled) {
   2338   TestAutofillClient client;
   2339   autofill_manager_.reset(
   2340       new TestAutofillManager(autofill_driver_.get(), &client, NULL));
   2341   autofill_manager_->set_autofill_enabled(false);
   2342   scoped_ptr<MockAutocompleteHistoryManager> autocomplete_history_manager;
   2343   autocomplete_history_manager.reset(
   2344       new MockAutocompleteHistoryManager(autofill_driver_.get(), &client));
   2345   autofill_manager_->autocomplete_history_manager_ =
   2346       autocomplete_history_manager.Pass();
   2347 
   2348   // Set up our form data.
   2349   FormData form;
   2350   test::CreateTestAddressFormData(&form);
   2351   MockAutocompleteHistoryManager* m = static_cast<
   2352       MockAutocompleteHistoryManager*>(
   2353           autofill_manager_->autocomplete_history_manager_.get());
   2354   EXPECT_CALL(*m,
   2355               OnFormSubmitted(_)).Times(1);
   2356   FormSubmitted(form);
   2357 }
   2358 
   2359 // Test that when Autocomplete is enabled and Autofill is disabled,
   2360 // Autocomplete suggestions are still received.
   2361 TEST_F(AutofillManagerTest, AutocompleteSuggestionsWhenAutofillDisabled) {
   2362   TestAutofillClient client;
   2363   autofill_manager_.reset(
   2364       new TestAutofillManager(autofill_driver_.get(), &client, NULL));
   2365   autofill_manager_->set_autofill_enabled(false);
   2366   autofill_manager_->SetExternalDelegate(external_delegate_.get());
   2367 
   2368   // Set up our form data.
   2369   FormData form;
   2370   test::CreateTestAddressFormData(&form);
   2371   std::vector<FormData> forms(1, form);
   2372   FormsSeen(forms);
   2373   const FormFieldData& field = form.fields[0];
   2374   GetAutofillSuggestions(form, field);
   2375 
   2376   // Add some Autocomplete suggestions. We should return the autocomplete
   2377   // suggestions, these will be culled by the renderer.
   2378   std::vector<base::string16> suggestions;
   2379   suggestions.push_back(ASCIIToUTF16("Jay"));
   2380   suggestions.push_back(ASCIIToUTF16("Jason"));
   2381   AutocompleteSuggestionsReturned(suggestions);
   2382 
   2383   base::string16 expected_values[] = {
   2384     ASCIIToUTF16("Jay"),
   2385     ASCIIToUTF16("Jason")
   2386   };
   2387   base::string16 expected_labels[] = { base::string16(), base::string16()};
   2388   base::string16 expected_icons[] = { base::string16(), base::string16()};
   2389   int expected_unique_ids[] = {0, 0};
   2390   external_delegate_->CheckSuggestions(
   2391       kDefaultPageID, arraysize(expected_values), expected_values,
   2392       expected_labels, expected_icons, expected_unique_ids);
   2393 }
   2394 
   2395 // Test that we are able to save form data when forms are submitted and we only
   2396 // have server data for the field types.
   2397 TEST_F(AutofillManagerTest, FormSubmittedServerTypes) {
   2398   // Set up our form data.
   2399   FormData form;
   2400   test::CreateTestAddressFormData(&form);
   2401 
   2402   // Simulate having seen this form on page load.
   2403   // |form_structure| will be owned by |autofill_manager_|.
   2404   TestFormStructure* form_structure = new TestFormStructure(form);
   2405   AutofillMetrics metrics_logger;  // ignored
   2406   form_structure->DetermineHeuristicTypes(metrics_logger);
   2407 
   2408   // Clear the heuristic types, and instead set the appropriate server types.
   2409   std::vector<ServerFieldType> heuristic_types, server_types;
   2410   for (size_t i = 0; i < form.fields.size(); ++i) {
   2411     heuristic_types.push_back(UNKNOWN_TYPE);
   2412     server_types.push_back(form_structure->field(i)->heuristic_type());
   2413   }
   2414   form_structure->SetFieldTypes(heuristic_types, server_types);
   2415   autofill_manager_->AddSeenForm(form_structure);
   2416 
   2417   // Fill the form.
   2418   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   2419   GUIDPair empty(std::string(), 0);
   2420   int response_page_id = 0;
   2421   FormData response_data;
   2422   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
   2423       PackGUIDs(empty, guid), &response_page_id, &response_data);
   2424   ExpectFilledAddressFormElvis(
   2425       response_page_id, response_data, kDefaultPageID, false);
   2426 
   2427   // Simulate form submission. We should call into the PDM to try to save the
   2428   // filled data.
   2429   EXPECT_CALL(personal_data_, SaveImportedProfile(::testing::_)).Times(1);
   2430   FormSubmitted(response_data);
   2431 }
   2432 
   2433 // Test that the form signature for an uploaded form always matches the form
   2434 // signature from the query.
   2435 TEST_F(AutofillManagerTest, FormSubmittedWithDifferentFields) {
   2436   // Set up our form data.
   2437   FormData form;
   2438   test::CreateTestAddressFormData(&form);
   2439   std::vector<FormData> forms(1, form);
   2440   FormsSeen(forms);
   2441 
   2442   // Cache the expected form signature.
   2443   std::string signature = FormStructure(form).FormSignature();
   2444 
   2445   // Change the structure of the form prior to submission.
   2446   // Websites would typically invoke JavaScript either on page load or on form
   2447   // submit to achieve this.
   2448   form.fields.pop_back();
   2449   FormFieldData field = form.fields[3];
   2450   form.fields[3] = form.fields[7];
   2451   form.fields[7] = field;
   2452 
   2453   // Simulate form submission.
   2454   FormSubmitted(form);
   2455   EXPECT_EQ(signature, autofill_manager_->GetSubmittedFormSignature());
   2456 }
   2457 
   2458 // Test that we do not save form data when submitted fields contain default
   2459 // values.
   2460 TEST_F(AutofillManagerTest, FormSubmittedWithDefaultValues) {
   2461   // Set up our form data.
   2462   FormData form;
   2463   test::CreateTestAddressFormData(&form);
   2464   form.fields[3].value = ASCIIToUTF16("Enter your address");
   2465 
   2466   // Convert the state field to a <select> popup, to make sure that we only
   2467   // reject default values for text fields.
   2468   ASSERT_TRUE(form.fields[6].name == ASCIIToUTF16("state"));
   2469   form.fields[6].form_control_type = "select-one";
   2470   form.fields[6].value = ASCIIToUTF16("Tennessee");
   2471 
   2472   std::vector<FormData> forms(1, form);
   2473   FormsSeen(forms);
   2474 
   2475   // Fill the form.
   2476   GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
   2477   GUIDPair empty(std::string(), 0);
   2478   int response_page_id = 0;
   2479   FormData response_data;
   2480   FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[3],
   2481       PackGUIDs(empty, guid), &response_page_id, &response_data);
   2482 
   2483   // Simulate form submission.  We should call into the PDM to try to save the
   2484   // filled data.
   2485   EXPECT_CALL(personal_data_, SaveImportedProfile(::testing::_)).Times(1);
   2486   FormSubmitted(response_data);
   2487 
   2488   // Set the address field's value back to the default value.
   2489   response_data.fields[3].value = ASCIIToUTF16("Enter your address");
   2490 
   2491   // Simulate form submission.  We should not call into the PDM to try to save
   2492   // the filled data, since the filled form is effectively missing an address.
   2493   EXPECT_CALL(personal_data_, SaveImportedProfile(::testing::_)).Times(0);
   2494   FormSubmitted(response_data);
   2495 }
   2496 
   2497 // Checks that resetting the auxiliary profile enabled preference does the right
   2498 // thing on all platforms.
   2499 TEST_F(AutofillManagerTest, AuxiliaryProfilesReset) {
   2500   PrefService* prefs = autofill_client_.GetPrefs();
   2501 #if defined(OS_MACOSX)
   2502   // Auxiliary profiles is implemented on Mac only.
   2503   // OSX: This preference exists for legacy reasons. It is no longer used.
   2504   ASSERT_TRUE(
   2505       prefs->GetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled));
   2506   prefs->SetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled,
   2507                     false);
   2508   prefs->ClearPref(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled);
   2509   ASSERT_TRUE(
   2510       prefs->GetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled));
   2511 #else
   2512   ASSERT_FALSE(
   2513       prefs->GetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled));
   2514   prefs->SetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled, true);
   2515   prefs->ClearPref(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled);
   2516   ASSERT_FALSE(
   2517       prefs->GetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled));
   2518 #endif  // defined(OS_MACOSX)
   2519 }
   2520 
   2521 TEST_F(AutofillManagerTest, DeterminePossibleFieldTypesForUpload) {
   2522   FormData form;
   2523   form.name = ASCIIToUTF16("MyForm");
   2524   form.origin = GURL("http://myform.com/form.html");
   2525   form.action = GURL("http://myform.com/submit.html");
   2526   form.user_submitted = true;
   2527 
   2528   std::vector<ServerFieldTypeSet> expected_types;
   2529 
   2530   // These fields should all match.
   2531   FormFieldData field;
   2532   ServerFieldTypeSet types;
   2533   test::CreateTestFormField("", "1", "Elvis", "text", &field);
   2534   types.clear();
   2535   types.insert(NAME_FIRST);
   2536   form.fields.push_back(field);
   2537   expected_types.push_back(types);
   2538 
   2539   test::CreateTestFormField("", "2", "Aaron", "text", &field);
   2540   types.clear();
   2541   types.insert(NAME_MIDDLE);
   2542   form.fields.push_back(field);
   2543   expected_types.push_back(types);
   2544 
   2545   test::CreateTestFormField("", "3", "A", "text", &field);
   2546   types.clear();
   2547   types.insert(NAME_MIDDLE_INITIAL);
   2548   form.fields.push_back(field);
   2549   expected_types.push_back(types);
   2550 
   2551   test::CreateTestFormField("", "4", "Presley", "text", &field);
   2552   types.clear();
   2553   types.insert(NAME_LAST);
   2554   form.fields.push_back(field);
   2555   expected_types.push_back(types);
   2556 
   2557   test::CreateTestFormField("", "5", "Elvis Presley", "text", &field);
   2558   types.clear();
   2559   types.insert(CREDIT_CARD_NAME);
   2560   form.fields.push_back(field);
   2561   expected_types.push_back(types);
   2562 
   2563   test::CreateTestFormField("", "6", "Elvis Aaron Presley", "text",
   2564                                      &field);
   2565   types.clear();
   2566   types.insert(NAME_FULL);
   2567   form.fields.push_back(field);
   2568   expected_types.push_back(types);
   2569 
   2570   test::CreateTestFormField("", "7", "theking (at) gmail.com", "email",
   2571                                      &field);
   2572   types.clear();
   2573   types.insert(EMAIL_ADDRESS);
   2574   form.fields.push_back(field);
   2575   expected_types.push_back(types);
   2576 
   2577   test::CreateTestFormField("", "8", "RCA", "text", &field);
   2578   types.clear();
   2579   types.insert(COMPANY_NAME);
   2580   form.fields.push_back(field);
   2581   expected_types.push_back(types);
   2582 
   2583   test::CreateTestFormField("", "9", "3734 Elvis Presley Blvd.",
   2584                                      "text", &field);
   2585   types.clear();
   2586   types.insert(ADDRESS_HOME_LINE1);
   2587   form.fields.push_back(field);
   2588   expected_types.push_back(types);
   2589 
   2590   test::CreateTestFormField("", "10", "Apt. 10", "text", &field);
   2591   types.clear();
   2592   types.insert(ADDRESS_HOME_LINE2);
   2593   form.fields.push_back(field);
   2594   expected_types.push_back(types);
   2595 
   2596   test::CreateTestFormField("", "11", "Memphis", "text", &field);
   2597   types.clear();
   2598   types.insert(ADDRESS_HOME_CITY);
   2599   form.fields.push_back(field);
   2600   expected_types.push_back(types);
   2601 
   2602   test::CreateTestFormField("", "12", "Tennessee", "text", &field);
   2603   types.clear();
   2604   types.insert(ADDRESS_HOME_STATE);
   2605   form.fields.push_back(field);
   2606   expected_types.push_back(types);
   2607 
   2608   test::CreateTestFormField("", "13", "38116", "text", &field);
   2609   types.clear();
   2610   types.insert(ADDRESS_HOME_ZIP);
   2611   form.fields.push_back(field);
   2612   expected_types.push_back(types);
   2613 
   2614   test::CreateTestFormField("", "14", "USA", "text", &field);
   2615   types.clear();
   2616   types.insert(ADDRESS_HOME_COUNTRY);
   2617   form.fields.push_back(field);
   2618   expected_types.push_back(types);
   2619 
   2620   test::CreateTestFormField("", "15", "United States", "text", &field);
   2621   types.clear();
   2622   types.insert(ADDRESS_HOME_COUNTRY);
   2623   form.fields.push_back(field);
   2624   expected_types.push_back(types);
   2625 
   2626   test::CreateTestFormField("", "16", "+1 (234) 567-8901", "text",
   2627                                      &field);
   2628   types.clear();
   2629   types.insert(PHONE_HOME_WHOLE_NUMBER);
   2630   form.fields.push_back(field);
   2631   expected_types.push_back(types);
   2632 
   2633   test::CreateTestFormField("", "17", "2345678901", "text", &field);
   2634   types.clear();
   2635   types.insert(PHONE_HOME_CITY_AND_NUMBER);
   2636   form.fields.push_back(field);
   2637   expected_types.push_back(types);
   2638 
   2639   test::CreateTestFormField("", "18", "1", "text", &field);
   2640   types.clear();
   2641   types.insert(PHONE_HOME_COUNTRY_CODE);
   2642   form.fields.push_back(field);
   2643   expected_types.push_back(types);
   2644 
   2645   test::CreateTestFormField("", "19", "234", "text", &field);
   2646   types.clear();
   2647   types.insert(PHONE_HOME_CITY_CODE);
   2648   form.fields.push_back(field);
   2649   expected_types.push_back(types);
   2650 
   2651   test::CreateTestFormField("", "20", "5678901", "text", &field);
   2652   types.clear();
   2653   types.insert(PHONE_HOME_NUMBER);
   2654   form.fields.push_back(field);
   2655   expected_types.push_back(types);
   2656 
   2657   test::CreateTestFormField("", "21", "567", "text", &field);
   2658   types.clear();
   2659   types.insert(PHONE_HOME_NUMBER);
   2660   form.fields.push_back(field);
   2661   expected_types.push_back(types);
   2662 
   2663   test::CreateTestFormField("", "22", "8901", "text", &field);
   2664   types.clear();
   2665   types.insert(PHONE_HOME_NUMBER);
   2666   form.fields.push_back(field);
   2667   expected_types.push_back(types);
   2668 
   2669   test::CreateTestFormField("", "23", "4234-5678-9012-3456", "text",
   2670                                      &field);
   2671   types.clear();
   2672   types.insert(CREDIT_CARD_NUMBER);
   2673   form.fields.push_back(field);
   2674   expected_types.push_back(types);
   2675 
   2676   test::CreateTestFormField("", "24", "04", "text", &field);
   2677   types.clear();
   2678   types.insert(CREDIT_CARD_EXP_MONTH);
   2679   form.fields.push_back(field);
   2680   expected_types.push_back(types);
   2681 
   2682   test::CreateTestFormField("", "25", "April", "text", &field);
   2683   types.clear();
   2684   types.insert(CREDIT_CARD_EXP_MONTH);
   2685   form.fields.push_back(field);
   2686   expected_types.push_back(types);
   2687 
   2688   test::CreateTestFormField("", "26", "2012", "text", &field);
   2689   types.clear();
   2690   types.insert(CREDIT_CARD_EXP_4_DIGIT_YEAR);
   2691   form.fields.push_back(field);
   2692   expected_types.push_back(types);
   2693 
   2694   test::CreateTestFormField("", "27", "12", "text", &field);
   2695   types.clear();
   2696   types.insert(CREDIT_CARD_EXP_2_DIGIT_YEAR);
   2697   form.fields.push_back(field);
   2698   expected_types.push_back(types);
   2699 
   2700   test::CreateTestFormField("", "28", "04/2012", "text", &field);
   2701   types.clear();
   2702   types.insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
   2703   form.fields.push_back(field);
   2704   expected_types.push_back(types);
   2705 
   2706   // Make sure that we trim whitespace properly.
   2707   test::CreateTestFormField("", "29", "", "text", &field);
   2708   types.clear();
   2709   types.insert(EMPTY_TYPE);
   2710   form.fields.push_back(field);
   2711   expected_types.push_back(types);
   2712 
   2713   test::CreateTestFormField("", "30", " ", "text", &field);
   2714   types.clear();
   2715   types.insert(EMPTY_TYPE);
   2716   form.fields.push_back(field);
   2717   expected_types.push_back(types);
   2718 
   2719   test::CreateTestFormField("", "31", " Elvis", "text", &field);
   2720   types.clear();
   2721   types.insert(NAME_FIRST);
   2722   form.fields.push_back(field);
   2723   expected_types.push_back(types);
   2724 
   2725   test::CreateTestFormField("", "32", "Elvis ", "text", &field);
   2726   types.clear();
   2727   types.insert(NAME_FIRST);
   2728   form.fields.push_back(field);
   2729   expected_types.push_back(types);
   2730 
   2731   // These fields should not match, as they differ by case.
   2732   test::CreateTestFormField("", "33", "elvis", "text", &field);
   2733   types.clear();
   2734   types.insert(UNKNOWN_TYPE);
   2735   form.fields.push_back(field);
   2736   expected_types.push_back(types);
   2737 
   2738   test::CreateTestFormField("", "34", "3734 Elvis Presley BLVD",
   2739                                      "text", &field);
   2740   types.clear();
   2741   types.insert(UNKNOWN_TYPE);
   2742   form.fields.push_back(field);
   2743   expected_types.push_back(types);
   2744 
   2745   // These fields should not match, as they are unsupported variants.
   2746   test::CreateTestFormField("", "35", "Elvis Aaron", "text", &field);
   2747   types.clear();
   2748   types.insert(UNKNOWN_TYPE);
   2749   form.fields.push_back(field);
   2750   expected_types.push_back(types);
   2751 
   2752   test::CreateTestFormField("", "36", "Mr. Presley", "text", &field);
   2753   types.clear();
   2754   types.insert(UNKNOWN_TYPE);
   2755   form.fields.push_back(field);
   2756   expected_types.push_back(types);
   2757 
   2758   test::CreateTestFormField("", "37", "3734 Elvis Presley", "text",
   2759                                      &field);
   2760   types.clear();
   2761   types.insert(UNKNOWN_TYPE);
   2762   form.fields.push_back(field);
   2763   expected_types.push_back(types);
   2764 
   2765   test::CreateTestFormField("", "38", "TN", "text", &field);
   2766   types.clear();
   2767   types.insert(UNKNOWN_TYPE);
   2768   form.fields.push_back(field);
   2769   expected_types.push_back(types);
   2770 
   2771   test::CreateTestFormField("", "39", "38116-1023", "text", &field);
   2772   types.clear();
   2773   types.insert(UNKNOWN_TYPE);
   2774   form.fields.push_back(field);
   2775   expected_types.push_back(types);
   2776 
   2777   test::CreateTestFormField("", "20", "5", "text", &field);
   2778   types.clear();
   2779   types.insert(UNKNOWN_TYPE);
   2780   form.fields.push_back(field);
   2781   expected_types.push_back(types);
   2782 
   2783   test::CreateTestFormField("", "20", "56", "text", &field);
   2784   types.clear();
   2785   types.insert(UNKNOWN_TYPE);
   2786   form.fields.push_back(field);
   2787   expected_types.push_back(types);
   2788 
   2789   test::CreateTestFormField("", "20", "901", "text", &field);
   2790   types.clear();
   2791   types.insert(UNKNOWN_TYPE);
   2792   form.fields.push_back(field);
   2793   expected_types.push_back(types);
   2794 
   2795   test::CreateTestFormField("", "40", "mypassword", "password", &field);
   2796   types.clear();
   2797   types.insert(PASSWORD);
   2798   form.fields.push_back(field);
   2799   expected_types.push_back(types);
   2800 
   2801   autofill_manager_->set_expected_submitted_field_types(expected_types);
   2802   FormSubmitted(form);
   2803 }
   2804 
   2805 TEST_F(AutofillManagerTest, RemoveProfile) {
   2806   // Add and remove an Autofill profile.
   2807   AutofillProfile* profile = new AutofillProfile;
   2808   std::string guid = "00000000-0000-0000-0000-000000000102";
   2809   profile->set_guid(guid.c_str());
   2810   autofill_manager_->AddProfile(profile);
   2811 
   2812   GUIDPair guid_pair(guid, 0);
   2813   GUIDPair empty(std::string(), 0);
   2814   int id = PackGUIDs(empty, guid_pair);
   2815 
   2816   autofill_manager_->RemoveAutofillProfileOrCreditCard(id);
   2817 
   2818   EXPECT_FALSE(autofill_manager_->GetProfileWithGUID(guid.c_str()));
   2819 }
   2820 
   2821 TEST_F(AutofillManagerTest, RemoveCreditCard){
   2822   // Add and remove an Autofill credit card.
   2823   CreditCard* credit_card = new CreditCard;
   2824   std::string guid = "00000000-0000-0000-0000-000000100007";
   2825   credit_card->set_guid(guid.c_str());
   2826   autofill_manager_->AddCreditCard(credit_card);
   2827 
   2828   GUIDPair guid_pair(guid, 0);
   2829   GUIDPair empty(std::string(), 0);
   2830   int id = PackGUIDs(guid_pair, empty);
   2831 
   2832   autofill_manager_->RemoveAutofillProfileOrCreditCard(id);
   2833 
   2834   EXPECT_FALSE(autofill_manager_->GetCreditCardWithGUID(guid.c_str()));
   2835 }
   2836 
   2837 TEST_F(AutofillManagerTest, RemoveProfileVariant) {
   2838   // Add and remove an Autofill profile.
   2839   AutofillProfile* profile = new AutofillProfile;
   2840   std::string guid = "00000000-0000-0000-0000-000000000102";
   2841   profile->set_guid(guid.c_str());
   2842   autofill_manager_->AddProfile(profile);
   2843 
   2844   GUIDPair guid_pair(guid, 1);
   2845   GUIDPair empty(std::string(), 0);
   2846   int id = PackGUIDs(empty, guid_pair);
   2847 
   2848   autofill_manager_->RemoveAutofillProfileOrCreditCard(id);
   2849 
   2850   // TODO(csharp): Currently variants should not be deleted, but once they are
   2851   // update these expectations.
   2852   // http://crbug.com/124211
   2853   EXPECT_TRUE(autofill_manager_->GetProfileWithGUID(guid.c_str()));
   2854 }
   2855 
   2856 #if defined(OS_MACOSX) && !defined(OS_IOS)
   2857 TEST_F(AutofillManagerTest, AccessAddressBookPrompt) {
   2858   FormData form;
   2859   test::CreateTestAddressFormData(&form);
   2860   std::vector<FormData> forms(1, form);
   2861   FormsSeen(forms);
   2862   FormFieldData& field = form.fields[0];
   2863   field.should_autocomplete = true;
   2864 
   2865   // A profile already exists.
   2866   EXPECT_FALSE(
   2867       autofill_manager_->ShouldShowAccessAddressBookSuggestion(form, field));
   2868 
   2869   // Remove all profiles.
   2870   personal_data_.ClearAutofillProfiles();
   2871   EXPECT_TRUE(
   2872       autofill_manager_->ShouldShowAccessAddressBookSuggestion(form, field));
   2873 
   2874   field.should_autocomplete = false;
   2875   EXPECT_FALSE(
   2876       autofill_manager_->ShouldShowAccessAddressBookSuggestion(form, field));
   2877 }
   2878 #endif  // defined(OS_MACOSX) && !defined(OS_IOS)
   2879 
   2880 namespace {
   2881 
   2882 class MockAutofillClient : public TestAutofillClient {
   2883  public:
   2884   MockAutofillClient() {}
   2885 
   2886   virtual ~MockAutofillClient() {}
   2887 
   2888   virtual void ShowRequestAutocompleteDialog(
   2889       const FormData& form,
   2890       const GURL& source_url,
   2891       const ResultCallback& callback) OVERRIDE {
   2892     callback.Run(user_supplied_data_ ? AutocompleteResultSuccess :
   2893                                        AutocompleteResultErrorDisabled,
   2894                  base::string16(),
   2895                  user_supplied_data_.get());
   2896   }
   2897 
   2898   void SetUserSuppliedData(scoped_ptr<FormStructure> user_supplied_data) {
   2899     user_supplied_data_.reset(user_supplied_data.release());
   2900   }
   2901 
   2902  private:
   2903   scoped_ptr<FormStructure> user_supplied_data_;
   2904 
   2905   DISALLOW_COPY_AND_ASSIGN(MockAutofillClient);
   2906 };
   2907 
   2908 }  // namespace
   2909 
   2910 // Test our external delegate is called at the right time.
   2911 TEST_F(AutofillManagerTest, TestExternalDelegate) {
   2912   FormData form;
   2913   test::CreateTestAddressFormData(&form);
   2914   std::vector<FormData> forms(1, form);
   2915   FormsSeen(forms);
   2916   const FormFieldData& field = form.fields[0];
   2917   GetAutofillSuggestions(form, field);  // should call the delegate's OnQuery()
   2918 
   2919   EXPECT_TRUE(external_delegate_->on_query_seen());
   2920 }
   2921 
   2922 }  // namespace autofill
   2923