summaryrefslogtreecommitdiffstats
path: root/chrome/browser/autofill/autofill_manager_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/autofill/autofill_manager_unittest.cc')
-rw-r--r--chrome/browser/autofill/autofill_manager_unittest.cc1184
1 files changed, 1184 insertions, 0 deletions
diff --git a/chrome/browser/autofill/autofill_manager_unittest.cc b/chrome/browser/autofill/autofill_manager_unittest.cc
new file mode 100644
index 0000000..a9a915d
--- /dev/null
+++ b/chrome/browser/autofill/autofill_manager_unittest.cc
@@ -0,0 +1,1184 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <vector>
+
+#include "base/ref_counted.h"
+#include "base/scoped_ptr.h"
+#include "base/scoped_vector.h"
+#include "base/string16.h"
+#include "base/tuple.h"
+#include "chrome/browser/autofill/autofill_common_unittest.h"
+#include "chrome/browser/autofill/autofill_manager.h"
+#include "chrome/browser/autofill/autofill_profile.h"
+#include "chrome/browser/autofill/credit_card.h"
+#include "chrome/browser/autofill/personal_data_manager.h"
+#include "chrome/browser/pref_service.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/renderer_host/test/test_render_view_host.h"
+#include "chrome/browser/tab_contents/test_tab_contents.h"
+#include "chrome/common/ipc_test_sink.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/render_messages.h"
+#include "googleurl/src/gurl.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "webkit/glue/form_data.h"
+#include "webkit/glue/form_field.h"
+
+using webkit_glue::FormData;
+
+namespace {
+
+typedef Tuple4<int,
+ std::vector<string16>,
+ std::vector<string16>,
+ std::vector<int> > AutoFillParam;
+
+class TestPersonalDataManager : public PersonalDataManager {
+ public:
+ TestPersonalDataManager() {
+ CreateTestAutoFillProfiles(&web_profiles_);
+ CreateTestCreditCards(&credit_cards_);
+ }
+
+ virtual void InitializeIfNeeded() {}
+ virtual void SaveImportedFormData() {}
+
+ AutoFillProfile* GetLabeledProfile(const char* label) {
+ for (std::vector<AutoFillProfile *>::iterator it = web_profiles_.begin();
+ it != web_profiles_.end(); ++it) {
+ if (!(*it)->Label().compare(ASCIIToUTF16(label)))
+ return *it;
+ }
+ return NULL;
+ }
+
+ void AddProfile(AutoFillProfile* profile) {
+ web_profiles_->push_back(profile);
+ }
+
+ private:
+ void CreateTestAutoFillProfiles(ScopedVector<AutoFillProfile>* profiles) {
+ AutoFillProfile* profile = new AutoFillProfile;
+ autofill_unittest::SetProfileInfo(profile, "Home", "Elvis", "Aaron",
+ "Presley", "theking@gmail.com", "RCA",
+ "3734 Elvis Presley Blvd.", "Apt. 10",
+ "Memphis", "Tennessee", "38116", "USA",
+ "12345678901", "");
+ profile->set_unique_id(1);
+ profiles->push_back(profile);
+ profile = new AutoFillProfile;
+ autofill_unittest::SetProfileInfo(profile, "Work", "Charles", "Hardin",
+ "Holley", "buddy@gmail.com", "Decca",
+ "123 Apple St.", "unit 6", "Lubbock",
+ "Texas", "79401", "USA", "23456789012",
+ "");
+ profile->set_unique_id(2);
+ profiles->push_back(profile);
+ profile = new AutoFillProfile;
+ autofill_unittest::SetProfileInfo(profile, "Empty", "", "", "", "", "", "",
+ "", "", "", "", "", "", "");
+ profile->set_unique_id(3);
+ profiles->push_back(profile);
+ }
+
+ void CreateTestCreditCards(ScopedVector<CreditCard>* credit_cards) {
+ CreditCard* credit_card = new CreditCard;
+ autofill_unittest::SetCreditCardInfo(credit_card, "First", "Elvis Presley",
+ "Visa", "1234567890123456", "04",
+ "2012", "Home");
+ credit_card->set_unique_id(4);
+ credit_cards->push_back(credit_card);
+ credit_card = new CreditCard;
+ autofill_unittest::SetCreditCardInfo(credit_card, "Second", "Buddy Holly",
+ "Mastercard", "0987654321098765", "10",
+ "2014", "");
+ credit_card->set_unique_id(5);
+ credit_cards->push_back(credit_card);
+ credit_card = new CreditCard;
+ autofill_unittest::SetCreditCardInfo(credit_card, "Empty", "", "", "", "",
+ "", "");
+ credit_card->set_unique_id(6);
+ credit_cards->push_back(credit_card);
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(TestPersonalDataManager);
+};
+
+class TestAutoFillManager : public AutoFillManager {
+ public:
+ explicit TestAutoFillManager(TabContents* tab_contents)
+ : AutoFillManager(tab_contents, NULL) {
+ test_personal_data_ = new TestPersonalDataManager();
+ set_personal_data_manager(test_personal_data_.get());
+ }
+
+ virtual bool IsAutoFillEnabled() const { return true; }
+
+ AutoFillProfile* GetLabeledProfile(const char* label) {
+ return test_personal_data_->GetLabeledProfile(label);
+ }
+
+ void AddProfile(AutoFillProfile* profile) {
+ test_personal_data_->AddProfile(profile);
+ }
+
+ private:
+ scoped_refptr<TestPersonalDataManager> test_personal_data_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestAutoFillManager);
+};
+
+void CreateTestFormData(FormData* form) {
+ form->name = ASCIIToUTF16("MyForm");
+ form->method = ASCIIToUTF16("POST");
+ form->origin = GURL("http://myform.com/form.html");
+ form->action = GURL("http://myform.com/submit.html");
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Address Line 1", "addr1", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Address Line 2", "addr2", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "City", "city", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "State", "state", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Postal Code", "zipcode", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Country", "country", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Phone Number", "phonenumber", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "", "text", &field);
+ form->fields.push_back(field);
+}
+
+void CreateTestFormDataBilling(FormData* form) {
+ form->name = ASCIIToUTF16("MyForm");
+ form->method = ASCIIToUTF16("POST");
+ form->origin = GURL("https://myform.com/form.html");
+ form->action = GURL("https://myform.com/submit.html");
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Address Line 1", "billingAddr1", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Address Line 2", "billingAddr2", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "City", "billingCity", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "State", "billingState", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Postal Code", "billingZipcode", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Country", "billingCountry", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Phone Number", "phonenumber", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Name on Card", "nameoncard", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Card Number", "cardnumber", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Expiration Date", "ccmonth", "", "text", &field);
+ form->fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "", "ccyear", "", "text", &field);
+ form->fields.push_back(field);
+}
+
+class AutoFillManagerTest : public RenderViewHostTestHarness {
+ public:
+ AutoFillManagerTest() {}
+
+ virtual void SetUp() {
+ RenderViewHostTestHarness::SetUp();
+ autofill_manager_.reset(new TestAutoFillManager(contents()));
+ }
+
+ Profile* profile() { return contents()->profile(); }
+
+ bool GetAutoFillSuggestionsMessage(int* page_id,
+ std::vector<string16>* values,
+ std::vector<string16>* labels) {
+ const uint32 kMsgID = ViewMsg_AutoFillSuggestionsReturned::ID;
+ const IPC::Message* message =
+ process()->sink().GetFirstMessageMatching(kMsgID);
+ if (!message)
+ return false;
+
+ AutoFillParam autofill_param;
+ ViewMsg_AutoFillSuggestionsReturned::Read(message, &autofill_param);
+ if (page_id)
+ *page_id = autofill_param.a;
+ if (values)
+ *values = autofill_param.b;
+ if (labels)
+ *labels = autofill_param.c;
+ return true;
+ }
+
+ bool GetAutoFillFormDataFilledMessage(int *page_id, FormData* results) {
+ const uint32 kMsgID = ViewMsg_AutoFillFormDataFilled::ID;
+ const IPC::Message* message =
+ process()->sink().GetFirstMessageMatching(kMsgID);
+ if (!message)
+ return false;
+ Tuple2<int, FormData> autofill_param;
+ ViewMsg_AutoFillFormDataFilled::Read(message, &autofill_param);
+ if (page_id)
+ *page_id = autofill_param.a;
+ if (results)
+ *results = autofill_param.b;
+ return true;
+ }
+
+ protected:
+ scoped_ptr<TestAutoFillManager> autofill_manager_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(AutoFillManagerTest);
+};
+
+TEST_F(AutoFillManagerTest, GetProfileSuggestionsEmptyValue) {
+ FormData form;
+ CreateTestFormData(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, false, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ rvh()->AutocompleteSuggestionsReturned(kPageID, std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(2U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("Elvis"), values[0]);
+ EXPECT_EQ(ASCIIToUTF16("Charles"), values[1]);
+ ASSERT_EQ(2U, labels.size());
+ // Inferred labels now include full first relevant field, which in this case
+ // the address #1.
+ EXPECT_EQ(ASCIIToUTF16("3734 Elvis Presley Blvd."), labels[0]);
+ EXPECT_EQ(ASCIIToUTF16("123 Apple St."), labels[1]);
+}
+
+TEST_F(AutoFillManagerTest, GetProfileSuggestionsMatchCharacter) {
+ FormData form;
+ CreateTestFormData(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "E", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, false, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ rvh()->AutocompleteSuggestionsReturned(kPageID, std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(1U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("Elvis"), values[0]);
+ ASSERT_EQ(1U, labels.size());
+ EXPECT_EQ(ASCIIToUTF16("3734 Elvis Presley Blvd."), labels[0]);
+}
+
+TEST_F(AutoFillManagerTest, GetCreditCardSuggestionsEmptyValue) {
+ FormData form;
+ CreateTestFormDataBilling(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "Card Number", "cardnumber", "", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, false, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ rvh()->AutocompleteSuggestionsReturned(kPageID, std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(6U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("************3456"), values[0]);
+ EXPECT_EQ(ASCIIToUTF16("************3456"), values[1]);
+ EXPECT_EQ(ASCIIToUTF16("************3456"), values[2]);
+ EXPECT_EQ(ASCIIToUTF16("************8765"), values[3]);
+ EXPECT_EQ(ASCIIToUTF16("************8765"), values[4]);
+ EXPECT_EQ(ASCIIToUTF16("************8765"), values[5]);
+ ASSERT_EQ(6U, labels.size());
+ EXPECT_EQ(ASCIIToUTF16("Home; 3456"), labels[0]);
+ EXPECT_EQ(ASCIIToUTF16("Work; 3456"), labels[1]);
+ EXPECT_EQ(ASCIIToUTF16("Empty; 3456"), labels[2]);
+ EXPECT_EQ(ASCIIToUTF16("Home; 8765"), labels[3]);
+ EXPECT_EQ(ASCIIToUTF16("Work; 8765"), labels[4]);
+ EXPECT_EQ(ASCIIToUTF16("Empty; 8765"), labels[5]);
+}
+
+TEST_F(AutoFillManagerTest, GetCreditCardSuggestionsMatchCharacter) {
+ FormData form;
+ CreateTestFormDataBilling(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "Card Number", "cardnumber", "1", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, false, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ rvh()->AutocompleteSuggestionsReturned(kPageID, std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(3U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("************3456"), values[0]);
+ EXPECT_EQ(ASCIIToUTF16("************3456"), values[1]);
+ EXPECT_EQ(ASCIIToUTF16("************3456"), values[2]);
+ ASSERT_EQ(3U, labels.size());
+ EXPECT_EQ(ASCIIToUTF16("Home; 3456"), labels[0]);
+ EXPECT_EQ(ASCIIToUTF16("Work; 3456"), labels[1]);
+ EXPECT_EQ(ASCIIToUTF16("Empty; 3456"), labels[2]);
+}
+
+TEST_F(AutoFillManagerTest, GetCreditCardSuggestionsNonCCNumber) {
+ FormData form;
+ CreateTestFormDataBilling(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "Name on Card", "nameoncard", "", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, false, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ rvh()->AutocompleteSuggestionsReturned(kPageID, std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(6U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("Elvis Presley"), values[0]);
+ EXPECT_EQ(ASCIIToUTF16("Elvis Presley"), values[1]);
+ EXPECT_EQ(ASCIIToUTF16("Elvis Presley"), values[2]);
+ EXPECT_EQ(ASCIIToUTF16("Buddy Holly"), values[3]);
+ EXPECT_EQ(ASCIIToUTF16("Buddy Holly"), values[4]);
+ EXPECT_EQ(ASCIIToUTF16("Buddy Holly"), values[5]);
+ ASSERT_EQ(6U, labels.size());
+ EXPECT_EQ(ASCIIToUTF16("Home; 3456"), labels[0]);
+ EXPECT_EQ(ASCIIToUTF16("Work; 3456"), labels[1]);
+ EXPECT_EQ(ASCIIToUTF16("Empty; 3456"), labels[2]);
+ EXPECT_EQ(ASCIIToUTF16("Home; 8765"), labels[3]);
+ EXPECT_EQ(ASCIIToUTF16("Work; 8765"), labels[4]);
+ EXPECT_EQ(ASCIIToUTF16("Empty; 8765"), labels[5]);
+}
+
+TEST_F(AutoFillManagerTest, GetCreditCardSuggestionsSemicolon) {
+ // |profile| will be owned by the mock PersonalDataManager.
+ AutoFillProfile* profile = new AutoFillProfile;
+ autofill_unittest::SetProfileInfo(profile, "Home; 8765", "Joe", "", "Ely",
+ "flatlander@gmail.com", "MCA",
+ "916 16th St.", "Apt. 6", "Lubbock",
+ "Texas", "79401", "USA",
+ "12345678901", "");
+ autofill_manager_->AddProfile(profile);
+
+ FormData form;
+ CreateTestFormDataBilling(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "Name on Card", "nameoncard", "", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, false, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ rvh()->AutocompleteSuggestionsReturned(kPageID, std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(8U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("Elvis Presley"), values[0]);
+ EXPECT_EQ(ASCIIToUTF16("Elvis Presley"), values[1]);
+ EXPECT_EQ(ASCIIToUTF16("Elvis Presley"), values[2]);
+ EXPECT_EQ(ASCIIToUTF16("Elvis Presley"), values[3]);
+ EXPECT_EQ(ASCIIToUTF16("Buddy Holly"), values[4]);
+ EXPECT_EQ(ASCIIToUTF16("Buddy Holly"), values[5]);
+ EXPECT_EQ(ASCIIToUTF16("Buddy Holly"), values[6]);
+ EXPECT_EQ(ASCIIToUTF16("Buddy Holly"), values[7]);
+ ASSERT_EQ(8U, labels.size());
+ EXPECT_EQ(ASCIIToUTF16("Home; 3456"), labels[0]);
+ EXPECT_EQ(ASCIIToUTF16("Work; 3456"), labels[1]);
+ EXPECT_EQ(ASCIIToUTF16("Empty; 3456"), labels[2]);
+ EXPECT_EQ(ASCIIToUTF16("Home; 8765; 3456"), labels[3]);
+ EXPECT_EQ(ASCIIToUTF16("Home; 8765"), labels[4]);
+ EXPECT_EQ(ASCIIToUTF16("Work; 8765"), labels[5]);
+ EXPECT_EQ(ASCIIToUTF16("Empty; 8765"), labels[6]);
+ EXPECT_EQ(ASCIIToUTF16("Home; 8765; 8765"), labels[7]);
+}
+
+TEST_F(AutoFillManagerTest, GetCreditCardSuggestionsNonHTTPS) {
+ FormData form;
+ CreateTestFormDataBilling(&form);
+ form.origin = GURL("http://myform.com/form.html");
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "Card Number", "cardnumber", "", "text", &field);
+ EXPECT_FALSE(
+ autofill_manager_->GetAutoFillSuggestions(kPageID, false, field));
+}
+
+TEST_F(AutoFillManagerTest, GetCombinedAutoFillAndAutocompleteSuggestions) {
+ FormData form;
+ CreateTestFormData(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, false, field));
+
+ // Add some Autocomplete suggestions.
+ // This triggers the combined message send.
+ std::vector<string16> suggestions;
+ suggestions.push_back(ASCIIToUTF16("Jay"));
+ suggestions.push_back(ASCIIToUTF16("Jason"));
+ rvh()->AutocompleteSuggestionsReturned(kPageID, suggestions);
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(4U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("Elvis"), values[0]);
+ EXPECT_EQ(ASCIIToUTF16("Charles"), values[1]);
+ EXPECT_EQ(ASCIIToUTF16("Jay"), values[2]);
+ EXPECT_EQ(ASCIIToUTF16("Jason"), values[3]);
+ ASSERT_EQ(4U, labels.size());
+ EXPECT_EQ(ASCIIToUTF16("3734 Elvis Presley Blvd."), labels[0]);
+ EXPECT_EQ(ASCIIToUTF16("123 Apple St."), labels[1]);
+ EXPECT_EQ(string16(), labels[2]);
+ EXPECT_EQ(string16(), labels[3]);
+}
+
+TEST_F(AutoFillManagerTest, GetFieldSuggestionsFormIsAutoFilled) {
+ FormData form;
+ CreateTestFormData(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, true, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ rvh()->AutocompleteSuggestionsReturned(kPageID, std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(2U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("Elvis"), values[0]);
+ EXPECT_EQ(ASCIIToUTF16("Charles"), values[1]);
+ ASSERT_EQ(2U, labels.size());
+ EXPECT_EQ(string16(), labels[0]);
+ EXPECT_EQ(string16(), labels[1]);
+}
+
+TEST_F(AutoFillManagerTest, GetFieldSuggestionsForAutocompleteOnly) {
+ FormData form;
+ CreateTestFormData(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+ const int kAlternatePageID = 0;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, true, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ // In this case, we're simulating a cancel of Autocomplete with a different
+ // page ID and an empty vector of suggestions.
+ rvh()->AutocompleteSuggestionsReturned(kAlternatePageID,
+ std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kAlternatePageID, page_id);
+ ASSERT_EQ(0U, values.size());
+ ASSERT_EQ(0U, labels.size());
+}
+
+TEST_F(AutoFillManagerTest, GetFieldSuggestionsWithDuplicateValues) {
+ FormData form;
+ CreateTestFormData(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // |profile| will be owned by the mock PersonalDataManager.
+ AutoFillProfile* profile = new AutoFillProfile;
+ autofill_unittest::SetProfileInfo(profile, "Duplicate", "Elvis", "", "", "",
+ "", "", "", "", "", "", "", "", "");
+ autofill_manager_->AddProfile(profile);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ EXPECT_TRUE(autofill_manager_->GetAutoFillSuggestions(kPageID, true, field));
+
+ // No suggestions provided, so send an empty vector as the results.
+ // This triggers the combined message send.
+ rvh()->AutocompleteSuggestionsReturned(kPageID, std::vector<string16>());
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::vector<string16> values;
+ std::vector<string16> labels;
+ EXPECT_TRUE(GetAutoFillSuggestionsMessage(&page_id, &values, &labels));
+ EXPECT_EQ(kPageID, page_id);
+ ASSERT_EQ(2U, values.size());
+ EXPECT_EQ(ASCIIToUTF16("Elvis"), values[0]);
+ EXPECT_EQ(ASCIIToUTF16("Charles"), values[1]);
+ ASSERT_EQ(2U, labels.size());
+ EXPECT_EQ(string16(), labels[0]);
+ EXPECT_EQ(string16(), labels[1]);
+}
+
+TEST_F(AutoFillManagerTest, FillCreditCardForm) {
+ FormData form;
+ CreateTestFormDataBilling(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+ EXPECT_TRUE(
+ autofill_manager_->FillAutoFillFormData(kPageID,
+ form,
+ string16(),
+ ASCIIToUTF16("Home; 3456"),
+ 1));
+
+ int page_id = 0;
+ FormData results;
+ EXPECT_TRUE(GetAutoFillFormDataFilledMessage(&page_id, &results));
+ EXPECT_EQ(ASCIIToUTF16("MyForm"), results.name);
+ EXPECT_EQ(ASCIIToUTF16("POST"), results.method);
+ EXPECT_EQ(GURL("https://myform.com/form.html"), results.origin);
+ EXPECT_EQ(GURL("https://myform.com/submit.html"), results.action);
+ ASSERT_EQ(15U, results.fields.size());
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "Elvis", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[0]));
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "Aaron", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[1]));
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "Presley", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[2]));
+ autofill_unittest::CreateTestFormField(
+ "Address Line 1", "billingAddr1",
+ "3734 Elvis Presley Blvd.", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[3]));
+ autofill_unittest::CreateTestFormField(
+ "Address Line 2", "billingAddr2", "Apt. 10", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[4]));
+ autofill_unittest::CreateTestFormField(
+ "City", "billingCity", "Memphis", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[5]));
+ autofill_unittest::CreateTestFormField(
+ "State", "billingState", "Tennessee", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[6]));
+ autofill_unittest::CreateTestFormField(
+ "Postal Code", "billingZipcode", "38116", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[7]));
+ autofill_unittest::CreateTestFormField(
+ "Country", "billingCountry", "USA", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[8]));
+ autofill_unittest::CreateTestFormField(
+ "Phone Number", "phonenumber", "12345678901", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[9]));
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "theking@gmail.com", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[10]));
+ autofill_unittest::CreateTestFormField(
+ "Name on Card", "nameoncard", "Elvis Presley", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[11]));
+ autofill_unittest::CreateTestFormField(
+ "Card Number", "cardnumber", "1234567890123456", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[12]));
+ autofill_unittest::CreateTestFormField(
+ "Expiration Date", "ccmonth", "04", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[13]));
+ autofill_unittest::CreateTestFormField(
+ "", "ccyear", "2012", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[14]));
+}
+
+TEST_F(AutoFillManagerTest, FillNonBillingFormSemicolon) {
+ // |profile| will be owned by the mock PersonalDataManager.
+ AutoFillProfile* profile = new AutoFillProfile;
+ autofill_unittest::SetProfileInfo(profile, "Home; 8765", "Joe", "", "Ely",
+ "flatlander@gmail.com", "MCA",
+ "916 16th St.", "Apt. 6", "Lubbock",
+ "Texas", "79401", "USA",
+ "12345678901", "");
+ profile->set_unique_id(6);
+ autofill_manager_->AddProfile(profile);
+
+ FormData form;
+ CreateTestFormData(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+ EXPECT_TRUE(
+ autofill_manager_->FillAutoFillFormData(kPageID,
+ form,
+ string16(),
+ ASCIIToUTF16("Home; 8765"),
+ 6));
+
+ int page_id = 0;
+ FormData results;
+ EXPECT_TRUE(GetAutoFillFormDataFilledMessage(&page_id, &results));
+ EXPECT_EQ(ASCIIToUTF16("MyForm"), results.name);
+ EXPECT_EQ(ASCIIToUTF16("POST"), results.method);
+ EXPECT_EQ(GURL("http://myform.com/form.html"), results.origin);
+ EXPECT_EQ(GURL("http://myform.com/submit.html"), results.action);
+ ASSERT_EQ(11U, results.fields.size());
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "Joe", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[0]));
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[1]));
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "Ely", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[2]));
+ autofill_unittest::CreateTestFormField(
+ "Address Line 1", "addr1", "916 16th St.", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[3]));
+ autofill_unittest::CreateTestFormField(
+ "Address Line 2", "addr2", "Apt. 6", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[4]));
+ autofill_unittest::CreateTestFormField(
+ "City", "city", "Lubbock", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[5]));
+ autofill_unittest::CreateTestFormField(
+ "State", "state", "Texas", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[6]));
+ autofill_unittest::CreateTestFormField(
+ "Postal Code", "zipcode", "79401", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[7]));
+ autofill_unittest::CreateTestFormField(
+ "Country", "country", "USA", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[8]));
+ autofill_unittest::CreateTestFormField(
+ "Phone Number", "phonenumber", "12345678901", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[9]));
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "flatlander@gmail.com", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[10]));
+}
+
+TEST_F(AutoFillManagerTest, FillBillFormSemicolon) {
+ // |profile| will be owned by the mock PersonalDataManager.
+ AutoFillProfile* profile = new AutoFillProfile;
+ autofill_unittest::SetProfileInfo(profile, "Home; 8765", "Joe", "", "Ely",
+ "flatlander@gmail.com", "MCA",
+ "916 16th St.", "Apt. 6", "Lubbock",
+ "Texas", "79401", "USA",
+ "12345678901", "");
+ profile->set_unique_id(6);
+ autofill_manager_->AddProfile(profile);
+
+ FormData form;
+ CreateTestFormDataBilling(&form);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+ EXPECT_TRUE(autofill_manager_->FillAutoFillFormData(
+ kPageID, form, string16(), ASCIIToUTF16("Home; 8765; 3456"), 6));
+
+ int page_id = 0;
+ FormData results;
+ EXPECT_TRUE(GetAutoFillFormDataFilledMessage(&page_id, &results));
+ EXPECT_EQ(ASCIIToUTF16("MyForm"), results.name);
+ EXPECT_EQ(ASCIIToUTF16("POST"), results.method);
+ EXPECT_EQ(GURL("https://myform.com/form.html"), results.origin);
+ EXPECT_EQ(GURL("https://myform.com/submit.html"), results.action);
+ ASSERT_EQ(15U, results.fields.size());
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "Joe", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[0]));
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[1]));
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "Ely", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[2]));
+ autofill_unittest::CreateTestFormField(
+ "Address Line 1", "billingAddr1",
+ "3734 Elvis Presley Blvd.", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[3]));
+ autofill_unittest::CreateTestFormField(
+ "Address Line 2", "billingAddr2", "Apt. 10", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[4]));
+ autofill_unittest::CreateTestFormField(
+ "City", "billingCity", "Memphis", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[5]));
+ autofill_unittest::CreateTestFormField(
+ "State", "billingState", "Tennessee", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[6]));
+ autofill_unittest::CreateTestFormField(
+ "Postal Code", "billingZipcode", "38116", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[7]));
+ autofill_unittest::CreateTestFormField(
+ "Country", "billingCountry", "USA", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[8]));
+ autofill_unittest::CreateTestFormField(
+ "Phone Number", "phonenumber", "12345678901", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[9]));
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "flatlander@gmail.com", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[10]));
+ autofill_unittest::CreateTestFormField(
+ "Name on Card", "nameoncard", "Elvis Presley", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[11]));
+ autofill_unittest::CreateTestFormField(
+ "Card Number", "cardnumber", "1234567890123456", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[12]));
+ autofill_unittest::CreateTestFormField(
+ "Expiration Date", "ccmonth", "04", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[13]));
+ autofill_unittest::CreateTestFormField(
+ "", "ccyear", "2012", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[14]));
+}
+
+TEST_F(AutoFillManagerTest, FillPhoneNumber) {
+ FormData form;
+
+ form.name = ASCIIToUTF16("MyPhoneForm");
+ form.method = ASCIIToUTF16("POST");
+ form.origin = GURL("http://myform.com/phone_form.html");
+ form.action = GURL("http://myform.com/phone_submit.html");
+
+ webkit_glue::FormField field;
+
+ autofill_unittest::CreateTestFormField(
+ "country code", "country code", "", "text", &field);
+ field.set_size(1);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "area code", "area code", "", "text", &field);
+ field.set_size(3);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "phone", "phone prefix", "1", "text", &field);
+ field.set_size(3);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "-", "phone suffix", "", "text", &field);
+ field.set_size(4);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Phone Extension", "ext", "", "text", &field);
+ field.set_size(3);
+ form.fields.push_back(field);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ AutoFillProfile *work_profile = autofill_manager_->GetLabeledProfile("Work");
+ EXPECT_TRUE(work_profile != NULL);
+ const AutoFillType phone_type(PHONE_HOME_NUMBER);
+ string16 saved_phone = work_profile->GetFieldText(phone_type);
+
+ char test_data[] = "1234567890123456";
+ for (int i = arraysize(test_data) - 1; i >= 0; --i) {
+ test_data[i] = 0;
+ work_profile->SetInfo(phone_type, ASCIIToUTF16(test_data));
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ int page_id = 100 - i;
+ process()->sink().ClearMessages();
+ EXPECT_TRUE(
+ autofill_manager_->FillAutoFillFormData(page_id,
+ form,
+ ASCIIToUTF16(test_data),
+ ASCIIToUTF16("Work"),
+ work_profile->unique_id()));
+ page_id = 0;
+ FormData results;
+ EXPECT_TRUE(GetAutoFillFormDataFilledMessage(&page_id, &results));
+
+ if (i != 7) {
+ EXPECT_EQ(ASCIIToUTF16(test_data), results.fields[2].value());
+ EXPECT_EQ(ASCIIToUTF16(test_data), results.fields[3].value());
+ } else {
+ // The only size that is parsed and split, right now is 7:
+ EXPECT_EQ(ASCIIToUTF16("123"), results.fields[2].value());
+ EXPECT_EQ(ASCIIToUTF16("4567"), results.fields[3].value());
+ }
+ }
+
+ work_profile->SetInfo(phone_type, saved_phone);
+}
+
+TEST_F(AutoFillManagerTest, FormChangesRemoveField) {
+ FormData form;
+ form.name = ASCIIToUTF16("MyForm");
+ form.method = ASCIIToUTF16("POST");
+ form.origin = GURL("http://myform.com/form.html");
+ form.action = GURL("http://myform.com/submit.html");
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "", "text", &field);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "", "text", &field);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Phone Number", "phonenumber", "", "text", &field);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "", "text", &field);
+ form.fields.push_back(field);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // Now, after the call to |FormsSeen| we remove the phone number field before
+ // filling.
+ form.fields.erase(form.fields.begin() + 3);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+ EXPECT_TRUE(autofill_manager_->FillAutoFillFormData(kPageID,
+ form,
+ ASCIIToUTF16("Elvis"),
+ ASCIIToUTF16("Home"),
+ 1));
+
+ int page_id = 0;
+ FormData results;
+ EXPECT_TRUE(GetAutoFillFormDataFilledMessage(&page_id, &results));
+ EXPECT_EQ(ASCIIToUTF16("MyForm"), results.name);
+ EXPECT_EQ(ASCIIToUTF16("POST"), results.method);
+ EXPECT_EQ(GURL("http://myform.com/form.html"), results.origin);
+ EXPECT_EQ(GURL("http://myform.com/submit.html"), results.action);
+ ASSERT_EQ(4U, results.fields.size());
+
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "Elvis", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[0]));
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "Aaron", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[1]));
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "Presley", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[2]));
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "theking@gmail.com", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[3]));
+}
+
+TEST_F(AutoFillManagerTest, FormChangesAddField) {
+ FormData form;
+ form.name = ASCIIToUTF16("MyForm");
+ form.method = ASCIIToUTF16("POST");
+ form.origin = GURL("http://myform.com/form.html");
+ form.action = GURL("http://myform.com/submit.html");
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "", "text", &field);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "", "text", &field);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "", "text", &field);
+ // Note: absent phone number. Adding this below.
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "", "text", &field);
+ form.fields.push_back(field);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // Now, after the call to |FormsSeen| we add the phone number field before
+ // filling.
+ autofill_unittest::CreateTestFormField(
+ "Phone Number", "phonenumber", "", "text", &field);
+ form.fields.insert(form.fields.begin() + 3, field);
+
+ // The page ID sent to the AutoFillManager from the RenderView, used to send
+ // an IPC message back to the renderer.
+ const int kPageID = 1;
+ EXPECT_TRUE(autofill_manager_->FillAutoFillFormData(kPageID,
+ form,
+ ASCIIToUTF16("Elvis"),
+ ASCIIToUTF16("Home"),
+ 1));
+
+ int page_id = 0;
+ FormData results;
+ EXPECT_TRUE(GetAutoFillFormDataFilledMessage(&page_id, &results));
+ EXPECT_EQ(ASCIIToUTF16("MyForm"), results.name);
+ EXPECT_EQ(ASCIIToUTF16("POST"), results.method);
+ EXPECT_EQ(GURL("http://myform.com/form.html"), results.origin);
+ EXPECT_EQ(GURL("http://myform.com/submit.html"), results.action);
+ ASSERT_EQ(5U, results.fields.size());
+
+ autofill_unittest::CreateTestFormField(
+ "First Name", "firstname", "Elvis", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[0]));
+ autofill_unittest::CreateTestFormField(
+ "Middle Name", "middlename", "Aaron", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[1]));
+ autofill_unittest::CreateTestFormField(
+ "Last Name", "lastname", "Presley", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[2]));
+ autofill_unittest::CreateTestFormField(
+ "Phone Number", "phonenumber", "", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[3]));
+ autofill_unittest::CreateTestFormField(
+ "Email", "email", "theking@gmail.com", "text", &field);
+ EXPECT_TRUE(field.StrictlyEqualsHack(results.fields[4]));
+}
+
+TEST_F(AutoFillManagerTest, HiddenFields) {
+ FormData form;
+ form.name = ASCIIToUTF16("MyForm");
+ form.method = ASCIIToUTF16("POST");
+ form.origin = GURL("http://myform.com/form.html");
+ form.action = GURL("http://myform.com/submit.html");
+
+ webkit_glue::FormField field;
+ autofill_unittest::CreateTestFormField(
+ "E-mail", "one", "one", "hidden", &field);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "E-mail", "two", "two", "hidden", &field);
+ form.fields.push_back(field);
+ autofill_unittest::CreateTestFormField(
+ "E-mail", "three", "three", "hidden", &field);
+ form.fields.push_back(field);
+
+ // Set up our FormStructures.
+ std::vector<FormData> forms;
+ forms.push_back(form);
+ autofill_manager_->FormsSeen(forms);
+
+ // Submit the form.
+ autofill_manager_->FormSubmitted(form);
+
+ // TODO(jhawkins): We can't use the InfoBar anymore to determine if we saved
+ // fields. Need to query the PDM.
+}
+
+} // namespace