autofill_manager_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tuple.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_manager_delegate_impl.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autocomplete_history_manager.h"
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_common_test.h"
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h"
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_metrics.h"
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/test_autofill_driver.h"
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/test_autofill_external_delegate.h"
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/test_autofill_manager_delegate.h"
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/autofill_messages.h"
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/common/autofill_pref_names.h"
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/forms_seen_state.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/user_prefs.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_render_process_host.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/component_strings.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_test_sink.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebAutofillClient.h"
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebFormElement.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebFormElement;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef PersonalDataManager::GUIDPair GUIDPair;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The page ID sent to the AutofillManager from the RenderView, used to send
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an IPC message back to the renderer.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDefaultPageID = 137;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPersonalDataManager : public PersonalDataManager {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestPersonalDataManager() : PersonalDataManager("en-US") {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateTestAutofillProfiles(&web_profiles_);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateTestCreditCards(&credit_cards_);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetBrowserContext(content::BrowserContext* context) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_browser_context(context);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory method for keyed service.  PersonalDataManager is NULL for testing.
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* Build(content::BrowserContext* profile) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SaveImportedProfile, void(const AutofillProfile&));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* GetProfileWithGUID(const char* guid) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<AutofillProfile *>::iterator it = web_profiles_.begin();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != web_profiles_.end(); ++it) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(*it)->guid().compare(guid))
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return *it;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard* GetCreditCardWithGUID(const char* guid) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<CreditCard *>::iterator it = credit_cards_.begin();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != credit_cards_.end(); ++it){
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(*it)->guid().compare(guid))
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return *it;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddProfile(AutofillProfile* profile) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_profiles_.push_back(profile);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddCreditCard(CreditCard* credit_card) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_cards_.push_back(credit_card);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RemoveByGUID(const std::string& guid) OVERRIDE {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreditCard* credit_card = GetCreditCardWithGUID(guid.c_str());
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (credit_card) {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      credit_cards_.erase(
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          std::remove(credit_cards_.begin(), credit_cards_.end(), credit_card),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          credit_cards_.end());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutofillProfile* profile = GetProfileWithGUID(guid.c_str());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (profile) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_profiles_.erase(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          std::remove(web_profiles_.begin(), web_profiles_.end(), profile),
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          web_profiles_.end());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do nothing (auxiliary profiles will be created in
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CreateTestAuxiliaryProfile).
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LoadAuxiliaryProfiles() OVERRIDE {}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearAutofillProfiles() {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_profiles_.clear();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearCreditCards() {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_cards_.clear();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateTestAuxiliaryProfiles() {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CreateTestAutofillProfiles(&auxiliary_profiles_);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateTestCreditCardsYearAndMonth(const char* year, const char* month) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearCreditCards();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreditCard* credit_card = new CreditCard;
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetCreditCardInfo(credit_card, "Miku Hatsune",
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "4234567890654321", // Visa
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            month, year);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_card->set_guid("00000000-0000-0000-0000-000000000007");
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_cards_.push_back(credit_card);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateTestAutofillProfiles(ScopedVector<AutofillProfile>* profiles) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillProfile* profile = new AutofillProfile;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetProfileInfo(profile, "Elvis", "Aaron",
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "Presley", "theking@gmail.com", "RCA",
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "3734 Elvis Presley Blvd.", "Apt. 10",
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "Memphis", "Tennessee", "38116", "US",
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "12345678901");
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile->set_guid("00000000-0000-0000-0000-000000000001");
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profiles->push_back(profile);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile = new AutofillProfile;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetProfileInfo(profile, "Charles", "Hardin",
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "Holley", "buddy@gmail.com", "Decca",
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "123 Apple St.", "unit 6", "Lubbock",
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "Texas", "79401", "US", "23456789012");
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile->set_guid("00000000-0000-0000-0000-000000000002");
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profiles->push_back(profile);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile = new AutofillProfile;
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetProfileInfo(
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        profile, "", "", "", "", "", "", "", "", "", "", "", "");
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile->set_guid("00000000-0000-0000-0000-000000000003");
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profiles->push_back(profile);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateTestCreditCards(ScopedVector<CreditCard>* credit_cards) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreditCard* credit_card = new CreditCard;
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetCreditCardInfo(credit_card, "Elvis Presley",
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "4234 5678 9012 3456",  // Visa
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "04", "2012");
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_card->set_guid("00000000-0000-0000-0000-000000000004");
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_cards->push_back(credit_card);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_card = new CreditCard;
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetCreditCardInfo(credit_card, "Buddy Holly",
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "5187654321098765",  // Mastercard
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "10", "2014");
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_card->set_guid("00000000-0000-0000-0000-000000000005");
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_cards->push_back(credit_card);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_card = new CreditCard;
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetCreditCardInfo(credit_card, "", "", "", "");
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_card->set_guid("00000000-0000-0000-0000-000000000006");
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    credit_cards->push_back(credit_card);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Populates |form| with 3 fields and a field with autocomplete attribute.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CreateTestFormWithAutocompleteAttribute(FormData* form) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->name = ASCIIToUTF16("UserSpecified");
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->method = ASCIIToUTF16("POST");
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->origin = GURL("http://myform.com/userspecified.html");
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->action = GURL("http://myform.com/submit.html");
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->user_submitted = true;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("First Name", "firstname", "", "text", &field);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->fields.push_back(field);
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Middle Name", "middlename", "", "text", &field);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->fields.push_back(field);
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Last Name", "lastname", "", "text", &field);
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->fields.push_back(field);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.autocomplete_attribute="cc-type";
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("cc-type", "cc-type", "", "text", &field);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->fields.push_back(field);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Populates |form| with data corresponding to a simple shipping options form.
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CreateTestShippingOptionsFormData(FormData* form) {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->name = ASCIIToUTF16("Shipping Options");
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->method = ASCIIToUTF16("POST");
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->origin = GURL("http://myform.com/shipping.html");
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->action = GURL("http://myform.com/submit.html");
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->user_submitted = true;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Shipping1", "option", "option1", "radio", &field);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->fields.push_back(field);
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Shipping2", "option", "option2", "radio", &field);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form->fields.push_back(field);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Populates |form| with data corresponding to a simple credit card form.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this actually appends fields to the form data, which can be useful
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for building up more complex test forms.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreateTestCreditCardFormData(FormData* form,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool is_https,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool use_month_type) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form->name = ASCIIToUTF16("MyForm");
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form->method = ASCIIToUTF16("POST");
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_https) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form->origin = GURL("https://myform.com/form.html");
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form->action = GURL("https://myform.com/submit.html");
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form->origin = GURL("http://myform.com/form.html");
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form->action = GURL("http://myform.com/submit.html");
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form->user_submitted = true;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Name on Card", "nameoncard", "", "text", &field);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form->fields.push_back(field);
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form->fields.push_back(field);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_month_type) {
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::CreateTestFormField(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Expiration Date", "ccmonth", "", "month", &field);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form->fields.push_back(field);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::CreateTestFormField("Expiration Date", "ccmonth", "", "text", &field);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form->fields.push_back(field);
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::CreateTestFormField("", "ccyear", "", "text", &field);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form->fields.push_back(field);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectSuggestions(int page_id,
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const std::vector<base::string16>& values,
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const std::vector<base::string16>& labels,
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const std::vector<base::string16>& icons,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::vector<int>& unique_ids,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int expected_page_id,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       size_t expected_num_suggestions,
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const base::string16 expected_values[],
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const base::string16 expected_labels[],
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const base::string16 expected_icons[],
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const int expected_unique_ids[]) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_page_id, page_id);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_num_suggestions, values.size());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_num_suggestions, labels.size());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_num_suggestions, icons.size());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_num_suggestions, unique_ids.size());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < expected_num_suggestions; ++i) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_values[i], values[i]);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_labels[i], labels[i]);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_icons[i], icons[i]);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_unique_ids[i], unique_ids[i]);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectFilledField(const char* expected_label,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const char* expected_name,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const char* expected_value,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const char* expected_form_control_type,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const FormFieldData& field) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE(expected_label);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UTF8ToUTF16(expected_label), field.label);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UTF8ToUTF16(expected_name), field.name);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UTF8ToUTF16(expected_value), field.value);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_form_control_type, field.form_control_type);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the |filled_form| has been filled with the given data.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies address fields if |has_address_fields| is true, and verifies
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// credit card fields if |has_credit_card_fields| is true. Verifies both if both
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are true. |use_month_type| is used for credit card input month type.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectFilledForm(int page_id,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const FormData& filled_form,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int expected_page_id,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* first,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* middle,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* last,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* address1,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* address2,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* city,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* state,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* postal_code,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* country,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* phone,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* email,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* name_on_card,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* card_number,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* expiration_month,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char* expiration_year,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool has_address_fields,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool has_credit_card_fields,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool use_month_type) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of fields in the address and credit card forms created above.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kAddressFormSize = 11;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kCreditCardFormSize = use_month_type ? 3 : 4;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_page_id, page_id);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("MyForm"), filled_form.name);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("POST"), filled_form.method);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_credit_card_fields) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GURL("https://myform.com/form.html"), filled_form.origin);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GURL("https://myform.com/submit.html"), filled_form.action);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GURL("http://myform.com/form.html"), filled_form.origin);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GURL("http://myform.com/submit.html"), filled_form.action);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(filled_form.user_submitted);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t form_size = 0;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_address_fields)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_size += kAddressFormSize;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_credit_card_fields)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_size += kCreditCardFormSize;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(form_size, filled_form.fields.size());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_address_fields) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("First Name", "firstname", first, "text",
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[0]);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Middle Name", "middlename", middle, "text",
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[1]);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Last Name", "lastname", last, "text",
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[2]);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Address Line 1", "addr1", address1, "text",
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[3]);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Address Line 2", "addr2", address2, "text",
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[4]);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("City", "city", city, "text",
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[5]);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("State", "state", state, "text",
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[6]);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Postal Code", "zipcode", postal_code, "text",
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[7]);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Country", "country", country, "text",
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[8]);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Phone Number", "phonenumber", phone, "tel",
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[9]);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Email", "email", email, "email",
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[10]);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_credit_card_fields) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t offset = has_address_fields? kAddressFormSize : 0;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Name on Card", "nameoncard", name_on_card, "text",
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[offset + 0]);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("Card Number", "cardnumber", card_number, "text",
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      filled_form.fields[offset + 1]);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (use_month_type) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string exp_year = expiration_year;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string exp_month = expiration_month;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string date;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!exp_year.empty() && !exp_month.empty())
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        date = exp_year + "-" + exp_month;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExpectFilledField("Expiration Date", "ccmonth", date.c_str(), "month",
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        filled_form.fields[offset + 2]);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExpectFilledField("Expiration Date", "ccmonth", expiration_month, "text",
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        filled_form.fields[offset + 2]);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExpectFilledField("", "ccyear", expiration_year, "text",
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        filled_form.fields[offset + 3]);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectFilledAddressFormElvis(int page_id,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const FormData& filled_form,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int expected_page_id,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool has_credit_card_fields) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectFilledForm(page_id, filled_form, expected_page_id, "Elvis", "Aaron",
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "Presley", "3734 Elvis Presley Blvd.", "Apt. 10", "Memphis",
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "Tennessee", "38116", "United States", "12345678901",
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "theking@gmail.com", "", "", "", "", true,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   has_credit_card_fields, false);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectFilledCreditCardFormElvis(int page_id,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const FormData& filled_form,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int expected_page_id,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool has_address_fields) {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectFilledForm(page_id, filled_form, expected_page_id,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "", "", "", "", "", "", "", "", "", "", "",
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "Elvis Presley", "4234567890123456", "04", "2012",
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   has_address_fields, true, false);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectFilledCreditCardYearMonthWithYearMonth(int page_id,
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  const FormData& filled_form,
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  int expected_page_id,
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  bool has_address_fields,
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  const char* year,
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  const char* month) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectFilledForm(page_id, filled_form, expected_page_id,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "", "", "", "", "", "", "", "", "", "", "",
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "Miku Hatsune", "4234567890654321", month, year,
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   has_address_fields, true, true);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MockAutocompleteHistoryManager : public AutocompleteHistoryManager {
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MockAutocompleteHistoryManager(AutofillDriver* driver,
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 AutofillManagerDelegate* delegate)
445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : AutocompleteHistoryManager(driver, delegate) {}
446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MOCK_METHOD1(OnFormSubmitted, void(const FormData& form));
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MockAutocompleteHistoryManager);
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MockAutofillDriver : public TestAutofillDriver {
454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit MockAutofillDriver(content::WebContents* web_contents)
456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : TestAutofillDriver(web_contents) {}
457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Mock methods to enable testability.
459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MOCK_METHOD2(SendFormDataToRenderer, void(int query_id,
460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            const FormData& data));
461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MockAutofillDriver);
464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestAutofillManager : public AutofillManager {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestAutofillManager(AutofillDriver* driver,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      autofill::AutofillManagerDelegate* delegate,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      TestPersonalDataManager* personal_data)
4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : AutofillManager(driver, delegate, personal_data),
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        personal_data_(personal_data),
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        autofill_enabled_(true) {}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestAutofillManager() {}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsAutofillEnabled() const OVERRIDE { return autofill_enabled_; }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_autofill_enabled(bool autofill_enabled) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_enabled_ = autofill_enabled;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<std::pair<WebFormElement::AutocompleteResult, FormData> >&
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_autocomplete_results() const {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return request_autocomplete_results_;
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_expected_submitted_field_types(
4893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      const std::vector<ServerFieldTypeSet>& expected_types) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_submitted_field_types_ = expected_types;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UploadFormDataAsyncCallback(
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FormStructure* submitted_form,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& load_time,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& interaction_time,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::TimeTicks& submission_time) OVERRIDE {
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop_runner_->Quit();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we have expected field types set, make sure they match.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!expected_submitted_field_types_.empty()) {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(expected_submitted_field_types_.size(),
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                submitted_form->field_count());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t i = 0; i < expected_submitted_field_types_.size(); ++i) {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SCOPED_TRACE(
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::StringPrintf(
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "Field %d with value %s", static_cast<int>(i),
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                UTF16ToUTF8(submitted_form->field(i)->value).c_str()));
5093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        const ServerFieldTypeSet& possible_types =
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            submitted_form->field(i)->possible_types();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(expected_submitted_field_types_[i].size(),
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  possible_types.size());
5133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        for (ServerFieldTypeSet::const_iterator it =
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 expected_submitted_field_types_[i].begin();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             it != expected_submitted_field_types_[i].end(); ++it) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_TRUE(possible_types.count(*it))
517bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch              << "Expected type: " << AutofillType(*it).ToString();
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillManager::UploadFormDataAsyncCallback(submitted_form,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 load_time,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 interaction_time,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 submission_time);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Resets the MessageLoopRunner so that it can wait for an asynchronous form
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // submission to complete.
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetMessageLoopRunner() {
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop_runner_ = new content::MessageLoopRunner();
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the asynchronous OnFormSubmitted() call to complete.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForAsyncFormSubmit() {
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop_runner_->Run();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UploadFormData(const FormStructure& submitted_form) OVERRIDE {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    submitted_form_signature_ = submitted_form.FormSignature();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string GetSubmittedFormSignature() {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return submitted_form_signature_;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* GetProfileWithGUID(const char* guid) {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return personal_data_->GetProfileWithGUID(guid);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard* GetCreditCardWithGUID(const char* guid) {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return personal_data_->GetCreditCardWithGUID(guid);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddProfile(AutofillProfile* profile) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    personal_data_->AddProfile(profile);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddCreditCard(CreditCard* credit_card) {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    personal_data_->AddCreditCard(credit_card);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetPackedCreditCardID(int credit_card_id) {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string credit_card_guid =
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::StringPrintf("00000000-0000-0000-0000-%012d", credit_card_id);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PackGUIDs(GUIDPair(credit_card_guid, 0), GUIDPair(std::string(), 0));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddSeenForm(FormStructure* form) {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_structures()->push_back(form);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ClearFormStructures() {
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    form_structures()->clear();
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ReturnAutocompleteResult(
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebFormElement::AutocompleteResult result,
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FormData& form_data) OVERRIDE {
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request_autocomplete_results_.push_back(std::make_pair(result, form_data));
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak reference.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPersonalDataManager* personal_data_;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool autofill_enabled_;
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::pair<WebFormElement::AutocompleteResult, FormData> >
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_autocomplete_results_;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string submitted_form_signature_;
5953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::vector<ServerFieldTypeSet> expected_submitted_field_types_;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestAutofillManager);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass TestAutofillExternalDelegate : public AutofillExternalDelegate {
6017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
6027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  explicit TestAutofillExternalDelegate(content::WebContents* web_contents,
6037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                        AutofillManager* autofill_manager,
6047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                        AutofillDriver* autofill_driver)
6057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : AutofillExternalDelegate(web_contents, autofill_manager,
6067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 autofill_driver),
6077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        on_query_seen_(false),
6087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        on_suggestions_returned_seen_(false) {}
6097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~TestAutofillExternalDelegate() {}
6107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnQuery(int query_id,
6127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       const FormData& form,
6137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       const FormFieldData& field,
6147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       const gfx::RectF& bounds,
6157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       bool display_warning) OVERRIDE {
6167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    on_query_seen_ = true;
6177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    on_suggestions_returned_seen_ = false;
6187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
6197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnSuggestionsReturned(
6217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      int query_id,
6227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const std::vector<base::string16>& autofill_values,
6237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const std::vector<base::string16>& autofill_labels,
6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const std::vector<base::string16>& autofill_icons,
6257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const std::vector<int>& autofill_unique_ids) OVERRIDE {
6267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    on_suggestions_returned_seen_ = true;
6277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    query_id_ = query_id;
6297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    autofill_values_ = autofill_values;
6307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    autofill_labels_ = autofill_labels;
6317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    autofill_icons_ = autofill_icons;
6327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    autofill_unique_ids_ = autofill_unique_ids;
6337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
6347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CheckSuggestions(int expected_page_id,
6367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        size_t expected_num_suggestions,
6377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        const base::string16 expected_values[],
6387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        const base::string16 expected_labels[],
6397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        const base::string16 expected_icons[],
6407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        const int expected_unique_ids[]) {
6417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Ensure that these results are from the most recent query.
6427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(on_suggestions_returned_seen_);
6437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(expected_page_id, query_id_);
6457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_EQ(expected_num_suggestions, autofill_values_.size());
6467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_EQ(expected_num_suggestions, autofill_labels_.size());
6477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_EQ(expected_num_suggestions, autofill_icons_.size());
6487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_EQ(expected_num_suggestions, autofill_unique_ids_.size());
6497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for (size_t i = 0; i < expected_num_suggestions; ++i) {
6507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i));
6517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(expected_values[i], autofill_values_[i]);
6527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(expected_labels[i], autofill_labels_[i]);
6537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(expected_icons[i], autofill_icons_[i]);
6547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      EXPECT_EQ(expected_unique_ids[i], autofill_unique_ids_[i]);
6557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
6567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
6577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool on_query_seen() const {
6597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return on_query_seen_;
6607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
6617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool on_suggestions_returned_seen() const {
6637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return on_suggestions_returned_seen_;
6647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
6657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
6677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Records if OnQuery has been called yet.
6687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool on_query_seen_;
6697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Records if OnSuggestionsReturned has been called after the most recent
6717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // call to OnQuery.
6727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool on_suggestions_returned_seen_;
6737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The query id of the most recent Autofill query.
6757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int query_id_;
6767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The results returned by the most recent Autofill query.
6787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<base::string16> autofill_values_;
6797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<base::string16> autofill_labels_;
6807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<base::string16> autofill_icons_;
6817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<int> autofill_unique_ids_;
6827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestAutofillExternalDelegate);
6847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
6857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillManagerTest : public ChromeRenderViewHostTestHarness {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
6917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ChromeRenderViewHostTestHarness::SetUp();
6927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill::PersonalDataManagerFactory::GetInstance()->SetTestingFactory(
6947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        profile(), TestPersonalDataManager::Build);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    autofill::TabAutofillManagerDelegate::CreateForWebContents(web_contents());
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    personal_data_.SetBrowserContext(profile());
700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    autofill_driver_.reset(new MockAutofillDriver(web_contents()));
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    autofill_manager_.reset(new TestAutofillManager(
7027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        autofill_driver_.get(),
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        autofill::TabAutofillManagerDelegate::FromWebContents(web_contents()),
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &personal_data_));
7057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    external_delegate_.reset(new TestAutofillExternalDelegate(
7077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        web_contents(),
7087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        autofill_manager_.get(),
7097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        autofill_driver_.get()));
7107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    autofill_manager_->SetExternalDelegate(external_delegate_.get());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Order of destruction is important as AutofillManager relies on
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // PersonalDataManager to be around when it gets destroyed. Also, a real
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // AutofillManager is tied to the lifetime of the WebContents, so it must
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be destroyed at the destruction of the WebContents.
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    autofill_manager_.reset();
7197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    autofill_driver_.reset();
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewHostTestHarness::TearDown();
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Remove the BrowserContext so TestPersonalDataManager does not need to
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // care about removing self as an observer in destruction.
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    personal_data_.SetBrowserContext(NULL);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAutofillSuggestions(int query_id,
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const FormData& form,
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const FormFieldData& field) {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->OnQueryFormFieldAutofill(query_id,
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                form,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                field,
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                gfx::Rect(),
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                false);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetAutofillSuggestions(const FormData& form,
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const FormFieldData& field) {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetAutofillSuggestions(kDefaultPageID, form, field);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AutocompleteSuggestionsReturned(
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::vector<base::string16>& result) {
744eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    autofill_manager_->autocomplete_history_manager_->SendSuggestions(&result);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FormsSeen(const std::vector<FormData>& forms) {
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager_->OnFormsSeen(forms, base::TimeTicks(),
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   autofill::NO_SPECIAL_FORMS_SEEN);
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PartialFormsSeen(const std::vector<FormData>& forms) {
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager_->OnFormsSeen(forms, base::TimeTicks(),
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   autofill::PARTIAL_FORMS_SEEN);
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DynamicFormsSeen(const std::vector<FormData>& forms) {
758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager_->OnFormsSeen(forms, base::TimeTicks(),
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   autofill::DYNAMIC_FORMS_SEEN);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FormSubmitted(const FormData& form) {
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager_->ResetMessageLoopRunner();
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_manager_->OnFormSubmitted(form, base::TimeTicks::Now()))
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      autofill_manager_->WaitForAsyncFormSubmit();
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillAutofillFormData(int query_id,
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const FormData& form,
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const FormFieldData& field,
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int unique_id) {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->OnFillAutofillFormData(query_id, form, field, unique_id);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Calls |autofill_manager_->OnFillAutofillFormData()| with the specified
776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // input parameters after setting up the expectation that the mock driver's
777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |SendFormDataToRenderer()| method will be called and saving the parameters
778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // of that call into the |response_query_id| and |response_data| output
779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // parameters.
780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void FillAutofillFormDataAndSaveResults(int input_query_id,
781eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          const FormData& input_form,
782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          const FormFieldData& input_field,
783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          int unique_id,
784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          int* response_query_id,
785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          FormData* response_data) {
786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_CALL(*autofill_driver_, SendFormDataToRenderer(_, _)).
787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        WillOnce((DoAll(testing::SaveArg<0>(response_query_id),
788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        testing::SaveArg<1>(response_data))));
789eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FillAutofillFormData(input_query_id, input_form, input_field, unique_id);
790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int PackGUIDs(const GUIDPair& cc_guid, const GUIDPair& profile_guid) const {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return autofill_manager_->PackGUIDs(cc_guid, profile_guid);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
797eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<MockAutofillDriver> autofill_driver_;
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestAutofillManager> autofill_manager_;
7997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TestAutofillExternalDelegate> external_delegate_;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestPersonalDataManager personal_data_;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used when we want an off the record profile. This will store the original
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile from which the off the record profile is derived.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Profile> other_browser_context_;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestFormStructure : public FormStructure {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit TestFormStructure(const FormData& form)
81058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : FormStructure(form) {}
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestFormStructure() {}
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  void SetFieldTypes(const std::vector<ServerFieldType>& heuristic_types,
8143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                     const std::vector<ServerFieldType>& server_types) {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(field_count(), heuristic_types.size());
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(field_count(), server_types.size());
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < field_count(); ++i) {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutofillField* form_field = field(i);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(form_field);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_field->set_heuristic_type(heuristic_types[i]);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_field->set_server_type(server_types[i]);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateAutofillCount();
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestFormStructure);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return all address profile suggestions when all form fields are
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// empty.
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetProfileSuggestionsEmptyValue) {
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Elvis"),
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Charles")
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inferred labels include full first relevant field, which in this case is
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the address line 1.
855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("3734 Elvis Presley Blvd."),
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("123 Apple St.")
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16(), base::string16()};
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {1, 2};
8617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
8627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
8637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return only matching address profile suggestions when the
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// selected form field has been partially filled out.
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetProfileSuggestionsMatchCharacter) {
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("First Name", "firstname", "E", "text",&field);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {ASCIIToUTF16("Elvis")};
885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {ASCIIToUTF16("3734 Elvis Presley Blvd.")};
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16()};
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {1};
8887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
8897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
8907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return no suggestions when the form has no relevant fields.
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetProfileSuggestionsUnknownFields) {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.name = ASCIIToUTF16("MyForm");
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.method = ASCIIToUTF16("POST");
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.origin = GURL("http://myform.com/form.html");
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.action = GURL("http://myform.com/submit.html");
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.user_submitted = true;
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Username", "username", "", "text",&field);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Password", "password", "", "password",&field);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Quest", "quest", "", "quest", &field);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Color", "color", "", "text", &field);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
9177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we cull duplicate profile suggestions.
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetProfileSuggestionsWithDuplicates) {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a duplicate profile.
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* duplicate_profile =
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new AutofillProfile(
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(autofill_manager_->GetProfileWithGUID(
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "00000000-0000-0000-0000-000000000001")));
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddProfile(duplicate_profile);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Elvis"),
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Charles")
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("3734 Elvis Presley Blvd."),
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("123 Apple St.")
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16(), base::string16()};
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {1, 2};
9537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
9547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
9557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return no suggestions when autofill is disabled.
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetProfileSuggestionsAutofillDisabledByUser) {
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable Autofill.
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->set_autofill_enabled(false);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
9717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return a warning explaining that autofill suggestions are
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unavailable when the form method is GET rather than POST.
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetProfileSuggestionsMethodGet) {
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.method = ASCIIToUTF16("GET");
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {base::string16()};
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16()};
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] =
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {WebKit::WebAutofillClient::MenuItemIDWarningMessage};
9997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
10007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
10017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now add some Autocomplete suggestions. We should return the autocomplete
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // suggestions and the warning; these will be culled by the renderer.
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(kPageID2, form, field);
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> suggestions;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("Jay"));
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("Jason"));
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteSuggestionsReturned(suggestions);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values2[] = {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED),
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Jay"),
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Jason")
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels2[] = { base::string16(), base::string16(),
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        base::string16()};
1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons2[] = { base::string16(), base::string16(),
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       base::string16()};
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids2[] = {-1, 0, 0};
10237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
10247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kPageID2, arraysize(expected_values2), expected_values2,
10257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels2, expected_icons2, expected_unique_ids2);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now clear the test profiles and try again -- we shouldn't return a warning.
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.ClearAutofillProfiles();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
10307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return all credit card profile suggestions when all form fields
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are empty.
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetCreditCardSuggestionsEmptyValue) {
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, false);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field = form.fields[1];
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("************3456"),
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("************8765")
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = { ASCIIToUTF16("*3456"),
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       ASCIIToUTF16("*8765")};
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {
1057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kVisaCard),
1058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kMasterCard)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(4),
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(5)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
10657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
10667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return only matching credit card profile suggestions when the
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// selected form field has been partially filled out.
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetCreditCardSuggestionsMatchCharacter) {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, false);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Card Number", "cardnumber", "4", "text", &field);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {ASCIIToUTF16("************3456")};
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {ASCIIToUTF16("*3456")};
1089eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 expected_icons[] = {ASCIIToUTF16(kVisaCard)};
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {autofill_manager_->GetPackedCreditCardID(4)};
10917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
10927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
10937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return credit card profile suggestions when the selected form
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// field is not the credit card number field.
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetCreditCardSuggestionsNonCCNumber) {
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, false);
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Elvis Presley"),
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Buddy Holly")
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = { ASCIIToUTF16("*3456"),
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       ASCIIToUTF16("*8765") };
1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {
1120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kVisaCard),
1121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kMasterCard)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(4),
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(5)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
11287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
11297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return a warning explaining that credit card profile suggestions
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are unavailable when the form is not https.
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetCreditCardSuggestionsNonHTTPS) {
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, false, false);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {base::string16()};
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16()};
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {-1};
11557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
11567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
11577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now add some Autocomplete suggestions. We should show the autocomplete
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // suggestions and the warning.
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(kPageID2, form, field);
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> suggestions;
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("Jay"));
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("Jason"));
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteSuggestionsReturned(suggestions);
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values2[] = {
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION),
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Jay"),
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Jason")
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels2[] = { base::string16(), base::string16(),
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        base::string16() };
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons2[] = { base::string16(), base::string16(),
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       base::string16() };
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids2[] = {-1, 0, 0};
11797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
11807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kPageID2, arraysize(expected_values2), expected_values2,
11817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels2, expected_icons2, expected_unique_ids2);
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the test credit cards and try again -- we shouldn't return a warning.
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.ClearCreditCards();
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
11867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return all credit card suggestions in the case that two cards
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have the same obfuscated number.
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetCreditCardSuggestionsRepeatedObfuscatedNumber) {
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a credit card with the same obfuscated number as Elvis's.
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |credit_card| will be owned by the mock PersonalDataManager.
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard* credit_card = new CreditCard;
1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetCreditCardInfo(credit_card, "Elvis Presley",
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "5231567890123456",  // Mastercard
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          "04", "2012");
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card->set_guid("00000000-0000-0000-0000-000000000007");
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddCreditCard(credit_card);
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, false);
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field = form.fields[1];
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("************3456"),
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("************8765"),
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("************3456")
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("*3456"),
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("*8765"),
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("*3456"),
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {
1226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kVisaCard),
1227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kMasterCard),
1228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kMasterCard)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(4),
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(5),
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(7)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
12367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
12377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return profile and credit card suggestions for combined forms.
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetAddressAndCreditCardSuggestions) {
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, false);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field = form.fields[0];
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right address suggestions to the external delegate.
1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Elvis"),
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Charles")
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("3734 Elvis Presley Blvd."),
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("123 Apple St.")
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16(), base::string16()};
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {1, 2};
12677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
12687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
12697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field);
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(kPageID2, form, field);
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the credit card suggestions to the external delegate.
1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values2[] = {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("************3456"),
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("************8765")
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels2[] = { ASCIIToUTF16("*3456"),
1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        ASCIIToUTF16("*8765")};
1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons2[] = {
1287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kVisaCard),
1288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16(kMasterCard)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids2[] = {
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(4),
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    autofill_manager_->GetPackedCreditCardID(5)
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
12957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kPageID2, arraysize(expected_values2), expected_values2,
12967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels2, expected_icons2, expected_unique_ids2);
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that for non-https forms with both address and credit card fields, we
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only return address suggestions. Instead of credit card suggestions, we
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should return a warning explaining that credit card profile suggestions are
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unavailable when the form is not https.
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetAddressAndCreditCardSuggestionsNonHttps) {
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, false, false);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field = form.fields[0];
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right suggestions to the external delegate.
1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Elvis"),
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Charles")
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("3734 Elvis Presley Blvd."),
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("123 Apple St.")
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16(), base::string16()};
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {1, 2};
13297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
13307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
13317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field);
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(kPageID2, form, field);
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values2[] = {
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_INSECURE_CONNECTION)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels2[] = {base::string16()};
1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons2[] = {base::string16()};
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids2[] = {-1};
13487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
13497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kPageID2, arraysize(expected_values2), expected_values2,
13507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels2, expected_icons2, expected_unique_ids2);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the test credit cards and try again -- we shouldn't return a warning.
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.ClearCreditCards();
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
13557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(external_delegate_->on_suggestions_returned_seen());
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly combine autofill and autocomplete suggestions.
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetCombinedAutofillAndAutocompleteSuggestions) {
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add some Autocomplete suggestions.
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> suggestions;
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("Jay"));
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This suggestion is a duplicate, and should be trimmed.
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("Elvis"));
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("Jason"));
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteSuggestionsReturned(suggestions);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Elvis"),
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Charles"),
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Jay"),
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Jason")
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("3734 Elvis Presley Blvd."),
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("123 Apple St."),
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16(),
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16()
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = { base::string16(), base::string16(),
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      base::string16(), base::string16()};
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {1, 2, 0, 0};
13947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
13957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
13967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we return autocomplete-like suggestions when trying to autofill
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// already filled forms.
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetFieldSuggestionsWhenFormIsAutofilled) {
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark one of the fields as filled.
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields[2].is_autofilled = true;
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Elvis"),
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Charles")
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {base::string16(), base::string16()};
1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16(), base::string16()};
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {1, 2};
14257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
14267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
14277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that nothing breaks when there are autocomplete suggestions but no
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// autofill suggestions.
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetFieldSuggestionsForAutocompleteOnly) {
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Some Field", "somefield", "", "text", &field);
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add some Autocomplete suggestions.
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> suggestions;
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("one"));
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suggestions.push_back(ASCIIToUTF16("two"));
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteSuggestionsReturned(suggestions);
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("one"),
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("two")
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {base::string16(), base::string16()};
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = {base::string16(), base::string16()};
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {0, 0};
14597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
14607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
14617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we do not return duplicate values drawn from multiple profiles when
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filling an already filled field.
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetFieldSuggestionsWithDuplicateValues) {
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |profile| will be owned by the mock PersonalDataManager.
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile = new AutofillProfile;
1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetProfileInfo(
1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      profile, "Elvis", "", "", "", "", "", "", "", "", "", "", "");
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid("00000000-0000-0000-0000-000000000101");
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddProfile(profile);
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData& field = form.fields[0];
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.is_autofilled = true;
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Elvis");
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = { ASCIIToUTF16("Elvis") };
1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = { base::string16() };
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = { base::string16() };
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = { 1 };
14947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
14957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
14967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that a non-default value is suggested for multi-valued profile, on an
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unfilled form.
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetFieldSuggestionsForMultiValuedProfileUnfilled) {
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |profile| will be owned by the mock PersonalDataManager.
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile = new AutofillProfile;
1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::SetProfileInfo(profile, "Elvis", "", "Presley", "me@x.com", "",
1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       "", "", "", "", "", "", "");
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid("00000000-0000-0000-0000-000000000101");
1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> multi_values(2);
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  multi_values[0] = ASCIIToUTF16("Elvis Presley");
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  multi_values[1] = ASCIIToUTF16("Elena Love");
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile->SetRawMultiInfo(NAME_FULL, multi_values);
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.ClearAutofillProfiles();
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddProfile(profile);
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get the first name field.
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start out with "E", hoping for either "Elvis" or "Elena.
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FormFieldData& field = form.fields[0];
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.value = ASCIIToUTF16("E");
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.is_autofilled = false;
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetAutofillSuggestions(form, field);
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the |Send|.
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutocompleteSuggestionsReturned(std::vector<base::string16>());
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Test that we sent the right values to the external delegate.
1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 expected_values[] = {
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("Elvis"),
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("Elena")
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 expected_labels[] = {
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("me@x.com"),
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("me@x.com")
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 expected_icons[] = { base::string16(), base::string16() };
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_unique_ids[] = { 1, 2 };
15427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    external_delegate_->CheckSuggestions(
15437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        kDefaultPageID, arraysize(expected_values), expected_values,
15447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        expected_labels, expected_icons, expected_unique_ids);
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get the first name field.
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This time, start out with "Ele", hoping for "Elena".
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FormFieldData& field = form.fields[0];
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.value = ASCIIToUTF16("Ele");
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.is_autofilled = false;
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetAutofillSuggestions(form, field);
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trigger the |Send|.
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutocompleteSuggestionsReturned(std::vector<base::string16>());
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Test that we sent the right values to the external delegate.
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 expected_values[] = { ASCIIToUTF16("Elena") };
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 expected_labels[] = { ASCIIToUTF16("me@x.com") };
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 expected_icons[] = { base::string16() };
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_unique_ids[] = { 2 };
15637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    external_delegate_->CheckSuggestions(
15647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        kDefaultPageID, arraysize(expected_values), expected_values,
15657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        expected_labels, expected_icons, expected_unique_ids);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that all values are suggested for multi-valued profile, on a filled
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// form.  This is the per-field "override" case.
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetFieldSuggestionsForMultiValuedProfileFilled) {
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |profile| will be owned by the mock PersonalDataManager.
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile = new AutofillProfile;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid("00000000-0000-0000-0000-000000000102");
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> multi_values(3);
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  multi_values[0] = ASCIIToUTF16("Travis Smith");
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  multi_values[1] = ASCIIToUTF16("Cynthia Love");
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  multi_values[2] = ASCIIToUTF16("Zac Mango");
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile->SetRawMultiInfo(NAME_FULL, multi_values);
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddProfile(profile);
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the first name field.  And start out with "Travis", hoping for all the
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // multi-valued variants as suggestions.
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData& field = form.fields[0];
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Travis");
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.is_autofilled = true;
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trigger the |Send|.
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Travis"),
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Cynthia"),
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Zac")
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = { base::string16(), base::string16(),
1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       base::string16() };
1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = { base::string16(), base::string16(),
1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      base::string16() };
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = { 1, 2, 3 };
16097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
16107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
16117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, GetProfileSuggestionsFancyPhone) {
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile = new AutofillProfile;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid("00000000-0000-0000-0000-000000000103");
1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> multi_values(1);
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  multi_values[0] = ASCIIToUTF16("Natty Bumppo");
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile->SetRawMultiInfo(NAME_FULL, multi_values);
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  multi_values[0] = ASCIIToUTF16("1800PRAIRIE");
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile->SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, multi_values);
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddProfile(profile);
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[9];
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No suggestions provided, so send an empty vector as the results.
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This triggers the combined message send.
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSuggestionsReturned(std::vector<base::string16>());
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that we sent the right values to the external delegate.
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_values[] = {
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("12345678901"),
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("23456789012"),
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("18007724743"),  // 1800PRAIRIE
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inferred labels include full first relevant field, which in this case is
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the address line 1.
1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_labels[] = {
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Elvis Aaron Presley"),
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Charles Hardin Holley"),
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASCIIToUTF16("Natty Bumppo"),
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 expected_icons[] = { base::string16(), base::string16(),
1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      base::string16()};
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_unique_ids[] = {1, 2, 3};
16537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
16547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
16557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill an address form.
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillAddressForm) {
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
1671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
1672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledAddressFormElvis(
1673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      response_page_id, response_data, kDefaultPageID, false);
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that we correctly fill an address form from an auxiliary profile.
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutofillManagerTest, FillAddressFormFromAuxiliaryProfile) {
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  personal_data_.ClearAutofillProfiles();
16795e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  PrefService* prefs = user_prefs::UserPrefs::Get(profile());
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->SetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled, true);
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  personal_data_.CreateTestAuxiliaryProfiles();
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up our form data.
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormData form;
1685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<FormData> forms(1, form);
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormsSeen(forms);
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GUIDPair empty(std::string(), 0);
1691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1693eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
1694eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
1695eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledAddressFormElvis(
1696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      response_page_id, response_data, kDefaultPageID, false);
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a credit card form.
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillCreditCardForm) {
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, false);
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000004", 0);
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1709eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
1712eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(guid, empty), &response_page_id, &response_data);
1713eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledCreditCardFormElvis(
1714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      response_page_id, response_data, kDefaultPageID, false);
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a credit card form with month input type.
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1. year empty, month empty
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillCreditCardFormNoYearNoMonth) {
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as the SetUp(), but generate 4 credit cards with year month
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // combination.
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.CreateTestCreditCardsYearAndMonth("", "");
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, true);
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000007", 0);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1731eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1732eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1733eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
1734eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(guid, empty), &response_page_id, &response_data);
1735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledCreditCardYearMonthWithYearMonth(response_page_id, response_data,
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kDefaultPageID, false, "", "");
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a credit card form with month input type.
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2. year empty, month non-empty
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillCreditCardFormNoYearMonth) {
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as the SetUp(), but generate 4 credit cards with year month
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // combination.
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.CreateTestCreditCardsYearAndMonth("", "04");
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, true);
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000007", 0);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
1757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(guid, empty), &response_page_id, &response_data);
1758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledCreditCardYearMonthWithYearMonth(response_page_id, response_data,
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kDefaultPageID, false, "", "04");
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a credit card form with month input type.
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3. year non-empty, month empty
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillCreditCardFormYearNoMonth) {
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as the SetUp(), but generate 4 credit cards with year month
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // combination.
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.CreateTestCreditCardsYearAndMonth("2012", "");
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, true);
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000007", 0);
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
1779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(guid, empty), &response_page_id, &response_data);
1780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledCreditCardYearMonthWithYearMonth(response_page_id, response_data,
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kDefaultPageID, false, "2012", "");
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a credit card form with month input type.
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4. year non-empty, month empty
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillCreditCardFormYearMonth) {
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as the SetUp(), but generate 4 credit cards with year month
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // combination.
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.ClearCreditCards();
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  personal_data_.CreateTestCreditCardsYearAndMonth("2012", "04");
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, true);
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000007", 0);
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1799eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
1802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(guid, empty), &response_page_id, &response_data);
1803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledCreditCardYearMonthWithYearMonth(response_page_id, response_data,
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kDefaultPageID, false, "2012", "04");
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a combined address and credit card form.
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillAddressAndCreditCardForm) {
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, false);
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First fill the address data.
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1820eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Address");
1823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
1824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        PackGUIDs(empty, guid), &response_page_id, &response_data);
1825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledAddressFormElvis(
1826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        response_page_id, response_data, kDefaultPageID, true);
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now fill the credit card data.
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid2("00000000-0000-0000-0000-000000000004", 0);
1832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FillAutofillFormDataAndSaveResults(kPageID2, form, form.fields.back(),
1835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        PackGUIDs(guid2, empty), &response_page_id, &response_data);
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Credit card");
1837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledCreditCardFormElvis(
1838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        response_page_id, response_data, kPageID2, true);
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a form that has multiple logical sections, e.g.
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// both a billing and a shipping address.
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillFormWithMultipleSections) {
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kAddressFormSize = form.fields.size();
1849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = kAddressFormSize; i < form.fields.size(); ++i) {
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the fields have distinct names.
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form.fields[i].name = form.fields[i].name + ASCIIToUTF16("_");
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the first section.
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
1863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Address 1");
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The second address section should be empty.
1867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(response_data.fields.size(), 2*kAddressFormSize);
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = kAddressFormSize; i < form.fields.size(); ++i) {
1869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_EQ(base::string16(), response_data.fields[i].value);
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The first address section should be filled with Elvis's data.
1873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    response_data.fields.resize(kAddressFormSize);
1874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledAddressFormElvis(
1875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        response_page_id, response_data, kDefaultPageID, false);
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the second section, with the initiating field somewhere in the middle
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the section.
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid2("00000000-0000-0000-0000-000000000001", 0);
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(9U, kAddressFormSize);
1883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
1884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(
1885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kPageID2, form, form.fields[kAddressFormSize + 9],
1886eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid2), &response_page_id, &response_data);
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Address 2");
1889eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(response_data.fields.size(), form.fields.size());
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The first address section should be empty.
1892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(response_data.fields.size(), 2*kAddressFormSize);
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < kAddressFormSize; ++i) {
1894eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_EQ(base::string16(), response_data.fields[i].value);
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The second address section should be filled with Elvis's data.
1898eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FormData secondSection = response_data;
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    secondSection.fields.erase(secondSection.fields.begin(),
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               secondSection.fields.begin() + kAddressFormSize);
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < kAddressFormSize; ++i) {
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Restore the expected field names.
1903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::string16 name = secondSection.fields[i].name;
1904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::string16 original_name = name.substr(0, name.size() - 1);
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      secondSection.fields[i].name = original_name;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1907eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledAddressFormElvis(
1908eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        response_page_id, secondSection, kPageID2, false);
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a form that has author-specified sections, which
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// might not match our expected section breakdown.
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillFormWithAuthorSpecifiedSections) {
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a form with a billing section and an unnamed section, interleaved.
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The billing section includes both address and credit card fields.
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.name = ASCIIToUTF16("MyForm");
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.method = ASCIIToUTF16("POST");
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.origin = GURL("https://myform.com/form.html");
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.action = GURL("https://myform.com/submit.html");
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.user_submitted = true;
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "country", "", "text", &field);
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-billing country";
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "firstname", "", "text", &field);
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "given-name";
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "lastname", "", "text", &field);
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "family-name";
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "address", "", "text", &field);
1939a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  field.autocomplete_attribute = "section-billing address-line1";
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "city", "", "text", &field);
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-billing locality";
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "state", "", "text", &field);
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-billing region";
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "zip", "", "text", &field);
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-billing postal-code";
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "ccname", "", "text", &field);
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-billing cc-name";
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "ccnumber", "", "text", &field);
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-billing cc-number";
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "ccexp", "", "text", &field);
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-billing cc-exp";
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "email", "", "text", &field);
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "email";
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the unnamed section.
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
1976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
1977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
1978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[1],
1979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Unnamed section");
1982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(kDefaultPageID, response_page_id);
1983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(ASCIIToUTF16("MyForm"), response_data.name);
1984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(ASCIIToUTF16("POST"), response_data.method);
1985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(GURL("https://myform.com/form.html"), response_data.origin);
1986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(GURL("https://myform.com/submit.html"), response_data.action);
1987eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(response_data.user_submitted);
1988eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(11U, response_data.fields.size());
1989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "country", "", "text", response_data.fields[0]);
1991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "firstname", "Elvis", "text",
1992eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      response_data.fields[1]);
1993eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "lastname", "Presley", "text",
1994eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      response_data.fields[2]);
1995eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "address", "", "text", response_data.fields[3]);
1996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "city", "", "text", response_data.fields[4]);
1997eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "state", "", "text", response_data.fields[5]);
1998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "zip", "", "text", response_data.fields[6]);
1999eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "ccname", "", "text", response_data.fields[7]);
2000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "ccnumber", "", "text", response_data.fields[8]);
2001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "ccexp", "", "text", response_data.fields[9]);
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("", "email", "theking@gmail.com", "text",
2003eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      response_data.fields[10]);
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the address portion of the billing section.
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid2("00000000-0000-0000-0000-000000000001", 0);
2009eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2010eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kPageID2, form, form.fields[0],
2011eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid2), &response_page_id, &response_data);
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Billing address");
2014eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(kPageID2, response_page_id);
2015eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(ASCIIToUTF16("MyForm"), response_data.name);
2016eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(ASCIIToUTF16("POST"), response_data.method);
2017eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(GURL("https://myform.com/form.html"), response_data.origin);
2018eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(GURL("https://myform.com/submit.html"), response_data.action);
2019eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(response_data.user_submitted);
2020eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(11U, response_data.fields.size());
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2022ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFilledField("", "country", "US", "text",
2023eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      response_data.fields[0]);
2024eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "firstname", "", "text", response_data.fields[1]);
2025eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "lastname", "", "text", response_data.fields[2]);
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("", "address", "3734 Elvis Presley Blvd.", "text",
2027eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      response_data.fields[3]);
2028eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "city", "Memphis", "text", response_data.fields[4]);
2029eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "state", "Tennessee", "text",
2030eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      response_data.fields[5]);
2031eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "zip", "38116", "text", response_data.fields[6]);
2032eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "ccname", "", "text", response_data.fields[7]);
2033eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "ccnumber", "", "text", response_data.fields[8]);
2034eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "ccexp", "", "text", response_data.fields[9]);
2035eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "email", "", "text", response_data.fields[10]);
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the credit card portion of the billing section.
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID3 = 3;
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid3("00000000-0000-0000-0000-000000000004", 0);
2041eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2042eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(
2043eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kPageID3, form, form.fields[form.fields.size() - 2],
2044eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(guid3, empty), &response_page_id, &response_data);
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Credit card");
2047eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(kPageID3, response_page_id);
2048eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(ASCIIToUTF16("MyForm"), response_data.name);
2049eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(ASCIIToUTF16("POST"), response_data.method);
2050eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(GURL("https://myform.com/form.html"), response_data.origin);
2051eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(GURL("https://myform.com/submit.html"), response_data.action);
2052eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(response_data.user_submitted);
2053eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(11U, response_data.fields.size());
2054eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "country", "", "text", response_data.fields[0]);
2056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "firstname", "", "text", response_data.fields[1]);
2057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "lastname", "", "text", response_data.fields[2]);
2058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "address", "", "text", response_data.fields[3]);
2059eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "city", "", "text", response_data.fields[4]);
2060eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "state", "", "text", response_data.fields[5]);
2061eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "zip", "", "text", response_data.fields[6]);
2062eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "ccname", "Elvis Presley", "text",
2063eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      response_data.fields[7]);
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectFilledField("", "ccnumber", "4234567890123456", "text",
2065eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      response_data.fields[8]);
2066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "ccexp", "04/2012", "text", response_data.fields[9]);
2067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledField("", "email", "", "text", response_data.fields[10]);
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a form that has a single logical section with
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multiple email address fields.
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillFormWithMultipleEmails) {
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Confirm email", "email2", "", "text", &field);
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the form.
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
2087eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
2089eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
2090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The second email address should be filled.
2093eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("theking@gmail.com"),
2094eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            response_data.fields.back().value);
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The remainder of the form should be filled as usual.
2097eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_data.fields.pop_back();
2098eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledAddressFormElvis(
2099eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      response_page_id, response_data, kDefaultPageID, false);
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a previously auto-filled form.
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillAutofilledForm) {
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark one of the address fields as autofilled.
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields[4].is_autofilled = true;
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateTestCreditCardFormData(&form, true, false);
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First fill the address data.
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
2116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
2118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(),
2119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Address");
2122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledForm(response_page_id, response_data, kDefaultPageID,
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "Elvis", "", "", "", "", "", "", "", "", "", "", "", "",
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "", "", true, true, false);
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now fill the credit card data.
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid2("00000000-0000-0000-0000-000000000004", 0);
2130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kPageID2, form, form.fields.back(),
2132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(guid2, empty), &response_page_id, &response_data);
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Credit card 1");
2135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledCreditCardFormElvis(
2136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        response_page_id, response_data, kPageID2, true);
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now set the credit card fields to also be auto-filled, and try again to
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fill the credit card data
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<FormFieldData>::iterator iter = form.fields.begin();
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != form.fields.end();
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++iter) {
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iter->is_autofilled = true;
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID3 = 3;
2148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kPageID3, form, *form.fields.rbegin(),
2150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(guid2, empty), &response_page_id, &response_data);
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Credit card 2");
2153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledForm(response_page_id, response_data, kPageID3,
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "", "", "", "", "", "", "", "", "", "", "", "", "", "",
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "2012", true, true, false);
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill an address form with a non-default variant for a
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multi-valued field.
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillAddressFormWithVariantType) {
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a name variant to the Elvis profile.
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile = autofill_manager_->GetProfileWithGUID(
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "00000000-0000-0000-0000-000000000001");
2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 elvis_name = profile->GetRawInfo(NAME_FULL);
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> name_variants;
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name_variants.push_back(ASCIIToUTF16("Some Other Guy"));
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name_variants.push_back(elvis_name);
21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile->SetRawMultiInfo(NAME_FULL, name_variants);
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid(profile->guid(), 1);
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
2180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data1;
2182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
2183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data1);
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Valid variant");
2186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledAddressFormElvis(
2187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        response_page_id, response_data1, kDefaultPageID, false);
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try filling with a variant that doesn't exist.  The fields to which this
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // variant would normally apply should not be filled.
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPageID2 = 2;
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid2(profile->guid(), 2);
2194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data2;
2196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kPageID2, form, form.fields[0],
2197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid2), &response_page_id, &response_data2);
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Invalid variant");
2200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectFilledForm(response_page_id, response_data2, kPageID2, "", "", "",
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "3734 Elvis Presley Blvd.", "Apt. 10", "Memphis",
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "Tennessee", "38116", "United States", "12345678901",
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "theking@gmail.com", "", "", "", "", true, false, false);
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we correctly fill a phone number split across multiple fields.
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FillPhoneNumber) {
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In one form, rely on the maxlength attribute to imply phone number parts.
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the other form, rely on the autocompletetype attribute.
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form_with_maxlength;
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_with_maxlength.name = ASCIIToUTF16("MyMaxlengthPhoneForm");
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_with_maxlength.method = ASCIIToUTF16("POST");
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_with_maxlength.origin = GURL("http://myform.com/phone_form.html");
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_with_maxlength.action = GURL("http://myform.com/phone_submit.html");
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_with_maxlength.user_submitted = true;
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form_with_autocompletetype = form_with_maxlength;
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_with_autocompletetype.name = ASCIIToUTF16("MyAutocompletetypePhoneForm");
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* label;
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* name;
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t max_length;
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* autocomplete_attribute;
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_fields[] = {
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "country code", "country_code", 1, "tel-country-code" },
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "area code", "area_code", 3, "tel-area-code" },
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "phone", "phone_prefix", 3, "tel-local-prefix" },
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "-", "phone_suffix", 4, "tel-local-suffix" },
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Phone Extension", "ext", 3, "tel-extension" }
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t default_max_length = field.max_length;
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_fields); ++i) {
2236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::CreateTestFormField(
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_fields[i].label, test_fields[i].name, "", "text", &field);
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.max_length = test_fields[i].max_length;
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.autocomplete_attribute = std::string();
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_with_maxlength.fields.push_back(field);
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.max_length = default_max_length;
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.autocomplete_attribute = test_fields[i].autocomplete_attribute;
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_with_autocompletetype.fields.push_back(field);
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms;
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(form_with_maxlength);
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forms.push_back(form_with_autocompletetype);
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be able to fill prefix and suffix fields for US numbers.
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* work_profile = autofill_manager_->GetProfileWithGUID(
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "00000000-0000-0000-0000-000000000002");
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(work_profile != NULL);
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER,
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ASCIIToUTF16("16505554567"));
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid(work_profile->guid(), 0);
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int page_id = 1;
2262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data1;
2264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(page_id, form_with_maxlength,
2265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      *form_with_maxlength.fields.begin(),
2266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data1);
2267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, response_page_id);
2268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(5U, response_data1.fields.size());
2270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("1"), response_data1.fields[0].value);
2271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("650"), response_data1.fields[1].value);
2272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("555"), response_data1.fields[2].value);
2273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("4567"), response_data1.fields[3].value);
2274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(base::string16(), response_data1.fields[4].value);
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_id = 2;
2277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data2;
2279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(page_id, form_with_autocompletetype,
2280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      *form_with_autocompletetype.fields.begin(),
2281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data2);
2282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(2, response_page_id);
2283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(5U, response_data2.fields.size());
2285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("1"), response_data2.fields[0].value);
2286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("650"), response_data2.fields[1].value);
2287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("555"), response_data2.fields[2].value);
2288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("4567"), response_data2.fields[3].value);
2289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(base::string16(), response_data2.fields[4].value);
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should not be able to fill prefix and suffix fields for international
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // numbers.
22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  work_profile->SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("GB"));
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER,
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ASCIIToUTF16("447700954321"));
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_id = 3;
2297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data3;
2299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(page_id, form_with_maxlength,
2300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      *form_with_maxlength.fields.begin(),
2301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data3);
2302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(3, response_page_id);
2303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(5U, response_data3.fields.size());
2305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("44"), response_data3.fields[0].value);
2306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("7700"), response_data3.fields[1].value);
2307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("954321"), response_data3.fields[2].value);
2308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("954321"), response_data3.fields[3].value);
2309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(base::string16(), response_data3.fields[4].value);
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_id = 4;
2312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data4;
2314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(page_id, form_with_autocompletetype,
2315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      *form_with_autocompletetype.fields.begin(),
2316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data4);
2317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(4, response_page_id);
2318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(5U, response_data4.fields.size());
2320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("44"), response_data4.fields[0].value);
2321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("7700"), response_data4.fields[1].value);
2322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("954321"), response_data4.fields[2].value);
2323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("954321"), response_data4.fields[3].value);
2324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(base::string16(), response_data4.fields[4].value);
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should fill all phone fields with the same phone number variant.
2327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> phone_variants;
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  phone_variants.push_back(ASCIIToUTF16("16505554567"));
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  phone_variants.push_back(ASCIIToUTF16("18887771234"));
23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  work_profile->SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  work_profile->SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, phone_variants);
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_id = 5;
2334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_page_id = 0;
2335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data5;
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair variant_guid(work_profile->guid(), 1);
2337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(page_id, form_with_maxlength,
2338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      *form_with_maxlength.fields.begin(),
2339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, variant_guid), &response_page_id, &response_data5);
2340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(5, response_page_id);
2341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(5U, response_data5.fields.size());
2343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("1"), response_data5.fields[0].value);
2344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("888"), response_data5.fields[1].value);
2345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("777"), response_data5.fields[2].value);
2346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("1234"), response_data5.fields[3].value);
2347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(base::string16(), response_data5.fields[4].value);
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can still fill a form when a field has been removed from it.
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FormChangesRemoveField) {
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a field -- we'll remove it again later.
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
2358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("Some", "field", "", "text", &field);
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.insert(form.fields.begin() + 3, field);
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, after the call to |FormsSeen|, we remove the field before filling.
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.erase(form.fields.begin() + 3);
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
2369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
2371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
2372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
2373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledAddressFormElvis(
2374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      response_page_id, response_data, kDefaultPageID, false);
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can still fill a form when a field has been added to it.
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FormChangesAddField) {
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The offset of the phone field in the address form.
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPhoneFieldOffset = 9;
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the phone field -- we'll add it back later.
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormFieldData>::iterator pos =
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form.fields.begin() + kPhoneFieldOffset;
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field = *pos;
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pos = form.fields.erase(pos);
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, after the call to |FormsSeen|, we restore the field before filling.
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.insert(pos, field);
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
2400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
2402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
2403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
2404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledAddressFormElvis(
2405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      response_page_id, response_data, kDefaultPageID, false);
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we are able to save form data when forms are submitted.
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FormSubmitted) {
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the form.
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
2419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
2421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
2422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
2423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledAddressFormElvis(
2424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      response_page_id, response_data, kDefaultPageID, false);
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate form submission. We should call into the PDM to try to save the
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // filled data.
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(personal_data_, SaveImportedProfile(::testing::_)).Times(1);
2429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormSubmitted(response_data);
2430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that when Autocomplete is enabled and Autofill is disabled,
2433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// form submissions are still received by AutocompleteHistoryManager.
2434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(AutofillManagerTest, FormSubmittedAutocompleteEnabled) {
2435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestAutofillManagerDelegate delegate;
2436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  autofill_manager_.reset(new TestAutofillManager(
2437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      autofill_driver_.get(),
2438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &delegate,
2439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      NULL));
2440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  autofill_manager_->set_autofill_enabled(false);
2441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<MockAutocompleteHistoryManager> autocomplete_history_manager;
2442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  autocomplete_history_manager.reset(
2443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new MockAutocompleteHistoryManager(autofill_driver_.get(), &delegate));
2444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  autofill_manager_->autocomplete_history_manager_ =
2445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      autocomplete_history_manager.Pass();
2446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Set up our form data.
2448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData form;
2449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
2450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form.method = ASCIIToUTF16("GET");
2451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MockAutocompleteHistoryManager* m = static_cast<
2452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      MockAutocompleteHistoryManager*>(
2453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          autofill_manager_->autocomplete_history_manager_.get());
2454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_CALL(*m,
2455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              OnFormSubmitted(_)).Times(1);
2456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormSubmitted(form);
2457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that when Autocomplete is enabled and Autofill is disabled,
2460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Autocomplete suggestions are still received.
2461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(AutofillManagerTest, AutocompleteSuggestionsWhenAutofillDisabled) {
2462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestAutofillManagerDelegate delegate;
2463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  autofill_manager_.reset(new TestAutofillManager(
2464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      autofill_driver_.get(),
2465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &delegate,
2466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      NULL));
2467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  autofill_manager_->set_autofill_enabled(false);
24687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  autofill_manager_->SetExternalDelegate(external_delegate_.get());
2469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Set up our form data.
2471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData form;
2472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
2473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form.method = ASCIIToUTF16("GET");
2474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<FormData> forms(1, form);
2475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormsSeen(forms);
2476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const FormFieldData& field = form.fields[0];
2477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetAutofillSuggestions(form, field);
2478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Add some Autocomplete suggestions. We should return the autocomplete
2480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // suggestions, these will be culled by the renderer.
2481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<base::string16> suggestions;
2482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  suggestions.push_back(ASCIIToUTF16("Jay"));
2483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  suggestions.push_back(ASCIIToUTF16("Jason"));
2484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AutocompleteSuggestionsReturned(suggestions);
2485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 expected_values[] = {
2487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16("Jay"),
2488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASCIIToUTF16("Jason")
2489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
2490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 expected_labels[] = { base::string16(), base::string16()};
2491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::string16 expected_icons[] = { base::string16(), base::string16()};
2492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int expected_unique_ids[] = {0, 0};
24937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  external_delegate_->CheckSuggestions(
24947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      kDefaultPageID, arraysize(expected_values), expected_values,
24957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      expected_labels, expected_icons, expected_unique_ids);
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we are able to save form data when forms are submitted and we only
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have server data for the field types.
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FormSubmittedServerTypes) {
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate having seen this form on page load.
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |form_structure| will be owned by |autofill_manager_|.
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestFormStructure* form_structure = new TestFormStructure(form);
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillMetrics metrics_logger;  // ignored
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(metrics_logger);
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the heuristic types, and instead set the appropriate server types.
25123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::vector<ServerFieldType> heuristic_types, server_types;
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < form.fields.size(); ++i) {
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heuristic_types.push_back(UNKNOWN_TYPE);
2515bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    server_types.push_back(form_structure->field(i)->heuristic_type());
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->SetFieldTypes(heuristic_types, server_types);
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddSeenForm(form_structure);
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the form.
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
2523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
2525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[0],
2526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
2527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectFilledAddressFormElvis(
2528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      response_page_id, response_data, kDefaultPageID, false);
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate form submission. We should call into the PDM to try to save the
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // filled data.
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(personal_data_, SaveImportedProfile(::testing::_)).Times(1);
2533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormSubmitted(response_data);
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the form signature for an uploaded form always matches the form
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature from the query.
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FormSubmittedWithDifferentFields) {
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cache the expected form signature.
254658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string signature = FormStructure(form).FormSignature();
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the structure of the form prior to submission.
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Websites would typically invoke JavaScript either on page load or on form
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // submit to achieve this.
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.pop_back();
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field = form.fields[3];
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields[3] = form.fields[7];
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields[7] = field;
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate form submission.
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormSubmitted(form);
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(signature, autofill_manager_->GetSubmittedFormSignature());
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we do not save form data when submitted fields contain default
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// values.
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, FormSubmittedWithDefaultValues) {
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up our form data.
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields[3].value = ASCIIToUTF16("Enter your address");
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert the state field to a <select> popup, to make sure that we only
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reject default values for text fields.
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(form.fields[6].name == ASCIIToUTF16("state"));
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields[6].form_control_type = "select-one";
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields[6].value = ASCIIToUTF16("Tennessee");
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill the form.
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid("00000000-0000-0000-0000-000000000001", 0);
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
2581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int response_page_id = 0;
2582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormData response_data;
2583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FillAutofillFormDataAndSaveResults(kDefaultPageID, form, form.fields[3],
2584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PackGUIDs(empty, guid), &response_page_id, &response_data);
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate form submission.  We should call into the PDM to try to save the
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // filled data.
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(personal_data_, SaveImportedProfile(::testing::_)).Times(1);
2589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormSubmitted(response_data);
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the address field's value back to the default value.
2592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  response_data.fields[3].value = ASCIIToUTF16("Enter your address");
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate form submission.  We should not call into the PDM to try to save
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the filled data, since the filled form is effectively missing an address.
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(personal_data_, SaveImportedProfile(::testing::_)).Times(0);
2597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FormSubmitted(response_data);
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that resetting the auxiliary profile enabled preference does the right
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thing on all platforms.
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, AuxiliaryProfilesReset) {
26035e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  PrefService* prefs = user_prefs::UserPrefs::Get(profile());
2604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_ANDROID)
2605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Auxiliary profiles is implemented on Mac and Android only.
2606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // OSX: enables Mac Address Book integration.
2607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Android: enables integration with user's contact profile.
2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(
2609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs->GetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled));
2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->SetBoolean(
2611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ::autofill::prefs::kAutofillAuxiliaryProfilesEnabled, false);
2612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->ClearPref(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled);
2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(
2614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs->GetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled));
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(
2617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs->GetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled));
2618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->SetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled, true);
2619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->ClearPref(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled);
2620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(
2621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs->GetBoolean(::autofill::prefs::kAutofillAuxiliaryProfilesEnabled));
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, DeterminePossibleFieldTypesForUpload) {
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.name = ASCIIToUTF16("MyForm");
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.method = ASCIIToUTF16("POST");
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.origin = GURL("http://myform.com/form.html");
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.action = GURL("http://myform.com/submit.html");
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.user_submitted = true;
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::vector<ServerFieldTypeSet> expected_types;
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These fields should all match.
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
26373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldTypeSet types;
2638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "1", "Elvis", "text", &field);
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(NAME_FIRST);
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "2", "Aaron", "text", &field);
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(NAME_MIDDLE);
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "3", "A", "text", &field);
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(NAME_MIDDLE_INITIAL);
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "4", "Presley", "text", &field);
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(NAME_LAST);
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "5", "Elvis Presley", "text", &field);
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(CREDIT_CARD_NAME);
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "6", "Elvis Aaron Presley", "text",
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &field);
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(NAME_FULL);
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "7", "theking@gmail.com", "email",
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &field);
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(EMAIL_ADDRESS);
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "8", "RCA", "text", &field);
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(COMPANY_NAME);
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "9", "3734 Elvis Presley Blvd.",
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "text", &field);
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(ADDRESS_HOME_LINE1);
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "10", "Apt. 10", "text", &field);
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(ADDRESS_HOME_LINE2);
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "11", "Memphis", "text", &field);
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(ADDRESS_HOME_CITY);
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "12", "Tennessee", "text", &field);
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(ADDRESS_HOME_STATE);
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "13", "38116", "text", &field);
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(ADDRESS_HOME_ZIP);
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "14", "USA", "text", &field);
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(ADDRESS_HOME_COUNTRY);
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "15", "United States", "text", &field);
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(ADDRESS_HOME_COUNTRY);
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "16", "+1 (234) 567-8901", "text",
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &field);
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(PHONE_HOME_WHOLE_NUMBER);
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "17", "2345678901", "text", &field);
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(PHONE_HOME_CITY_AND_NUMBER);
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "18", "1", "text", &field);
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(PHONE_HOME_COUNTRY_CODE);
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "19", "234", "text", &field);
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(PHONE_HOME_CITY_CODE);
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "20", "5678901", "text", &field);
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(PHONE_HOME_NUMBER);
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "21", "567", "text", &field);
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(PHONE_HOME_NUMBER);
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "22", "8901", "text", &field);
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(PHONE_HOME_NUMBER);
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "23", "4234-5678-9012-3456", "text",
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &field);
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(CREDIT_CARD_NUMBER);
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "24", "04", "text", &field);
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(CREDIT_CARD_EXP_MONTH);
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "25", "April", "text", &field);
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(CREDIT_CARD_EXP_MONTH);
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "26", "2012", "text", &field);
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(CREDIT_CARD_EXP_4_DIGIT_YEAR);
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "27", "12", "text", &field);
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(CREDIT_CARD_EXP_2_DIGIT_YEAR);
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "28", "04/2012", "text", &field);
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that we trim whitespace properly.
2812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "29", "", "text", &field);
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(EMPTY_TYPE);
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "30", " ", "text", &field);
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(EMPTY_TYPE);
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "31", " Elvis", "text", &field);
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(NAME_FIRST);
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "32", "Elvis ", "text", &field);
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(NAME_FIRST);
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These fields should not match, as they differ by case.
2837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "33", "elvis", "text", &field);
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "34", "3734 Elvis Presley BLVD",
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "text", &field);
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These fields should not match, as they are unsupported variants.
2851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "35", "Elvis Aaron", "text", &field);
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "36", "Mr. Presley", "text", &field);
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "37", "3734 Elvis Presley", "text",
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &field);
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "38", "TN", "text", &field);
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "39", "38116-1023", "text", &field);
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "20", "5", "text", &field);
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "20", "56", "text", &field);
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test::CreateTestFormField("", "20", "901", "text", &field);
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.clear();
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types.insert(UNKNOWN_TYPE);
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_types.push_back(types);
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->set_expected_submitted_field_types(expected_types);
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormSubmitted(form);
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, RemoveProfile) {
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add and remove an Autofill profile.
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile = new AutofillProfile;
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string guid = "00000000-0000-0000-0000-000000000102";
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid(guid.c_str());
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddProfile(profile);
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid_pair(guid, 0);
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = PackGUIDs(empty, guid_pair);
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->RemoveAutofillProfileOrCreditCard(id);
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(autofill_manager_->GetProfileWithGUID(guid.c_str()));
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, RemoveCreditCard){
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add and remove an Autofill credit card.
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard* credit_card = new CreditCard;
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string guid = "00000000-0000-0000-0000-000000100007";
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card->set_guid(guid.c_str());
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddCreditCard(credit_card);
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid_pair(guid, 0);
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = PackGUIDs(guid_pair, empty);
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->RemoveAutofillProfileOrCreditCard(id);
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(autofill_manager_->GetCreditCardWithGUID(guid.c_str()));
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, RemoveProfileVariant) {
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add and remove an Autofill profile.
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile = new AutofillProfile;
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string guid = "00000000-0000-0000-0000-000000000102";
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->set_guid(guid.c_str());
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->AddProfile(profile);
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair guid_pair(guid, 1);
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GUIDPair empty(std::string(), 0);
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = PackGUIDs(empty, guid_pair);
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autofill_manager_->RemoveAutofillProfileOrCreditCard(id);
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(csharp): Currently variants should not be deleted, but once they are
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // update these expectations.
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/124211
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(autofill_manager_->GetProfileWithGUID(guid.c_str()));
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutofillManagerTest, DisabledAutofillDispatchesError) {
29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(autofill_manager_->request_autocomplete_results().empty());
29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autofill_manager_->set_autofill_enabled(false);
29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autofill_manager_->OnRequestAutocomplete(FormData(),
29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           GURL());
29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, autofill_manager_->request_autocomplete_results().size());
29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(WebFormElement::AutocompleteResultErrorDisabled,
29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            autofill_manager_->request_autocomplete_results()[0].first);
29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MockAutofillManagerDelegate : public TestAutofillManagerDelegate {
2970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
297158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MockAutofillManagerDelegate() {}
2972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2973868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~MockAutofillManagerDelegate() {}
2974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void ShowRequestAutocompleteDialog(
2976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const FormData& form,
2977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const GURL& source_url,
2978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const base::Callback<void(const FormStructure*,
2979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const std::string&)>& callback) OVERRIDE {
2980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    callback.Run(user_supplied_data_.get(), "google_transaction_id");
2981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetUserSuppliedData(scoped_ptr<FormStructure> user_supplied_data) {
2984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    user_supplied_data_.reset(user_supplied_data.release());
2985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2987868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
2988eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<FormStructure> user_supplied_data_;
2989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(MockAutofillManagerDelegate);
2991868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
2992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test our external delegate is called at the right time.
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillManagerTest, TestExternalDelegate) {
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test::CreateTestAddressFormData(&form);
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormData> forms(1, form);
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormsSeen(forms);
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FormFieldData& field = form.fields[0];
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetAutofillSuggestions(form, field);  // should call the delegate's OnQuery()
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(external_delegate_->on_query_seen());
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
3008