Index: chrome/browser/autofill/form_structure_browsertest.cc |
diff --git a/chrome/browser/autofill/form_structure_browsertest.cc b/chrome/browser/autofill/form_structure_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8d3424130c533abc5b1227022b76ecf4739705ff |
--- /dev/null |
+++ b/chrome/browser/autofill/form_structure_browsertest.cc |
@@ -0,0 +1,215 @@ |
+// 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 "chrome/browser/autofill/autofill_manager.h" |
+#include "chrome/browser/autofill/form_structure.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/test/in_process_browser_test.h" |
+#include "chrome/test/ui_test_utils.h" |
+#include "googleurl/src/gurl.h" |
+ |
+// Test class for verifying proper form structure as determined by AutoFill |
+// heuristics. After a test loads HTML content with a call to |NavigateToURL| |
+// the |AutoFillManager| associated with the tab contents is queried for the |
+// form structures that were loaded and parsed. |
+// These form structures are serialized to string form and compared with |
+// expected results. |
+class FormStructureBrowserTest : public InProcessBrowserTest { |
+ public: |
+ FormStructureBrowserTest() {} |
+ virtual ~FormStructureBrowserTest() {} |
+ |
+ protected: |
+ // Returns a vector of form structure objects associated with the given |
+ // |autofill_manager|. |
+ const std::vector<FormStructure*>& GetFormStructures( |
+ const AutoFillManager& autofill_manager); |
+ |
+ // Serializes the given form structures in |forms| to string form. |
+ const std::string FormStructuresToString( |
+ const std::vector<FormStructure*>& forms); |
+ |
+ private: |
+ // A helper utility for converting an |AutoFillFieldType| to string form. |
+ const std::string AutoFillFieldTypeToString(AutoFillFieldType type); |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FormStructureBrowserTest); |
+}; |
+ |
+const std::vector<FormStructure*>& FormStructureBrowserTest::GetFormStructures( |
+ const AutoFillManager& autofill_manager) { |
+ return autofill_manager.form_structures_.get(); |
+} |
+ |
+const std::string FormStructureBrowserTest::FormStructuresToString( |
+ const std::vector<FormStructure*>& forms) { |
+ std::string forms_string; |
+ for (std::vector<FormStructure*>::const_iterator iter = forms.begin(); |
+ iter != forms.end(); |
+ ++iter) { |
+ forms_string += (*iter)->source_url().spec(); |
+ forms_string += "\n"; |
+ |
+ for (std::vector<AutoFillField*>::const_iterator field_iter = |
+ (*iter)->begin(); |
+ field_iter != (*iter)->end(); |
+ ++field_iter) { |
+ if (!*field_iter) |
Ilya Sherman
2010/11/23 00:45:24
nit: Would be nice to add a comment explaining why
dhollowa
2010/11/23 01:10:09
Done.
|
+ break; |
+ forms_string += AutoFillFieldTypeToString((*field_iter)->type()); |
+ forms_string += "\n"; |
+ } |
+ } |
+ return forms_string; |
+} |
+ |
+const std::string FormStructureBrowserTest::AutoFillFieldTypeToString( |
+ AutoFillFieldType type) { |
+ switch (type) { |
+ case NO_SERVER_DATA: |
+ return "NO_SERVER_DATA"; |
+ case UNKNOWN_TYPE: |
+ return "UNKNOWN_TYPE"; |
+ case EMPTY_TYPE: |
+ return "EMPTY_TYPE"; |
+ case NAME_FIRST: |
+ return "NAME_FIRST"; |
+ case NAME_MIDDLE: |
+ return "NAME_MIDDLE"; |
+ case NAME_LAST: |
+ return "NAME_LAST"; |
+ case NAME_MIDDLE_INITIAL: |
+ return "NAME_MIDDLE_INITIAL"; |
+ case NAME_FULL: |
+ return "NAME_FULL"; |
+ case NAME_SUFFIX: |
+ return "NAME_SUFFIX"; |
+ case EMAIL_ADDRESS: |
+ return "EMAIL_ADDRESS"; |
+ case PHONE_HOME_NUMBER: |
+ return "PHONE_HOME_NUMBER"; |
+ case PHONE_HOME_CITY_CODE: |
+ return "PHONE_HOME_CITY_CODE"; |
+ case PHONE_HOME_COUNTRY_CODE: |
+ return "PHONE_HOME_COUNTRY_CODE"; |
+ case PHONE_HOME_CITY_AND_NUMBER: |
+ return "PHONE_HOME_CITY_AND_NUMBER"; |
+ case PHONE_HOME_WHOLE_NUMBER: |
+ return "PHONE_HOME_WHOLE_NUMBER"; |
+ case PHONE_FAX_NUMBER: |
+ return "PHONE_FAX_NUMBER"; |
+ case PHONE_FAX_CITY_CODE: |
+ return "PHONE_FAX_CITY_CODE"; |
+ case PHONE_FAX_COUNTRY_CODE: |
+ return "PHONE_FAX_COUNTRY_CODE"; |
+ case PHONE_FAX_CITY_AND_NUMBER: |
+ return "PHONE_FAX_CITY_AND_NUMBER"; |
+ case PHONE_FAX_WHOLE_NUMBER: |
+ return "PHONE_FAX_WHOLE_NUMBER"; |
+ case ADDRESS_HOME_LINE1: |
+ return "ADDRESS_HOME_LINE1"; |
+ case ADDRESS_HOME_LINE2: |
+ return "ADDRESS_HOME_LINE2"; |
+ case ADDRESS_HOME_APT_NUM: |
+ return "ADDRESS_HOME_APT_NUM"; |
+ case ADDRESS_HOME_CITY: |
+ return "ADDRESS_HOME_CITY"; |
+ case ADDRESS_HOME_STATE: |
+ return "ADDRESS_HOME_STATE"; |
+ case ADDRESS_HOME_ZIP: |
+ return "ADDRESS_HOME_ZIP"; |
+ case ADDRESS_HOME_COUNTRY: |
+ return "ADDRESS_HOME_COUNTRY"; |
+ case ADDRESS_BILLING_LINE1: |
+ return "ADDRESS_BILLING_LINE1"; |
+ case ADDRESS_BILLING_LINE2: |
+ return "ADDRESS_BILLING_LINE2"; |
+ case ADDRESS_BILLING_APT_NUM: |
+ return "ADDRESS_BILLING_APT_NUM"; |
+ case ADDRESS_BILLING_CITY: |
+ return "ADDRESS_BILLING_CITY"; |
+ case ADDRESS_BILLING_STATE: |
+ return "ADDRESS_BILLING_STATE"; |
+ case ADDRESS_BILLING_ZIP: |
+ return "ADDRESS_BILLING_ZIP"; |
+ case ADDRESS_BILLING_COUNTRY: |
+ return "ADDRESS_BILLING_COUNTRY"; |
+ case CREDIT_CARD_NAME: |
+ return "CREDIT_CARD_NAME"; |
+ case CREDIT_CARD_NUMBER: |
+ return "CREDIT_CARD_NUMBER"; |
+ case CREDIT_CARD_EXP_MONTH: |
+ return "CREDIT_CARD_EXP_MONTH"; |
+ case CREDIT_CARD_EXP_2_DIGIT_YEAR: |
+ return "CREDIT_CARD_EXP_2_DIGIT_YEAR"; |
+ case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
+ return "CREDIT_CARD_EXP_4_DIGIT_YEAR"; |
+ case CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR: |
+ return "CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR"; |
+ case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR: |
+ return "CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR"; |
+ case CREDIT_CARD_TYPE: |
+ return "CREDIT_CARD_TYPE"; |
+ case CREDIT_CARD_VERIFICATION_CODE: |
+ return "CREDIT_CARD_VERIFICATION_CODE"; |
+ case COMPANY_NAME: |
+ return "COMPANY_NAME"; |
+ default: |
+ NOTREACHED() << "Invalid AutoFillFieldType value."; |
+ } |
+ |
+ return std::string(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, BasicFormStructure) { |
+ ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); |
+ ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( |
+ browser(), GURL("data:text/html;charset=utf-8," |
+ "<form action=\"http://www.google.com/\" method=\"POST\">" |
+ "<label for=\"firstname\">First name:</label>" |
+ " <input type=\"text\" id=\"firstname\"/><br />" |
+ "<label for=\"lastname\">Last name:</label>" |
+ " <input type=\"text\" id=\"lastname\" /><br />" |
+ "<label for=\"address1\">Address line 1:</label>" |
+ " <input type=\"text\" id=\"address1\" /><br />" |
+ "<label for=\"address2\">Address line 2:</label>" |
+ " <input type=\"text\" id=\"address2\" /><br />" |
+ "<label for=\"city\">City:</label>" |
+ " <input type=\"text\" id=\"city\" /><br />" |
+ "</form>"))); |
+ |
+ ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), |
+ VIEW_ID_TAB_CONTAINER)); |
+ ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), |
+ VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
+ |
+ AutoFillManager* autofill_manager = |
+ browser()->GetSelectedTabContents()->GetAutoFillManager(); |
+ ASSERT_NE(static_cast<AutoFillManager*>(NULL), autofill_manager); |
+ std::vector<FormStructure*> forms = GetFormStructures(*autofill_manager); |
+ std::string expected("data:text/html;charset=utf-8," |
+ "<form action=\"http://www.google.com/\" method=\"POST\">" |
Ilya Sherman
2010/11/23 00:45:24
nit: 80-col
dhollowa
2010/11/23 01:10:09
Done.
|
+ "<label for=\"firstname\">First name:</label>" |
+ " <input type=\"text\" id=\"firstname\"/><br />" |
+ "<label for=\"lastname\">Last name:</label>" |
+ " <input type=\"text\" id=\"lastname\" /><br />" |
+ "<label for=\"address1\">Address line 1:</label>" |
+ " <input type=\"text\" id=\"address1\" /><br />" |
+ "<label for=\"address2\">Address line 2:</label>" |
+ " <input type=\"text\" id=\"address2\" /><br />" |
+ "<label for=\"city\">City:</label>" |
+ " <input type=\"text\" id=\"city\" /><br />" |
+ "</form>\n" |
+ "NAME_FIRST\n" |
+ "NAME_LAST\n" |
+ "ADDRESS_HOME_LINE1\n" |
+ "ADDRESS_HOME_LINE2\n" |
+ "ADDRESS_HOME_CITY\n"); |
+ |
+ EXPECT_EQ(expected, FormStructureBrowserTest::FormStructuresToString(forms)); |
+ EXPECT_EQ(1UL, forms.size()); |
Ilya Sherman
2010/11/23 00:45:24
nit: this seems unnecessary given the string compa
dhollowa
2010/11/23 01:10:09
Done.
|
+} |