OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <vector> |
| 6 |
| 7 #include "chrome/browser/autofill/autofill_manager.h" |
| 8 #include "chrome/browser/autofill/form_structure.h" |
| 9 #include "chrome/browser/tab_contents/tab_contents.h" |
| 10 #include "chrome/browser/ui/browser.h" |
| 11 #include "chrome/test/in_process_browser_test.h" |
| 12 #include "chrome/test/ui_test_utils.h" |
| 13 #include "googleurl/src/gurl.h" |
| 14 |
| 15 // Test class for verifying proper form structure as determined by AutoFill |
| 16 // heuristics. After a test loads HTML content with a call to |NavigateToURL| |
| 17 // the |AutoFillManager| associated with the tab contents is queried for the |
| 18 // form structures that were loaded and parsed. |
| 19 // These form structures are serialized to string form and compared with |
| 20 // expected results. |
| 21 class FormStructureBrowserTest : public InProcessBrowserTest { |
| 22 public: |
| 23 FormStructureBrowserTest() {} |
| 24 virtual ~FormStructureBrowserTest() {} |
| 25 |
| 26 protected: |
| 27 // Returns a vector of form structure objects associated with the given |
| 28 // |autofill_manager|. |
| 29 const std::vector<FormStructure*>& GetFormStructures( |
| 30 const AutoFillManager& autofill_manager); |
| 31 |
| 32 // Serializes the given form structures in |forms| to string form. |
| 33 const std::string FormStructuresToString( |
| 34 const std::vector<FormStructure*>& forms); |
| 35 |
| 36 private: |
| 37 // A helper utility for converting an |AutoFillFieldType| to string form. |
| 38 const std::string AutoFillFieldTypeToString(AutoFillFieldType type); |
| 39 |
| 40 DISALLOW_COPY_AND_ASSIGN(FormStructureBrowserTest); |
| 41 }; |
| 42 |
| 43 const std::vector<FormStructure*>& FormStructureBrowserTest::GetFormStructures( |
| 44 const AutoFillManager& autofill_manager) { |
| 45 return autofill_manager.form_structures_.get(); |
| 46 } |
| 47 |
| 48 const std::string FormStructureBrowserTest::FormStructuresToString( |
| 49 const std::vector<FormStructure*>& forms) { |
| 50 std::string forms_string; |
| 51 for (std::vector<FormStructure*>::const_iterator iter = forms.begin(); |
| 52 iter != forms.end(); |
| 53 ++iter) { |
| 54 forms_string += (*iter)->source_url().spec(); |
| 55 forms_string += "\n"; |
| 56 |
| 57 for (std::vector<AutoFillField*>::const_iterator field_iter = |
| 58 (*iter)->begin(); |
| 59 field_iter != (*iter)->end(); |
| 60 ++field_iter) { |
| 61 // The field list is NULL-terminated. Exit loop when at the end. |
| 62 if (!*field_iter) |
| 63 break; |
| 64 forms_string += AutoFillFieldTypeToString((*field_iter)->type()); |
| 65 forms_string += "\n"; |
| 66 } |
| 67 } |
| 68 return forms_string; |
| 69 } |
| 70 |
| 71 const std::string FormStructureBrowserTest::AutoFillFieldTypeToString( |
| 72 AutoFillFieldType type) { |
| 73 switch (type) { |
| 74 case NO_SERVER_DATA: |
| 75 return "NO_SERVER_DATA"; |
| 76 case UNKNOWN_TYPE: |
| 77 return "UNKNOWN_TYPE"; |
| 78 case EMPTY_TYPE: |
| 79 return "EMPTY_TYPE"; |
| 80 case NAME_FIRST: |
| 81 return "NAME_FIRST"; |
| 82 case NAME_MIDDLE: |
| 83 return "NAME_MIDDLE"; |
| 84 case NAME_LAST: |
| 85 return "NAME_LAST"; |
| 86 case NAME_MIDDLE_INITIAL: |
| 87 return "NAME_MIDDLE_INITIAL"; |
| 88 case NAME_FULL: |
| 89 return "NAME_FULL"; |
| 90 case NAME_SUFFIX: |
| 91 return "NAME_SUFFIX"; |
| 92 case EMAIL_ADDRESS: |
| 93 return "EMAIL_ADDRESS"; |
| 94 case PHONE_HOME_NUMBER: |
| 95 return "PHONE_HOME_NUMBER"; |
| 96 case PHONE_HOME_CITY_CODE: |
| 97 return "PHONE_HOME_CITY_CODE"; |
| 98 case PHONE_HOME_COUNTRY_CODE: |
| 99 return "PHONE_HOME_COUNTRY_CODE"; |
| 100 case PHONE_HOME_CITY_AND_NUMBER: |
| 101 return "PHONE_HOME_CITY_AND_NUMBER"; |
| 102 case PHONE_HOME_WHOLE_NUMBER: |
| 103 return "PHONE_HOME_WHOLE_NUMBER"; |
| 104 case PHONE_FAX_NUMBER: |
| 105 return "PHONE_FAX_NUMBER"; |
| 106 case PHONE_FAX_CITY_CODE: |
| 107 return "PHONE_FAX_CITY_CODE"; |
| 108 case PHONE_FAX_COUNTRY_CODE: |
| 109 return "PHONE_FAX_COUNTRY_CODE"; |
| 110 case PHONE_FAX_CITY_AND_NUMBER: |
| 111 return "PHONE_FAX_CITY_AND_NUMBER"; |
| 112 case PHONE_FAX_WHOLE_NUMBER: |
| 113 return "PHONE_FAX_WHOLE_NUMBER"; |
| 114 case ADDRESS_HOME_LINE1: |
| 115 return "ADDRESS_HOME_LINE1"; |
| 116 case ADDRESS_HOME_LINE2: |
| 117 return "ADDRESS_HOME_LINE2"; |
| 118 case ADDRESS_HOME_APT_NUM: |
| 119 return "ADDRESS_HOME_APT_NUM"; |
| 120 case ADDRESS_HOME_CITY: |
| 121 return "ADDRESS_HOME_CITY"; |
| 122 case ADDRESS_HOME_STATE: |
| 123 return "ADDRESS_HOME_STATE"; |
| 124 case ADDRESS_HOME_ZIP: |
| 125 return "ADDRESS_HOME_ZIP"; |
| 126 case ADDRESS_HOME_COUNTRY: |
| 127 return "ADDRESS_HOME_COUNTRY"; |
| 128 case ADDRESS_BILLING_LINE1: |
| 129 return "ADDRESS_BILLING_LINE1"; |
| 130 case ADDRESS_BILLING_LINE2: |
| 131 return "ADDRESS_BILLING_LINE2"; |
| 132 case ADDRESS_BILLING_APT_NUM: |
| 133 return "ADDRESS_BILLING_APT_NUM"; |
| 134 case ADDRESS_BILLING_CITY: |
| 135 return "ADDRESS_BILLING_CITY"; |
| 136 case ADDRESS_BILLING_STATE: |
| 137 return "ADDRESS_BILLING_STATE"; |
| 138 case ADDRESS_BILLING_ZIP: |
| 139 return "ADDRESS_BILLING_ZIP"; |
| 140 case ADDRESS_BILLING_COUNTRY: |
| 141 return "ADDRESS_BILLING_COUNTRY"; |
| 142 case CREDIT_CARD_NAME: |
| 143 return "CREDIT_CARD_NAME"; |
| 144 case CREDIT_CARD_NUMBER: |
| 145 return "CREDIT_CARD_NUMBER"; |
| 146 case CREDIT_CARD_EXP_MONTH: |
| 147 return "CREDIT_CARD_EXP_MONTH"; |
| 148 case CREDIT_CARD_EXP_2_DIGIT_YEAR: |
| 149 return "CREDIT_CARD_EXP_2_DIGIT_YEAR"; |
| 150 case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
| 151 return "CREDIT_CARD_EXP_4_DIGIT_YEAR"; |
| 152 case CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR: |
| 153 return "CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR"; |
| 154 case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR: |
| 155 return "CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR"; |
| 156 case CREDIT_CARD_TYPE: |
| 157 return "CREDIT_CARD_TYPE"; |
| 158 case CREDIT_CARD_VERIFICATION_CODE: |
| 159 return "CREDIT_CARD_VERIFICATION_CODE"; |
| 160 case COMPANY_NAME: |
| 161 return "COMPANY_NAME"; |
| 162 default: |
| 163 NOTREACHED() << "Invalid AutoFillFieldType value."; |
| 164 } |
| 165 |
| 166 return std::string(); |
| 167 } |
| 168 |
| 169 IN_PROC_BROWSER_TEST_F(FormStructureBrowserTest, BasicFormStructure) { |
| 170 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); |
| 171 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( |
| 172 browser(), GURL("data:text/html;charset=utf-8," |
| 173 "<form action=\"http://www.google.com/\" method=\"POST\">" |
| 174 "<label for=\"firstname\">First name:</label>" |
| 175 " <input type=\"text\" id=\"firstname\"/><br />" |
| 176 "<label for=\"lastname\">Last name:</label>" |
| 177 " <input type=\"text\" id=\"lastname\" /><br />" |
| 178 "<label for=\"address1\">Address line 1:</label>" |
| 179 " <input type=\"text\" id=\"address1\" /><br />" |
| 180 "<label for=\"address2\">Address line 2:</label>" |
| 181 " <input type=\"text\" id=\"address2\" /><br />" |
| 182 "<label for=\"city\">City:</label>" |
| 183 " <input type=\"text\" id=\"city\" /><br />" |
| 184 "</form>"))); |
| 185 |
| 186 ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), |
| 187 VIEW_ID_TAB_CONTAINER)); |
| 188 ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), |
| 189 VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
| 190 |
| 191 AutoFillManager* autofill_manager = |
| 192 browser()->GetSelectedTabContents()->GetAutoFillManager(); |
| 193 ASSERT_NE(static_cast<AutoFillManager*>(NULL), autofill_manager); |
| 194 std::vector<FormStructure*> forms = GetFormStructures(*autofill_manager); |
| 195 std::string expected("data:text/html;charset=utf-8," |
| 196 "<form action=\"http://www.google.com/\"" |
| 197 " method=\"POST\">" |
| 198 "<label for=\"firstname\">First name:</label>" |
| 199 " <input type=\"text\" id=\"firstname\"/><br />" |
| 200 "<label for=\"lastname\">Last name:</label>" |
| 201 " <input type=\"text\" id=\"lastname\" /><br />" |
| 202 "<label for=\"address1\">Address line 1:</label>" |
| 203 " <input type=\"text\" id=\"address1\" /><br />" |
| 204 "<label for=\"address2\">Address line 2:</label>" |
| 205 " <input type=\"text\" id=\"address2\" /><br />" |
| 206 "<label for=\"city\">City:</label>" |
| 207 " <input type=\"text\" id=\"city\" /><br />" |
| 208 "</form>\n" |
| 209 "NAME_FIRST\n" |
| 210 "NAME_LAST\n" |
| 211 "ADDRESS_HOME_LINE1\n" |
| 212 "ADDRESS_HOME_LINE2\n" |
| 213 "ADDRESS_HOME_CITY\n"); |
| 214 |
| 215 EXPECT_EQ(expected, FormStructureBrowserTest::FormStructuresToString(forms)); |
| 216 } |
OLD | NEW |