| 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 "base/string_util.h" | |
| 6 #include "base/utf_string_conversions.h" | |
| 7 #include "chrome/renderer/form_manager.h" | |
| 8 #include "chrome/test/render_view_test.h" | |
| 9 #include "testing/gtest/include/gtest/gtest.h" | |
| 10 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" | |
| 11 #include "third_party/WebKit/WebKit/chromium/public/WebElement.h" | |
| 12 #include "third_party/WebKit/WebKit/chromium/public/WebFormControlElement.h" | |
| 13 #include "third_party/WebKit/WebKit/chromium/public/WebFormElement.h" | |
| 14 #include "third_party/WebKit/WebKit/chromium/public/WebInputElement.h" | |
| 15 #include "third_party/WebKit/WebKit/chromium/public/WebNode.h" | |
| 16 #include "third_party/WebKit/WebKit/chromium/public/WebString.h" | |
| 17 #include "third_party/WebKit/WebKit/chromium/public/WebVector.h" | |
| 18 #include "webkit/glue/form_data.h" | |
| 19 | |
| 20 using WebKit::WebDocument; | |
| 21 using WebKit::WebElement; | |
| 22 using WebKit::WebFormControlElement; | |
| 23 using WebKit::WebFormElement; | |
| 24 using WebKit::WebFrame; | |
| 25 using WebKit::WebInputElement; | |
| 26 using WebKit::WebNode; | |
| 27 using WebKit::WebString; | |
| 28 using WebKit::WebVector; | |
| 29 | |
| 30 using webkit_glue::FormData; | |
| 31 using webkit_glue::FormField; | |
| 32 | |
| 33 namespace { | |
| 34 | |
| 35 typedef RenderViewTest FormManagerTest; | |
| 36 | |
| 37 TEST_F(FormManagerTest, WebFormElementToFormData) { | |
| 38 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 39 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 40 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 41 " <INPUT type=\"hidden\" id=\"notvisible\" value=\"apple\"/>" | |
| 42 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 43 "</FORM>"); | |
| 44 | |
| 45 WebFrame* frame = GetMainFrame(); | |
| 46 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); | |
| 47 | |
| 48 WebVector<WebFormElement> forms; | |
| 49 frame->forms(forms); | |
| 50 ASSERT_EQ(1U, forms.size()); | |
| 51 | |
| 52 FormData form; | |
| 53 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], | |
| 54 FormManager::REQUIRE_NONE, | |
| 55 true, | |
| 56 &form)); | |
| 57 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 58 EXPECT_EQ(GURL(frame->url()), form.origin); | |
| 59 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 60 | |
| 61 const std::vector<FormField>& fields = form.fields; | |
| 62 ASSERT_EQ(4U, fields.size()); | |
| 63 EXPECT_TRUE(fields[0].StrictlyEqualsHack( | |
| 64 FormField(string16(), | |
| 65 ASCIIToUTF16("firstname"), | |
| 66 ASCIIToUTF16("John"), | |
| 67 ASCIIToUTF16("text"), | |
| 68 20))); | |
| 69 EXPECT_TRUE(fields[1].StrictlyEqualsHack( | |
| 70 FormField(string16(), | |
| 71 ASCIIToUTF16("lastname"), | |
| 72 ASCIIToUTF16("Smith"), | |
| 73 ASCIIToUTF16("text"), | |
| 74 20))); | |
| 75 EXPECT_TRUE(fields[2].StrictlyEqualsHack( | |
| 76 FormField(string16(), | |
| 77 ASCIIToUTF16("notvisible"), | |
| 78 ASCIIToUTF16("apple"), | |
| 79 ASCIIToUTF16("hidden"), | |
| 80 0))); | |
| 81 EXPECT_TRUE(fields[3].StrictlyEqualsHack( | |
| 82 FormField(string16(), | |
| 83 ASCIIToUTF16("reply-send"), | |
| 84 string16(), | |
| 85 ASCIIToUTF16("submit"), | |
| 86 0))); | |
| 87 } | |
| 88 | |
| 89 TEST_F(FormManagerTest, ExtractForms) { | |
| 90 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 91 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 92 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 93 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 94 "</FORM>"); | |
| 95 | |
| 96 WebFrame* web_frame = GetMainFrame(); | |
| 97 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 98 | |
| 99 FormManager form_manager; | |
| 100 form_manager.ExtractForms(web_frame); | |
| 101 | |
| 102 std::vector<FormData> forms; | |
| 103 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 104 ASSERT_EQ(1U, forms.size()); | |
| 105 | |
| 106 const FormData& form = forms[0]; | |
| 107 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 108 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 109 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 110 | |
| 111 const std::vector<FormField>& fields = form.fields; | |
| 112 ASSERT_EQ(3U, fields.size()); | |
| 113 EXPECT_EQ(FormField(string16(), | |
| 114 ASCIIToUTF16("firstname"), | |
| 115 ASCIIToUTF16("John"), | |
| 116 ASCIIToUTF16("text"), | |
| 117 20), | |
| 118 fields[0]); | |
| 119 EXPECT_EQ(FormField(string16(), | |
| 120 ASCIIToUTF16("lastname"), | |
| 121 ASCIIToUTF16("Smith"), | |
| 122 ASCIIToUTF16("text"), | |
| 123 20), | |
| 124 fields[1]); | |
| 125 EXPECT_EQ(FormField(string16(), | |
| 126 ASCIIToUTF16("reply-send"), | |
| 127 ASCIIToUTF16("Send"), | |
| 128 ASCIIToUTF16("submit"), | |
| 129 0), | |
| 130 fields[2]); | |
| 131 } | |
| 132 | |
| 133 TEST_F(FormManagerTest, ExtractMultipleForms) { | |
| 134 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 135 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 136 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 137 "</FORM>" | |
| 138 "<FORM name=\"TestForm2\" action=\"http://zoo.com\" method=\"post\">" | |
| 139 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 140 " <INPUT type=\"submit\" name=\"second\" value=\"Submit\"/>" | |
| 141 "</FORM>"); | |
| 142 | |
| 143 WebFrame* web_frame = GetMainFrame(); | |
| 144 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 145 | |
| 146 FormManager form_manager; | |
| 147 form_manager.ExtractForms(web_frame); | |
| 148 | |
| 149 std::vector<FormData> forms; | |
| 150 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 151 ASSERT_EQ(2U, forms.size()); | |
| 152 | |
| 153 // First form. | |
| 154 const FormData& form = forms[0]; | |
| 155 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 156 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 157 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 158 | |
| 159 const std::vector<FormField>& fields = form.fields; | |
| 160 ASSERT_EQ(2U, fields.size()); | |
| 161 EXPECT_EQ(FormField(string16(), | |
| 162 ASCIIToUTF16("firstname"), | |
| 163 ASCIIToUTF16("John"), | |
| 164 ASCIIToUTF16("text"), | |
| 165 20), | |
| 166 fields[0]); | |
| 167 EXPECT_EQ(FormField(string16(), | |
| 168 ASCIIToUTF16("reply-send"), | |
| 169 ASCIIToUTF16("Send"), | |
| 170 ASCIIToUTF16("submit"), | |
| 171 0), | |
| 172 fields[1]); | |
| 173 | |
| 174 // Second form. | |
| 175 const FormData& form2 = forms[1]; | |
| 176 EXPECT_EQ(ASCIIToUTF16("TestForm2"), form2.name); | |
| 177 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 178 EXPECT_EQ(GURL("http://zoo.com"), form2.action); | |
| 179 | |
| 180 const std::vector<FormField>& fields2 = form2.fields; | |
| 181 ASSERT_EQ(2U, fields2.size()); | |
| 182 EXPECT_EQ(FormField(string16(), | |
| 183 ASCIIToUTF16("lastname"), | |
| 184 ASCIIToUTF16("Smith"), | |
| 185 ASCIIToUTF16("text"), | |
| 186 20), | |
| 187 fields2[0]); | |
| 188 EXPECT_EQ(FormField(string16(), | |
| 189 ASCIIToUTF16("second"), | |
| 190 ASCIIToUTF16("Submit"), | |
| 191 ASCIIToUTF16("submit"), | |
| 192 0), | |
| 193 fields2[1]); | |
| 194 } | |
| 195 | |
| 196 TEST_F(FormManagerTest, GetFormsAutocomplete) { | |
| 197 // Form is not auto-completable due to autocomplete=off. | |
| 198 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\"" | |
| 199 " autocomplete=off>" | |
| 200 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 201 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 202 "</FORM>"); | |
| 203 | |
| 204 WebFrame* web_frame = GetMainFrame(); | |
| 205 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 206 | |
| 207 FormManager form_manager; | |
| 208 form_manager.ExtractForms(web_frame); | |
| 209 | |
| 210 // Verify that we did load the forms. | |
| 211 std::vector<FormData> forms; | |
| 212 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 213 ASSERT_EQ(1U, forms.size()); | |
| 214 | |
| 215 // autocomplete=off and we're requiring autocomplete, so no forms returned. | |
| 216 forms.clear(); | |
| 217 form_manager.GetForms(FormManager::REQUIRE_AUTOCOMPLETE, &forms); | |
| 218 ASSERT_EQ(0U, forms.size()); | |
| 219 | |
| 220 // The firstname element is not auto-completable due to autocomplete=off. | |
| 221 LoadHTML("<FORM name=\"TestForm\" action=\"http://abc.com\" method=\"post\">" | |
| 222 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"" | |
| 223 " autocomplete=off>" | |
| 224 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 225 " <INPUT type=\"submit\" name=\"reply\" value=\"Send\"/>" | |
| 226 "</FORM>"); | |
| 227 | |
| 228 web_frame = GetMainFrame(); | |
| 229 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 230 | |
| 231 form_manager.Reset(); | |
| 232 form_manager.ExtractForms(web_frame); | |
| 233 | |
| 234 forms.clear(); | |
| 235 form_manager.GetForms(FormManager::REQUIRE_AUTOCOMPLETE, &forms); | |
| 236 ASSERT_EQ(1U, forms.size()); | |
| 237 | |
| 238 const FormData& form = forms[0]; | |
| 239 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 240 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 241 EXPECT_EQ(GURL("http://abc.com"), form.action); | |
| 242 | |
| 243 const std::vector<FormField>& fields = form.fields; | |
| 244 ASSERT_EQ(2U, fields.size()); | |
| 245 EXPECT_EQ(FormField(string16(), | |
| 246 ASCIIToUTF16("lastname"), | |
| 247 ASCIIToUTF16("Smith"), | |
| 248 ASCIIToUTF16("text"), | |
| 249 20), | |
| 250 fields[0]); | |
| 251 EXPECT_EQ(FormField(string16(), | |
| 252 ASCIIToUTF16("reply"), | |
| 253 ASCIIToUTF16("Send"), | |
| 254 ASCIIToUTF16("submit"), | |
| 255 0), | |
| 256 fields[1]); | |
| 257 } | |
| 258 | |
| 259 TEST_F(FormManagerTest, GetFormsElementsEnabled) { | |
| 260 // The firstname element is not enabled due to disabled being set. | |
| 261 LoadHTML("<FORM name=\"TestForm\" action=\"http://xyz.com\" method=\"post\">" | |
| 262 " <INPUT disabled type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 263 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 264 " <INPUT type=\"submit\" name=\"submit\" value=\"Send\"/>" | |
| 265 "</FORM>"); | |
| 266 | |
| 267 WebFrame* web_frame = GetMainFrame(); | |
| 268 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 269 | |
| 270 FormManager form_manager; | |
| 271 form_manager.ExtractForms(web_frame); | |
| 272 | |
| 273 std::vector<FormData> forms; | |
| 274 form_manager.GetForms(FormManager::REQUIRE_ENABLED, &forms); | |
| 275 ASSERT_EQ(1U, forms.size()); | |
| 276 | |
| 277 const FormData& form = forms[0]; | |
| 278 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 279 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 280 EXPECT_EQ(GURL("http://xyz.com"), form.action); | |
| 281 | |
| 282 const std::vector<FormField>& fields = form.fields; | |
| 283 ASSERT_EQ(2U, fields.size()); | |
| 284 EXPECT_EQ(FormField(string16(), | |
| 285 ASCIIToUTF16("lastname"), | |
| 286 ASCIIToUTF16("Smith"), | |
| 287 ASCIIToUTF16("text"), | |
| 288 20), | |
| 289 fields[0]); | |
| 290 EXPECT_EQ(FormField(string16(), | |
| 291 ASCIIToUTF16("submit"), | |
| 292 ASCIIToUTF16("Send"), | |
| 293 ASCIIToUTF16("submit"), | |
| 294 0), | |
| 295 fields[1]); | |
| 296 } | |
| 297 | |
| 298 TEST_F(FormManagerTest, FindForm) { | |
| 299 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 300 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 301 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 302 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 303 "</FORM>"); | |
| 304 | |
| 305 WebFrame* web_frame = GetMainFrame(); | |
| 306 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 307 | |
| 308 FormManager form_manager; | |
| 309 form_manager.ExtractForms(web_frame); | |
| 310 | |
| 311 // Verify that we have the form. | |
| 312 std::vector<FormData> forms; | |
| 313 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 314 ASSERT_EQ(1U, forms.size()); | |
| 315 | |
| 316 // Get the input element we want to find. | |
| 317 WebElement element = web_frame->document().getElementById("firstname"); | |
| 318 WebInputElement input_element = element.to<WebInputElement>(); | |
| 319 | |
| 320 // Find the form and verify it's the correct form. | |
| 321 FormData form; | |
| 322 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 323 input_element, FormManager::REQUIRE_NONE, &form)); | |
| 324 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 325 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 326 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
| 327 | |
| 328 const std::vector<FormField>& fields = form.fields; | |
| 329 ASSERT_EQ(3U, fields.size()); | |
| 330 EXPECT_EQ(FormField(string16(), | |
| 331 ASCIIToUTF16("firstname"), | |
| 332 ASCIIToUTF16("John"), | |
| 333 ASCIIToUTF16("text"), | |
| 334 20), | |
| 335 fields[0]); | |
| 336 EXPECT_EQ(FormField(string16(), | |
| 337 ASCIIToUTF16("lastname"), | |
| 338 ASCIIToUTF16("Smith"), | |
| 339 ASCIIToUTF16("text"), | |
| 340 20), | |
| 341 fields[1]); | |
| 342 EXPECT_EQ(FormField(string16(), | |
| 343 ASCIIToUTF16("reply-send"), | |
| 344 ASCIIToUTF16("Send"), | |
| 345 ASCIIToUTF16("submit"), | |
| 346 0), | |
| 347 fields[2]); | |
| 348 } | |
| 349 | |
| 350 TEST_F(FormManagerTest, FillForm) { | |
| 351 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 352 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 353 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 354 " <INPUT type=\"hidden\" id=\"imhidden\"/>" | |
| 355 " <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>" | |
| 356 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>" | |
| 357 " <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>" | |
| 358 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 359 "</FORM>"); | |
| 360 | |
| 361 WebFrame* web_frame = GetMainFrame(); | |
| 362 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 363 | |
| 364 FormManager form_manager; | |
| 365 form_manager.ExtractForms(web_frame); | |
| 366 | |
| 367 // Verify that we have the form. | |
| 368 std::vector<FormData> forms; | |
| 369 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 370 ASSERT_EQ(1U, forms.size()); | |
| 371 | |
| 372 // Get the input element we want to find. | |
| 373 WebElement element = web_frame->document().getElementById("firstname"); | |
| 374 WebInputElement input_element = element.to<WebInputElement>(); | |
| 375 | |
| 376 // Find the form that contains the input element. | |
| 377 FormData form; | |
| 378 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 379 input_element, FormManager::REQUIRE_NONE, &form)); | |
| 380 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 381 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 382 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
| 383 | |
| 384 const std::vector<FormField>& fields = form.fields; | |
| 385 ASSERT_EQ(7U, fields.size()); | |
| 386 EXPECT_EQ(FormField(string16(), | |
| 387 ASCIIToUTF16("firstname"), | |
| 388 string16(), | |
| 389 ASCIIToUTF16("text"), | |
| 390 20), | |
| 391 fields[0]); | |
| 392 EXPECT_EQ(FormField(string16(), | |
| 393 ASCIIToUTF16("lastname"), | |
| 394 string16(), | |
| 395 ASCIIToUTF16("text"), | |
| 396 20), | |
| 397 fields[1]); | |
| 398 EXPECT_EQ(FormField(string16(), | |
| 399 ASCIIToUTF16("imhidden"), | |
| 400 string16(), | |
| 401 ASCIIToUTF16("hidden"), | |
| 402 0), | |
| 403 fields[2]); | |
| 404 EXPECT_EQ(FormField(string16(), | |
| 405 ASCIIToUTF16("notempty"), | |
| 406 ASCIIToUTF16("Hi"), | |
| 407 ASCIIToUTF16("text"), | |
| 408 20), | |
| 409 fields[3]); | |
| 410 EXPECT_EQ(FormField(string16(), | |
| 411 ASCIIToUTF16("noautocomplete"), | |
| 412 string16(), | |
| 413 ASCIIToUTF16("text"), | |
| 414 20), | |
| 415 fields[4]); | |
| 416 EXPECT_EQ(FormField(string16(), | |
| 417 ASCIIToUTF16("notenabled"), | |
| 418 string16(), | |
| 419 ASCIIToUTF16("text"), | |
| 420 20), | |
| 421 fields[5]); | |
| 422 EXPECT_EQ(FormField(string16(), | |
| 423 ASCIIToUTF16("reply-send"), | |
| 424 ASCIIToUTF16("Send"), | |
| 425 ASCIIToUTF16("submit"), | |
| 426 0), | |
| 427 fields[6]); | |
| 428 | |
| 429 // Fill the form. | |
| 430 form.fields[0].set_value(ASCIIToUTF16("Wyatt")); | |
| 431 form.fields[1].set_value(ASCIIToUTF16("Earp")); | |
| 432 form.fields[2].set_value(ASCIIToUTF16("Alpha")); | |
| 433 form.fields[3].set_value(ASCIIToUTF16("Beta")); | |
| 434 form.fields[4].set_value(ASCIIToUTF16("Gamma")); | |
| 435 form.fields[5].set_value(ASCIIToUTF16("Delta")); | |
| 436 EXPECT_TRUE(form_manager.FillForm(form, WebNode())); | |
| 437 | |
| 438 // Verify the filled elements. | |
| 439 WebDocument document = web_frame->document(); | |
| 440 WebInputElement firstname = | |
| 441 document.getElementById("firstname").to<WebInputElement>(); | |
| 442 EXPECT_TRUE(firstname.isAutofilled()); | |
| 443 EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); | |
| 444 | |
| 445 WebInputElement lastname = | |
| 446 document.getElementById("lastname").to<WebInputElement>(); | |
| 447 EXPECT_TRUE(lastname.isAutofilled()); | |
| 448 EXPECT_EQ(ASCIIToUTF16("Earp"), lastname.value()); | |
| 449 | |
| 450 // Hidden fields are not filled. | |
| 451 WebInputElement imhidden = | |
| 452 document.getElementById("imhidden").to<WebInputElement>(); | |
| 453 EXPECT_FALSE(imhidden.isAutofilled()); | |
| 454 EXPECT_TRUE(imhidden.value().isEmpty()); | |
| 455 | |
| 456 // Non-empty fields are not filled. | |
| 457 WebInputElement notempty = | |
| 458 document.getElementById("notempty").to<WebInputElement>(); | |
| 459 EXPECT_FALSE(notempty.isAutofilled()); | |
| 460 EXPECT_EQ(ASCIIToUTF16("Hi"), notempty.value()); | |
| 461 | |
| 462 // autocomplete=off fields are not filled. | |
| 463 WebInputElement noautocomplete = | |
| 464 document.getElementById("noautocomplete").to<WebInputElement>(); | |
| 465 EXPECT_FALSE(noautocomplete.isAutofilled()); | |
| 466 EXPECT_TRUE(noautocomplete.value().isEmpty()); | |
| 467 | |
| 468 // Disabled fields are not filled. | |
| 469 WebInputElement notenabled = | |
| 470 document.getElementById("notenabled").to<WebInputElement>(); | |
| 471 EXPECT_FALSE(notenabled.isAutofilled()); | |
| 472 EXPECT_TRUE(notenabled.value().isEmpty()); | |
| 473 } | |
| 474 | |
| 475 TEST_F(FormManagerTest, PreviewForm) { | |
| 476 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 477 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 478 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 479 " <INPUT type=\"hidden\" id=\"imhidden\"/>" | |
| 480 " <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>" | |
| 481 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>" | |
| 482 " <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>" | |
| 483 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 484 "</FORM>"); | |
| 485 | |
| 486 WebFrame* web_frame = GetMainFrame(); | |
| 487 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 488 | |
| 489 FormManager form_manager; | |
| 490 form_manager.ExtractForms(web_frame); | |
| 491 | |
| 492 // Verify that we have the form. | |
| 493 std::vector<FormData> forms; | |
| 494 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 495 ASSERT_EQ(1U, forms.size()); | |
| 496 | |
| 497 // Get the input element we want to find. | |
| 498 WebElement element = web_frame->document().getElementById("firstname"); | |
| 499 WebInputElement input_element = element.to<WebInputElement>(); | |
| 500 | |
| 501 // Find the form that contains the input element. | |
| 502 FormData form; | |
| 503 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 504 input_element, FormManager::REQUIRE_NONE, &form)); | |
| 505 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 506 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 507 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
| 508 | |
| 509 const std::vector<FormField>& fields = form.fields; | |
| 510 ASSERT_EQ(7U, fields.size()); | |
| 511 EXPECT_EQ(FormField(string16(), | |
| 512 ASCIIToUTF16("firstname"), | |
| 513 string16(), | |
| 514 ASCIIToUTF16("text"), | |
| 515 20), | |
| 516 fields[0]); | |
| 517 EXPECT_EQ(FormField(string16(), | |
| 518 ASCIIToUTF16("lastname"), | |
| 519 string16(), | |
| 520 ASCIIToUTF16("text"), | |
| 521 20), | |
| 522 fields[1]); | |
| 523 EXPECT_EQ(FormField(string16(), | |
| 524 ASCIIToUTF16("imhidden"), | |
| 525 string16(), | |
| 526 ASCIIToUTF16("hidden"), | |
| 527 0), | |
| 528 fields[2]); | |
| 529 EXPECT_EQ(FormField(string16(), | |
| 530 ASCIIToUTF16("notempty"), | |
| 531 ASCIIToUTF16("Hi"), | |
| 532 ASCIIToUTF16("text"), | |
| 533 20), | |
| 534 fields[3]); | |
| 535 EXPECT_EQ(FormField(string16(), | |
| 536 ASCIIToUTF16("noautocomplete"), | |
| 537 string16(), | |
| 538 ASCIIToUTF16("text"), | |
| 539 20), | |
| 540 fields[4]); | |
| 541 EXPECT_EQ(FormField(string16(), | |
| 542 ASCIIToUTF16("notenabled"), | |
| 543 string16(), | |
| 544 ASCIIToUTF16("text"), | |
| 545 20), | |
| 546 fields[5]); | |
| 547 EXPECT_EQ(FormField(string16(), | |
| 548 ASCIIToUTF16("reply-send"), | |
| 549 ASCIIToUTF16("Send"), | |
| 550 ASCIIToUTF16("submit"), | |
| 551 0), | |
| 552 fields[6]); | |
| 553 | |
| 554 // Preview the form. | |
| 555 form.fields[0].set_value(ASCIIToUTF16("Wyatt")); | |
| 556 form.fields[1].set_value(ASCIIToUTF16("Earp")); | |
| 557 form.fields[2].set_value(ASCIIToUTF16("Alpha")); | |
| 558 form.fields[3].set_value(ASCIIToUTF16("Beta")); | |
| 559 form.fields[4].set_value(ASCIIToUTF16("Gamma")); | |
| 560 form.fields[5].set_value(ASCIIToUTF16("Delta")); | |
| 561 EXPECT_TRUE(form_manager.PreviewForm(form)); | |
| 562 | |
| 563 // Verify the previewed elements. | |
| 564 WebDocument document = web_frame->document(); | |
| 565 WebInputElement firstname = | |
| 566 document.getElementById("firstname").to<WebInputElement>(); | |
| 567 EXPECT_TRUE(firstname.isAutofilled()); | |
| 568 EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.suggestedValue()); | |
| 569 | |
| 570 WebInputElement lastname = | |
| 571 document.getElementById("lastname").to<WebInputElement>(); | |
| 572 EXPECT_TRUE(lastname.isAutofilled()); | |
| 573 EXPECT_EQ(ASCIIToUTF16("Earp"), lastname.suggestedValue()); | |
| 574 | |
| 575 // Hidden fields are not previewed. | |
| 576 WebInputElement imhidden = | |
| 577 document.getElementById("imhidden").to<WebInputElement>(); | |
| 578 EXPECT_FALSE(imhidden.isAutofilled()); | |
| 579 EXPECT_TRUE(imhidden.suggestedValue().isEmpty()); | |
| 580 | |
| 581 // Non-empty fields are not previewed. | |
| 582 WebInputElement notempty = | |
| 583 document.getElementById("notempty").to<WebInputElement>(); | |
| 584 EXPECT_FALSE(notempty.isAutofilled()); | |
| 585 EXPECT_TRUE(notempty.suggestedValue().isEmpty()); | |
| 586 | |
| 587 // autocomplete=off fields are not previewed. | |
| 588 WebInputElement noautocomplete = | |
| 589 document.getElementById("noautocomplete").to<WebInputElement>(); | |
| 590 EXPECT_FALSE(noautocomplete.isAutofilled()); | |
| 591 EXPECT_TRUE(noautocomplete.suggestedValue().isEmpty()); | |
| 592 | |
| 593 // Disabled fields are not previewed. | |
| 594 WebInputElement notenabled = | |
| 595 document.getElementById("notenabled").to<WebInputElement>(); | |
| 596 EXPECT_FALSE(notenabled.isAutofilled()); | |
| 597 EXPECT_TRUE(notenabled.suggestedValue().isEmpty()); | |
| 598 } | |
| 599 | |
| 600 TEST_F(FormManagerTest, Reset) { | |
| 601 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 602 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 603 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 604 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 605 "</FORM>"); | |
| 606 | |
| 607 WebFrame* web_frame = GetMainFrame(); | |
| 608 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 609 | |
| 610 FormManager form_manager; | |
| 611 form_manager.ExtractForms(web_frame); | |
| 612 | |
| 613 std::vector<FormData> forms; | |
| 614 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 615 ASSERT_EQ(1U, forms.size()); | |
| 616 | |
| 617 // There should be no forms after the call to Reset. | |
| 618 form_manager.Reset(); | |
| 619 | |
| 620 forms.clear(); | |
| 621 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 622 ASSERT_EQ(0U, forms.size()); | |
| 623 } | |
| 624 | |
| 625 TEST_F(FormManagerTest, Labels) { | |
| 626 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 627 " <LABEL for=\"firstname\"> First name: </LABEL>" | |
| 628 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 629 " <LABEL for=\"lastname\"> Last name: </LABEL>" | |
| 630 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 631 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 632 "</FORM>"); | |
| 633 | |
| 634 WebFrame* web_frame = GetMainFrame(); | |
| 635 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 636 | |
| 637 FormManager form_manager; | |
| 638 form_manager.ExtractForms(web_frame); | |
| 639 | |
| 640 std::vector<FormData> forms; | |
| 641 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 642 ASSERT_EQ(1U, forms.size()); | |
| 643 | |
| 644 const FormData& form = forms[0]; | |
| 645 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 646 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 647 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 648 | |
| 649 const std::vector<FormField>& fields = form.fields; | |
| 650 ASSERT_EQ(3U, fields.size()); | |
| 651 EXPECT_TRUE(fields[0].StrictlyEqualsHack( | |
| 652 FormField(ASCIIToUTF16("First name:"), | |
| 653 ASCIIToUTF16("firstname"), | |
| 654 ASCIIToUTF16("John"), | |
| 655 ASCIIToUTF16("text"), | |
| 656 20))); | |
| 657 EXPECT_TRUE(fields[1].StrictlyEqualsHack( | |
| 658 FormField(ASCIIToUTF16("Last name:"), | |
| 659 ASCIIToUTF16("lastname"), | |
| 660 ASCIIToUTF16("Smith"), | |
| 661 ASCIIToUTF16("text"), | |
| 662 20))); | |
| 663 EXPECT_TRUE(fields[2].StrictlyEqualsHack( | |
| 664 FormField(string16(), | |
| 665 ASCIIToUTF16("reply-send"), | |
| 666 string16(), | |
| 667 ASCIIToUTF16("submit"), | |
| 668 0))); | |
| 669 } | |
| 670 | |
| 671 TEST_F(FormManagerTest, LabelsWithSpans) { | |
| 672 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 673 " <LABEL for=\"firstname\"><span>First name: </span></LABEL>" | |
| 674 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 675 " <LABEL for=\"lastname\"><span>Last name: </span></LABEL>" | |
| 676 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 677 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 678 "</FORM>"); | |
| 679 | |
| 680 WebFrame* web_frame = GetMainFrame(); | |
| 681 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 682 | |
| 683 FormManager form_manager; | |
| 684 form_manager.ExtractForms(web_frame); | |
| 685 | |
| 686 std::vector<FormData> forms; | |
| 687 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 688 ASSERT_EQ(1U, forms.size()); | |
| 689 | |
| 690 const FormData& form = forms[0]; | |
| 691 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 692 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 693 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 694 | |
| 695 const std::vector<FormField>& fields = form.fields; | |
| 696 ASSERT_EQ(3U, fields.size()); | |
| 697 EXPECT_TRUE(fields[0].StrictlyEqualsHack( | |
| 698 FormField(ASCIIToUTF16("First name:"), | |
| 699 ASCIIToUTF16("firstname"), | |
| 700 ASCIIToUTF16("John"), | |
| 701 ASCIIToUTF16("text"), | |
| 702 20))); | |
| 703 EXPECT_TRUE(fields[1].StrictlyEqualsHack( | |
| 704 FormField(ASCIIToUTF16("Last name:"), | |
| 705 ASCIIToUTF16("lastname"), | |
| 706 ASCIIToUTF16("Smith"), | |
| 707 ASCIIToUTF16("text"), | |
| 708 20))); | |
| 709 EXPECT_TRUE(fields[2].StrictlyEqualsHack( | |
| 710 FormField(string16(), | |
| 711 ASCIIToUTF16("reply-send"), | |
| 712 string16(), | |
| 713 ASCIIToUTF16("submit"), | |
| 714 0))); | |
| 715 } | |
| 716 | |
| 717 // This test is different from FormManagerTest.Labels in that the label elements | |
| 718 // for= attribute is set to the name of the form control element it is a label | |
| 719 // for instead of the id of the form control element. This is invalid because | |
| 720 // the for= attribute must be set to the id of the form control element. | |
| 721 TEST_F(FormManagerTest, InvalidLabels) { | |
| 722 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 723 " <LABEL for=\"firstname\"> First name: </LABEL>" | |
| 724 " <INPUT type=\"text\" name=\"firstname\" value=\"John\"/>" | |
| 725 " <LABEL for=\"lastname\"> Last name: </LABEL>" | |
| 726 " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\"/>" | |
| 727 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 728 "</FORM>"); | |
| 729 | |
| 730 WebFrame* web_frame = GetMainFrame(); | |
| 731 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 732 | |
| 733 FormManager form_manager; | |
| 734 form_manager.ExtractForms(web_frame); | |
| 735 | |
| 736 std::vector<FormData> forms; | |
| 737 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 738 ASSERT_EQ(1U, forms.size()); | |
| 739 | |
| 740 const FormData& form = forms[0]; | |
| 741 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 742 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 743 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 744 | |
| 745 const std::vector<FormField>& fields = form.fields; | |
| 746 ASSERT_EQ(3U, fields.size()); | |
| 747 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), | |
| 748 ASCIIToUTF16("firstname"), | |
| 749 ASCIIToUTF16("John"), | |
| 750 ASCIIToUTF16("text"), | |
| 751 20))); | |
| 752 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), | |
| 753 ASCIIToUTF16("lastname"), | |
| 754 ASCIIToUTF16("Smith"), | |
| 755 ASCIIToUTF16("text"), | |
| 756 20))); | |
| 757 EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(), | |
| 758 ASCIIToUTF16("reply-send"), | |
| 759 string16(), | |
| 760 ASCIIToUTF16("submit"), | |
| 761 0))); | |
| 762 } | |
| 763 | |
| 764 // This test has three form control elements, only one of which has a label | |
| 765 // element associated with it. The first element is disabled because of the | |
| 766 // autocomplete=off attribute. | |
| 767 TEST_F(FormManagerTest, OneLabelElementFirstControlElementDisabled) { | |
| 768 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 769 " First name:" | |
| 770 " <INPUT type=\"text\" id=\"firstname\" autocomplete=\"off\"/>" | |
| 771 " <LABEL for=\"middlename\">Middle name: </LABEL>" | |
| 772 " <INPUT type=\"text\" id=\"middlename\"/>" | |
| 773 " Last name:" | |
| 774 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 775 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 776 "</FORM>"); | |
| 777 | |
| 778 WebFrame* web_frame = GetMainFrame(); | |
| 779 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 780 | |
| 781 FormManager form_manager; | |
| 782 form_manager.ExtractForms(web_frame); | |
| 783 | |
| 784 std::vector<FormData> forms; | |
| 785 form_manager.GetForms(FormManager::REQUIRE_AUTOCOMPLETE, &forms); | |
| 786 ASSERT_EQ(1U, forms.size()); | |
| 787 | |
| 788 const FormData& form = forms[0]; | |
| 789 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 790 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 791 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 792 | |
| 793 const std::vector<FormField>& fields = form.fields; | |
| 794 ASSERT_EQ(3U, fields.size()); | |
| 795 EXPECT_EQ(FormField(ASCIIToUTF16("Middle name:"), | |
| 796 ASCIIToUTF16("middlename"), | |
| 797 string16(), | |
| 798 ASCIIToUTF16("text"), | |
| 799 20), | |
| 800 fields[0]); | |
| 801 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | |
| 802 ASCIIToUTF16("lastname"), | |
| 803 string16(), | |
| 804 ASCIIToUTF16("text"), | |
| 805 20), | |
| 806 fields[1]); | |
| 807 EXPECT_EQ(FormField(string16(), | |
| 808 ASCIIToUTF16("reply-send"), | |
| 809 ASCIIToUTF16("Send"), | |
| 810 ASCIIToUTF16("submit"), | |
| 811 0), | |
| 812 fields[2]); | |
| 813 } | |
| 814 | |
| 815 // Crashy, http://crbug.com/52731. | |
| 816 TEST_F(FormManagerTest, DISABLED_LabelsInferredFromText) { | |
| 817 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 818 " First name:" | |
| 819 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 820 " Last name:" | |
| 821 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 822 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 823 "</FORM>"); | |
| 824 | |
| 825 WebFrame* web_frame = GetMainFrame(); | |
| 826 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 827 | |
| 828 FormManager form_manager; | |
| 829 form_manager.ExtractForms(web_frame); | |
| 830 | |
| 831 std::vector<FormData> forms; | |
| 832 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 833 ASSERT_EQ(1U, forms.size()); | |
| 834 | |
| 835 const FormData& form = forms[0]; | |
| 836 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 837 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 838 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 839 | |
| 840 const std::vector<FormField>& fields = form.fields; | |
| 841 ASSERT_EQ(3U, fields.size()); | |
| 842 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), | |
| 843 ASCIIToUTF16("firstname"), | |
| 844 ASCIIToUTF16("John"), | |
| 845 ASCIIToUTF16("text"), | |
| 846 20), | |
| 847 fields[0]); | |
| 848 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | |
| 849 ASCIIToUTF16("lastname"), | |
| 850 ASCIIToUTF16("Smith"), | |
| 851 ASCIIToUTF16("text"), | |
| 852 20), | |
| 853 fields[1]); | |
| 854 EXPECT_EQ(FormField(string16(), | |
| 855 ASCIIToUTF16("reply-send"), | |
| 856 ASCIIToUTF16("Send"), | |
| 857 ASCIIToUTF16("submit"), | |
| 858 0), | |
| 859 fields[2]); | |
| 860 } | |
| 861 | |
| 862 TEST_F(FormManagerTest, LabelsInferredFromTextHidden) { | |
| 863 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 864 " First name:" | |
| 865 " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>" | |
| 866 " Last name:" | |
| 867 " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>" | |
| 868 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 869 "</FORM>"); | |
| 870 | |
| 871 WebFrame* web_frame = GetMainFrame(); | |
| 872 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 873 | |
| 874 FormManager form_manager; | |
| 875 form_manager.ExtractForms(web_frame); | |
| 876 | |
| 877 std::vector<FormData> forms; | |
| 878 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 879 ASSERT_EQ(1U, forms.size()); | |
| 880 | |
| 881 const FormData& form = forms[0]; | |
| 882 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 883 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 884 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 885 | |
| 886 const std::vector<FormField>& fields = form.fields; | |
| 887 ASSERT_EQ(3U, fields.size()); | |
| 888 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), | |
| 889 ASCIIToUTF16("firstname"), | |
| 890 ASCIIToUTF16("John"), | |
| 891 ASCIIToUTF16("hidden"), | |
| 892 0))); | |
| 893 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), | |
| 894 ASCIIToUTF16("lastname"), | |
| 895 ASCIIToUTF16("Smith"), | |
| 896 ASCIIToUTF16("hidden"), | |
| 897 0))); | |
| 898 EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(), | |
| 899 ASCIIToUTF16("reply-send"), | |
| 900 string16(), | |
| 901 ASCIIToUTF16("submit"), | |
| 902 0))); | |
| 903 } | |
| 904 | |
| 905 TEST_F(FormManagerTest, LabelsInferredFromParagraph) { | |
| 906 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 907 " <P>First name:</P><INPUT type=\"text\" " | |
| 908 " id=\"firstname\" value=\"John\"/>" | |
| 909 " <P>Last name:</P>" | |
| 910 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 911 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 912 "</FORM>"); | |
| 913 | |
| 914 WebFrame* web_frame = GetMainFrame(); | |
| 915 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 916 | |
| 917 FormManager form_manager; | |
| 918 form_manager.ExtractForms(web_frame); | |
| 919 | |
| 920 std::vector<FormData> forms; | |
| 921 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 922 ASSERT_EQ(1U, forms.size()); | |
| 923 | |
| 924 const FormData& form = forms[0]; | |
| 925 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 926 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 927 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 928 | |
| 929 const std::vector<FormField>& fields = form.fields; | |
| 930 ASSERT_EQ(3U, fields.size()); | |
| 931 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), | |
| 932 ASCIIToUTF16("firstname"), | |
| 933 ASCIIToUTF16("John"), | |
| 934 ASCIIToUTF16("text"), | |
| 935 20), | |
| 936 fields[0]); | |
| 937 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | |
| 938 ASCIIToUTF16("lastname"), | |
| 939 ASCIIToUTF16("Smith"), | |
| 940 ASCIIToUTF16("text"), | |
| 941 20), | |
| 942 fields[1]); | |
| 943 EXPECT_EQ(FormField(string16(), | |
| 944 ASCIIToUTF16("reply-send"), | |
| 945 ASCIIToUTF16("Send"), | |
| 946 ASCIIToUTF16("submit"), | |
| 947 0), | |
| 948 fields[2]); | |
| 949 } | |
| 950 | |
| 951 TEST_F(FormManagerTest, LabelsInferredFromTableCell) { | |
| 952 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 953 "<TABLE>" | |
| 954 " <TR>" | |
| 955 " <TD>First name:</TD>" | |
| 956 " <TD><INPUT type=\"text\" id=\"firstname\" value=\"John\"/></TD>" | |
| 957 " </TR>" | |
| 958 " <TR>" | |
| 959 " <TD>Last name:</TD>" | |
| 960 " <TD><INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/></TD>" | |
| 961 " </TR>" | |
| 962 " <TR>" | |
| 963 " <TD></TD>" | |
| 964 " <TD>" | |
| 965 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 966 " </TD>" | |
| 967 " </TR>" | |
| 968 "</TABLE>" | |
| 969 "</FORM>"); | |
| 970 | |
| 971 WebFrame* web_frame = GetMainFrame(); | |
| 972 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 973 | |
| 974 FormManager form_manager; | |
| 975 form_manager.ExtractForms(web_frame); | |
| 976 | |
| 977 std::vector<FormData> forms; | |
| 978 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 979 ASSERT_EQ(1U, forms.size()); | |
| 980 | |
| 981 const FormData& form = forms[0]; | |
| 982 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 983 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 984 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 985 | |
| 986 const std::vector<FormField>& fields = form.fields; | |
| 987 ASSERT_EQ(3U, fields.size()); | |
| 988 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), | |
| 989 ASCIIToUTF16("firstname"), | |
| 990 ASCIIToUTF16("John"), | |
| 991 ASCIIToUTF16("text"), | |
| 992 20), | |
| 993 fields[0]); | |
| 994 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | |
| 995 ASCIIToUTF16("lastname"), | |
| 996 ASCIIToUTF16("Smith"), | |
| 997 ASCIIToUTF16("text"), | |
| 998 20), | |
| 999 fields[1]); | |
| 1000 EXPECT_EQ(FormField(string16(), | |
| 1001 ASCIIToUTF16("reply-send"), | |
| 1002 ASCIIToUTF16("Send"), | |
| 1003 ASCIIToUTF16("submit"), | |
| 1004 0), | |
| 1005 fields[2]); | |
| 1006 } | |
| 1007 | |
| 1008 TEST_F(FormManagerTest, LabelsInferredFromTableCellNested) { | |
| 1009 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 1010 "<TABLE>" | |
| 1011 " <TR>" | |
| 1012 " <TD>" | |
| 1013 " <FONT>" | |
| 1014 " First name:" | |
| 1015 " </FONT>" | |
| 1016 " <FONT>" | |
| 1017 " Bogus" | |
| 1018 " </FONT>" | |
| 1019 " </TD>" | |
| 1020 " <TD>" | |
| 1021 " <FONT>" | |
| 1022 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 1023 " </FONT>" | |
| 1024 " </TD>" | |
| 1025 " </TR>" | |
| 1026 " <TR>" | |
| 1027 " <TD>" | |
| 1028 " <FONT>" | |
| 1029 " Last name:" | |
| 1030 " </FONT>" | |
| 1031 " </TD>" | |
| 1032 " <TD>" | |
| 1033 " <FONT>" | |
| 1034 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 1035 " </FONT>" | |
| 1036 " </TD>" | |
| 1037 " </TR>" | |
| 1038 " <TR>" | |
| 1039 " <TD></TD>" | |
| 1040 " <TD>" | |
| 1041 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1042 " </TD>" | |
| 1043 " </TR>" | |
| 1044 "</TABLE>" | |
| 1045 "</FORM>"); | |
| 1046 | |
| 1047 WebFrame* web_frame = GetMainFrame(); | |
| 1048 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1049 | |
| 1050 FormManager form_manager; | |
| 1051 form_manager.ExtractForms(web_frame); | |
| 1052 | |
| 1053 std::vector<FormData> forms; | |
| 1054 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1055 ASSERT_EQ(1U, forms.size()); | |
| 1056 | |
| 1057 const FormData& form = forms[0]; | |
| 1058 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 1059 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 1060 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 1061 | |
| 1062 const std::vector<FormField>& fields = form.fields; | |
| 1063 ASSERT_EQ(3U, fields.size()); | |
| 1064 EXPECT_EQ(FormField(ASCIIToUTF16("First name:Bogus"), | |
| 1065 ASCIIToUTF16("firstname"), | |
| 1066 ASCIIToUTF16("John"), | |
| 1067 ASCIIToUTF16("text"), | |
| 1068 20), | |
| 1069 fields[0]); | |
| 1070 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | |
| 1071 ASCIIToUTF16("lastname"), | |
| 1072 ASCIIToUTF16("Smith"), | |
| 1073 ASCIIToUTF16("text"), | |
| 1074 20), | |
| 1075 fields[1]); | |
| 1076 EXPECT_EQ(FormField(string16(), | |
| 1077 ASCIIToUTF16("reply-send"), | |
| 1078 ASCIIToUTF16("Send"), | |
| 1079 ASCIIToUTF16("submit"), | |
| 1080 0), | |
| 1081 fields[2]); | |
| 1082 } | |
| 1083 | |
| 1084 TEST_F(FormManagerTest, LabelsInferredFromDefinitionList) { | |
| 1085 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 1086 "<DL>" | |
| 1087 " <DT>" | |
| 1088 " <SPAN>" | |
| 1089 " *" | |
| 1090 " </SPAN>" | |
| 1091 " <SPAN>" | |
| 1092 " First name:" | |
| 1093 " </SPAN>" | |
| 1094 " <SPAN>" | |
| 1095 " Bogus" | |
| 1096 " </SPAN>" | |
| 1097 " </DT>" | |
| 1098 " <DD>" | |
| 1099 " <FONT>" | |
| 1100 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | |
| 1101 " </FONT>" | |
| 1102 " </DD>" | |
| 1103 " <DT>" | |
| 1104 " <SPAN>" | |
| 1105 " Last name:" | |
| 1106 " </SPAN>" | |
| 1107 " </DT>" | |
| 1108 " <DD>" | |
| 1109 " <FONT>" | |
| 1110 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | |
| 1111 " </FONT>" | |
| 1112 " </DD>" | |
| 1113 " <DT></DT>" | |
| 1114 " <DD>" | |
| 1115 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1116 " </DD>" | |
| 1117 "</DL>" | |
| 1118 "</FORM>"); | |
| 1119 | |
| 1120 WebFrame* web_frame = GetMainFrame(); | |
| 1121 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1122 | |
| 1123 FormManager form_manager; | |
| 1124 form_manager.ExtractForms(web_frame); | |
| 1125 | |
| 1126 std::vector<FormData> forms; | |
| 1127 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1128 ASSERT_EQ(1U, forms.size()); | |
| 1129 | |
| 1130 const FormData& form = forms[0]; | |
| 1131 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 1132 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 1133 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 1134 | |
| 1135 const std::vector<FormField>& fields = form.fields; | |
| 1136 ASSERT_EQ(3U, fields.size()); | |
| 1137 EXPECT_EQ(FormField(ASCIIToUTF16("*First name:Bogus"), | |
| 1138 ASCIIToUTF16("firstname"), | |
| 1139 ASCIIToUTF16("John"), | |
| 1140 ASCIIToUTF16("text"), | |
| 1141 20), | |
| 1142 fields[0]); | |
| 1143 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | |
| 1144 ASCIIToUTF16("lastname"), | |
| 1145 ASCIIToUTF16("Smith"), | |
| 1146 ASCIIToUTF16("text"), | |
| 1147 20), | |
| 1148 fields[1]); | |
| 1149 EXPECT_EQ(FormField(string16(), | |
| 1150 ASCIIToUTF16("reply-send"), | |
| 1151 ASCIIToUTF16("Send"), | |
| 1152 ASCIIToUTF16("submit"), | |
| 1153 0), | |
| 1154 fields[2]); | |
| 1155 } | |
| 1156 | |
| 1157 TEST_F(FormManagerTest, LabelsInferredWithSameName) { | |
| 1158 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 1159 " Address Line 1:" | |
| 1160 " <INPUT type=\"text\" name=\"Address\"/>" | |
| 1161 " Address Line 2:" | |
| 1162 " <INPUT type=\"text\" name=\"Address\"/>" | |
| 1163 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1164 "</FORM>"); | |
| 1165 | |
| 1166 WebFrame* web_frame = GetMainFrame(); | |
| 1167 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1168 | |
| 1169 FormManager form_manager; | |
| 1170 form_manager.ExtractForms(web_frame); | |
| 1171 | |
| 1172 std::vector<FormData> forms; | |
| 1173 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1174 ASSERT_EQ(1U, forms.size()); | |
| 1175 | |
| 1176 const FormData& form = forms[0]; | |
| 1177 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 1178 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 1179 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 1180 | |
| 1181 const std::vector<FormField>& fields = form.fields; | |
| 1182 ASSERT_EQ(3U, fields.size()); | |
| 1183 EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 1:"), | |
| 1184 ASCIIToUTF16("Address"), | |
| 1185 string16(), | |
| 1186 ASCIIToUTF16("text"), | |
| 1187 20), | |
| 1188 fields[0]); | |
| 1189 EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 2:"), | |
| 1190 ASCIIToUTF16("Address"), | |
| 1191 string16(), | |
| 1192 ASCIIToUTF16("text"), | |
| 1193 20), | |
| 1194 fields[1]); | |
| 1195 EXPECT_EQ(FormField(string16(), | |
| 1196 ASCIIToUTF16("reply-send"), | |
| 1197 ASCIIToUTF16("Send"), | |
| 1198 ASCIIToUTF16("submit"), | |
| 1199 0), | |
| 1200 fields[2]); | |
| 1201 } | |
| 1202 | |
| 1203 TEST_F(FormManagerTest, LabelsInferredWithImageTags) { | |
| 1204 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 1205 " Phone:" | |
| 1206 " <input type=\"text\" name=\"dayphone1\">" | |
| 1207 " <img/>" | |
| 1208 " -" | |
| 1209 " <img/>" | |
| 1210 " <input type=\"text\" name=\"dayphone2\">" | |
| 1211 " <img/>" | |
| 1212 " -" | |
| 1213 " <img/>" | |
| 1214 " <input type=\"text\" name=\"dayphone3\">" | |
| 1215 " ext.:" | |
| 1216 " <input type=\"text\" name=\"dayphone4\">" | |
| 1217 " <input type=\"text\" name=\"dummy\">" | |
| 1218 " <input type=\"submit\" name=\"reply-send\" value=\"Send\">" | |
| 1219 "</FORM>"); | |
| 1220 | |
| 1221 WebFrame* frame = GetMainFrame(); | |
| 1222 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); | |
| 1223 | |
| 1224 WebVector<WebFormElement> forms; | |
| 1225 frame->forms(forms); | |
| 1226 ASSERT_EQ(1U, forms.size()); | |
| 1227 | |
| 1228 FormData form; | |
| 1229 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], | |
| 1230 FormManager::REQUIRE_NONE, | |
| 1231 true, | |
| 1232 &form)); | |
| 1233 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 1234 EXPECT_EQ(GURL(frame->url()), form.origin); | |
| 1235 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 1236 | |
| 1237 const std::vector<FormField>& fields = form.fields; | |
| 1238 ASSERT_EQ(6U, fields.size()); | |
| 1239 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), | |
| 1240 ASCIIToUTF16("dayphone1"), | |
| 1241 string16(), | |
| 1242 ASCIIToUTF16("text"), | |
| 1243 20), | |
| 1244 fields[0]); | |
| 1245 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | |
| 1246 ASCIIToUTF16("dayphone2"), | |
| 1247 string16(), | |
| 1248 ASCIIToUTF16("text"), | |
| 1249 20), | |
| 1250 fields[1]); | |
| 1251 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | |
| 1252 ASCIIToUTF16("dayphone3"), | |
| 1253 string16(), | |
| 1254 ASCIIToUTF16("text"), | |
| 1255 20), | |
| 1256 fields[2]); | |
| 1257 EXPECT_EQ(FormField(ASCIIToUTF16("ext.:"), | |
| 1258 ASCIIToUTF16("dayphone4"), | |
| 1259 string16(), | |
| 1260 ASCIIToUTF16("text"), | |
| 1261 20), | |
| 1262 fields[3]); | |
| 1263 EXPECT_EQ(FormField(string16(), | |
| 1264 ASCIIToUTF16("dummy"), | |
| 1265 string16(), | |
| 1266 ASCIIToUTF16("text"), | |
| 1267 20), | |
| 1268 fields[4]); | |
| 1269 EXPECT_EQ(FormField(string16(), | |
| 1270 ASCIIToUTF16("reply-send"), | |
| 1271 ASCIIToUTF16("Send"), | |
| 1272 ASCIIToUTF16("submit"), | |
| 1273 0), | |
| 1274 fields[5]); | |
| 1275 } | |
| 1276 | |
| 1277 TEST_F(FormManagerTest, FillFormMaxLength) { | |
| 1278 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 1279 " <INPUT type=\"text\" id=\"firstname\" maxlength=\"5\"/>" | |
| 1280 " <INPUT type=\"text\" id=\"lastname\" maxlength=\"5\"/>" | |
| 1281 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1282 "</FORM>"); | |
| 1283 | |
| 1284 WebFrame* web_frame = GetMainFrame(); | |
| 1285 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1286 | |
| 1287 FormManager form_manager; | |
| 1288 form_manager.ExtractForms(web_frame); | |
| 1289 | |
| 1290 // Verify that we have the form. | |
| 1291 std::vector<FormData> forms; | |
| 1292 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1293 ASSERT_EQ(1U, forms.size()); | |
| 1294 | |
| 1295 // Get the input element we want to find. | |
| 1296 WebElement element = web_frame->document().getElementById("firstname"); | |
| 1297 WebInputElement input_element = element.to<WebInputElement>(); | |
| 1298 | |
| 1299 // Find the form that contains the input element. | |
| 1300 FormData form; | |
| 1301 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1302 input_element, FormManager::REQUIRE_NONE, &form)); | |
| 1303 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 1304 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 1305 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
| 1306 | |
| 1307 const std::vector<FormField>& fields = form.fields; | |
| 1308 ASSERT_EQ(3U, fields.size()); | |
| 1309 EXPECT_EQ(FormField(string16(), | |
| 1310 ASCIIToUTF16("firstname"), | |
| 1311 string16(), | |
| 1312 ASCIIToUTF16("text"), | |
| 1313 20), | |
| 1314 fields[0]); | |
| 1315 EXPECT_EQ(FormField(string16(), | |
| 1316 ASCIIToUTF16("lastname"), | |
| 1317 string16(), | |
| 1318 ASCIIToUTF16("text"), | |
| 1319 20), | |
| 1320 fields[1]); | |
| 1321 EXPECT_EQ(FormField(string16(), | |
| 1322 ASCIIToUTF16("reply-send"), | |
| 1323 ASCIIToUTF16("Send"), | |
| 1324 ASCIIToUTF16("submit"), | |
| 1325 0), | |
| 1326 fields[2]); | |
| 1327 | |
| 1328 // Fill the form. | |
| 1329 form.fields[0].set_value(ASCIIToUTF16("Brother")); | |
| 1330 form.fields[1].set_value(ASCIIToUTF16("Jonathan")); | |
| 1331 EXPECT_TRUE(form_manager.FillForm(form, WebNode())); | |
| 1332 | |
| 1333 // Find the newly-filled form that contains the input element. | |
| 1334 FormData form2; | |
| 1335 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1336 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 1337 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 1338 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 1339 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 1340 | |
| 1341 const std::vector<FormField>& fields2 = form2.fields; | |
| 1342 EXPECT_TRUE(fields2[0].StrictlyEqualsHack( | |
| 1343 FormField(string16(), | |
| 1344 ASCIIToUTF16("firstname"), | |
| 1345 ASCIIToUTF16("Broth"), | |
| 1346 ASCIIToUTF16("text"), | |
| 1347 20))); | |
| 1348 EXPECT_TRUE(fields2[1].StrictlyEqualsHack( | |
| 1349 FormField(string16(), | |
| 1350 ASCIIToUTF16("lastname"), | |
| 1351 ASCIIToUTF16("Jonat"), | |
| 1352 ASCIIToUTF16("text"), | |
| 1353 20))); | |
| 1354 EXPECT_TRUE(fields2[2].StrictlyEqualsHack( | |
| 1355 FormField(string16(), | |
| 1356 ASCIIToUTF16("reply-send"), | |
| 1357 string16(), | |
| 1358 ASCIIToUTF16("submit"), | |
| 1359 0))); | |
| 1360 } | |
| 1361 | |
| 1362 // This test uses negative values of the maxlength attribute for input elements. | |
| 1363 // In this case, the maxlength of the input elements is set to the default | |
| 1364 // maxlength (defined in WebKit.) | |
| 1365 TEST_F(FormManagerTest, FillFormNegativeMaxLength) { | |
| 1366 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 1367 " <INPUT type=\"text\" id=\"firstname\" maxlength=\"-1\"/>" | |
| 1368 " <INPUT type=\"text\" id=\"lastname\" maxlength=\"-10\"/>" | |
| 1369 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1370 "</FORM>"); | |
| 1371 | |
| 1372 WebFrame* web_frame = GetMainFrame(); | |
| 1373 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1374 | |
| 1375 FormManager form_manager; | |
| 1376 form_manager.ExtractForms(web_frame); | |
| 1377 | |
| 1378 // Verify that we have the form. | |
| 1379 std::vector<FormData> forms; | |
| 1380 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1381 ASSERT_EQ(1U, forms.size()); | |
| 1382 | |
| 1383 // Get the input element we want to find. | |
| 1384 WebElement element = web_frame->document().getElementById("firstname"); | |
| 1385 WebInputElement input_element = element.to<WebInputElement>(); | |
| 1386 | |
| 1387 // Find the form that contains the input element. | |
| 1388 FormData form; | |
| 1389 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1390 input_element, FormManager::REQUIRE_NONE, &form)); | |
| 1391 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 1392 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 1393 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
| 1394 | |
| 1395 const std::vector<FormField>& fields = form.fields; | |
| 1396 ASSERT_EQ(3U, fields.size()); | |
| 1397 EXPECT_EQ(FormField(string16(), | |
| 1398 ASCIIToUTF16("firstname"), | |
| 1399 string16(), | |
| 1400 ASCIIToUTF16("text"), | |
| 1401 20), | |
| 1402 fields[0]); | |
| 1403 EXPECT_EQ(FormField(string16(), | |
| 1404 ASCIIToUTF16("lastname"), | |
| 1405 string16(), | |
| 1406 ASCIIToUTF16("text"), | |
| 1407 20), | |
| 1408 fields[1]); | |
| 1409 EXPECT_EQ(FormField(string16(), | |
| 1410 ASCIIToUTF16("reply-send"), | |
| 1411 ASCIIToUTF16("Send"), | |
| 1412 ASCIIToUTF16("submit"), | |
| 1413 0), | |
| 1414 fields[2]); | |
| 1415 | |
| 1416 // Fill the form. | |
| 1417 form.fields[0].set_value(ASCIIToUTF16("Brother")); | |
| 1418 form.fields[1].set_value(ASCIIToUTF16("Jonathan")); | |
| 1419 EXPECT_TRUE(form_manager.FillForm(form, WebNode())); | |
| 1420 | |
| 1421 // Find the newly-filled form that contains the input element. | |
| 1422 FormData form2; | |
| 1423 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1424 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 1425 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 1426 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 1427 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 1428 | |
| 1429 const std::vector<FormField>& fields2 = form2.fields; | |
| 1430 ASSERT_EQ(3U, fields2.size()); | |
| 1431 EXPECT_TRUE(fields2[0].StrictlyEqualsHack( | |
| 1432 FormField(string16(), | |
| 1433 ASCIIToUTF16("firstname"), | |
| 1434 ASCIIToUTF16("Brother"), | |
| 1435 ASCIIToUTF16("text"), | |
| 1436 20))); | |
| 1437 EXPECT_TRUE(fields2[1].StrictlyEqualsHack( | |
| 1438 FormField(string16(), | |
| 1439 ASCIIToUTF16("lastname"), | |
| 1440 ASCIIToUTF16("Jonathan"), | |
| 1441 ASCIIToUTF16("text"), | |
| 1442 20))); | |
| 1443 EXPECT_TRUE(fields2[2].StrictlyEqualsHack( | |
| 1444 FormField(string16(), | |
| 1445 ASCIIToUTF16("reply-send"), | |
| 1446 string16(), | |
| 1447 ASCIIToUTF16("submit"), | |
| 1448 0))); | |
| 1449 } | |
| 1450 | |
| 1451 // This test sends a FormData object to FillForm with more fields than are in | |
| 1452 // the cached WebFormElement. In this case, we only fill out the fields that | |
| 1453 // match between the FormData object and the WebFormElement. | |
| 1454 TEST_F(FormManagerTest, FillFormMoreFormDataFields) { | |
| 1455 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 1456 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 1457 " <INPUT type=\"text\" id=\"middlename\"/>" | |
| 1458 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 1459 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1460 "</FORM>"); | |
| 1461 | |
| 1462 WebFrame* web_frame = GetMainFrame(); | |
| 1463 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1464 | |
| 1465 FormManager form_manager; | |
| 1466 form_manager.ExtractForms(web_frame); | |
| 1467 | |
| 1468 // Verify that we have the form. | |
| 1469 std::vector<FormData> forms; | |
| 1470 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1471 ASSERT_EQ(1U, forms.size()); | |
| 1472 | |
| 1473 // After the field modification, the fields in |form| will look like: | |
| 1474 // prefix | |
| 1475 // firstname | |
| 1476 // hidden | |
| 1477 // middlename | |
| 1478 // second | |
| 1479 // lastname | |
| 1480 // postfix | |
| 1481 FormData* form = &forms[0]; | |
| 1482 | |
| 1483 FormField field1(string16(), | |
| 1484 ASCIIToUTF16("prefix"), | |
| 1485 string16(), | |
| 1486 ASCIIToUTF16("text"), | |
| 1487 20); | |
| 1488 form->fields.insert(form->fields.begin(), field1); | |
| 1489 | |
| 1490 FormField field2(string16(), | |
| 1491 ASCIIToUTF16("hidden"), | |
| 1492 string16(), | |
| 1493 ASCIIToUTF16("text"), | |
| 1494 20); | |
| 1495 form->fields.insert(form->fields.begin() + 2, field2); | |
| 1496 | |
| 1497 FormField field3(string16(), | |
| 1498 ASCIIToUTF16("second"), | |
| 1499 string16(), | |
| 1500 ASCIIToUTF16("text"), | |
| 1501 20); | |
| 1502 form->fields.insert(form->fields.begin() + 4, field3); | |
| 1503 | |
| 1504 FormField field4(string16(), | |
| 1505 ASCIIToUTF16("postfix"), | |
| 1506 string16(), | |
| 1507 ASCIIToUTF16("text"), | |
| 1508 20); | |
| 1509 form->fields.insert(form->fields.begin() + 6, field4); | |
| 1510 | |
| 1511 // Fill the form. | |
| 1512 form->fields[0].set_value(ASCIIToUTF16("Alpha")); | |
| 1513 form->fields[1].set_value(ASCIIToUTF16("Brother")); | |
| 1514 form->fields[2].set_value(ASCIIToUTF16("Abracadabra")); | |
| 1515 form->fields[3].set_value(ASCIIToUTF16("Joseph")); | |
| 1516 form->fields[4].set_value(ASCIIToUTF16("Beta")); | |
| 1517 form->fields[5].set_value(ASCIIToUTF16("Jonathan")); | |
| 1518 form->fields[6].set_value(ASCIIToUTF16("Omega")); | |
| 1519 EXPECT_TRUE(form_manager.FillForm(*form, WebNode())); | |
| 1520 | |
| 1521 // Get the input element we want to find. | |
| 1522 WebElement element = web_frame->document().getElementById("firstname"); | |
| 1523 WebInputElement input_element = element.to<WebInputElement>(); | |
| 1524 | |
| 1525 // Find the newly-filled form that contains the input element. | |
| 1526 FormData form2; | |
| 1527 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1528 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 1529 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 1530 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 1531 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 1532 | |
| 1533 const std::vector<FormField>& fields = form2.fields; | |
| 1534 ASSERT_EQ(4U, fields.size()); | |
| 1535 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), | |
| 1536 ASCIIToUTF16("firstname"), | |
| 1537 ASCIIToUTF16("Brother"), | |
| 1538 ASCIIToUTF16("text"), | |
| 1539 20))); | |
| 1540 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), | |
| 1541 ASCIIToUTF16("middlename"), | |
| 1542 ASCIIToUTF16("Joseph"), | |
| 1543 ASCIIToUTF16("text"), | |
| 1544 20))); | |
| 1545 EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(), | |
| 1546 ASCIIToUTF16("lastname"), | |
| 1547 ASCIIToUTF16("Jonathan"), | |
| 1548 ASCIIToUTF16("text"), | |
| 1549 20))); | |
| 1550 EXPECT_TRUE(fields[3].StrictlyEqualsHack(FormField(string16(), | |
| 1551 ASCIIToUTF16("reply-send"), | |
| 1552 string16(), | |
| 1553 ASCIIToUTF16("submit"), | |
| 1554 0))); | |
| 1555 } | |
| 1556 | |
| 1557 // This test sends a FormData object to FillForm with fewer fields than are in | |
| 1558 // the cached WebFormElement. In this case, we only fill out the fields that | |
| 1559 // match between the FormData object and the WebFormElement. | |
| 1560 TEST_F(FormManagerTest, FillFormFewerFormDataFields) { | |
| 1561 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 1562 " <INPUT type=\"text\" id=\"prefix\"/>" | |
| 1563 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 1564 " <INPUT type=\"text\" id=\"hidden\"/>" | |
| 1565 " <INPUT type=\"text\" id=\"middlename\"/>" | |
| 1566 " <INPUT type=\"text\" id=\"second\"/>" | |
| 1567 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 1568 " <INPUT type=\"text\" id=\"postfix\"/>" | |
| 1569 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1570 "</FORM>"); | |
| 1571 | |
| 1572 WebFrame* web_frame = GetMainFrame(); | |
| 1573 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1574 | |
| 1575 FormManager form_manager; | |
| 1576 form_manager.ExtractForms(web_frame); | |
| 1577 | |
| 1578 // Verify that we have the form. | |
| 1579 std::vector<FormData> forms; | |
| 1580 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1581 ASSERT_EQ(1U, forms.size()); | |
| 1582 | |
| 1583 // After the field modification, the fields in |form| will look like: | |
| 1584 // firstname | |
| 1585 // middlename | |
| 1586 // lastname | |
| 1587 FormData* form = &forms[0]; | |
| 1588 form->fields.erase(form->fields.begin()); | |
| 1589 form->fields.erase(form->fields.begin() + 1); | |
| 1590 form->fields.erase(form->fields.begin() + 2); | |
| 1591 form->fields.erase(form->fields.begin() + 3); | |
| 1592 | |
| 1593 // Fill the form. | |
| 1594 form->fields[0].set_value(ASCIIToUTF16("Brother")); | |
| 1595 form->fields[1].set_value(ASCIIToUTF16("Joseph")); | |
| 1596 form->fields[2].set_value(ASCIIToUTF16("Jonathan")); | |
| 1597 EXPECT_TRUE(form_manager.FillForm(*form, WebNode())); | |
| 1598 | |
| 1599 // Get the input element we want to find. | |
| 1600 WebElement element = web_frame->document().getElementById("firstname"); | |
| 1601 WebInputElement input_element = element.to<WebInputElement>(); | |
| 1602 | |
| 1603 // Find the newly-filled form that contains the input element. | |
| 1604 FormData form2; | |
| 1605 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1606 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 1607 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 1608 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 1609 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 1610 | |
| 1611 const std::vector<FormField>& fields = form2.fields; | |
| 1612 ASSERT_EQ(8U, fields.size()); | |
| 1613 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), | |
| 1614 ASCIIToUTF16("prefix"), | |
| 1615 string16(), | |
| 1616 ASCIIToUTF16("text"), | |
| 1617 20))); | |
| 1618 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), | |
| 1619 ASCIIToUTF16("firstname"), | |
| 1620 ASCIIToUTF16("Brother"), | |
| 1621 ASCIIToUTF16("text"), | |
| 1622 20))); | |
| 1623 EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(), | |
| 1624 ASCIIToUTF16("hidden"), | |
| 1625 string16(), | |
| 1626 ASCIIToUTF16("text"), | |
| 1627 20))); | |
| 1628 EXPECT_TRUE(fields[3].StrictlyEqualsHack(FormField(string16(), | |
| 1629 ASCIIToUTF16("middlename"), | |
| 1630 ASCIIToUTF16("Joseph"), | |
| 1631 ASCIIToUTF16("text"), | |
| 1632 20))); | |
| 1633 EXPECT_TRUE(fields[4].StrictlyEqualsHack(FormField(string16(), | |
| 1634 ASCIIToUTF16("second"), | |
| 1635 string16(), | |
| 1636 ASCIIToUTF16("text"), | |
| 1637 20))); | |
| 1638 EXPECT_TRUE(fields[5].StrictlyEqualsHack(FormField(string16(), | |
| 1639 ASCIIToUTF16("lastname"), | |
| 1640 ASCIIToUTF16("Jonathan"), | |
| 1641 ASCIIToUTF16("text"), | |
| 1642 20))); | |
| 1643 EXPECT_TRUE(fields[6].StrictlyEqualsHack(FormField(string16(), | |
| 1644 ASCIIToUTF16("postfix"), | |
| 1645 string16(), | |
| 1646 ASCIIToUTF16("text"), | |
| 1647 20))); | |
| 1648 EXPECT_TRUE(fields[7].StrictlyEqualsHack(FormField(string16(), | |
| 1649 ASCIIToUTF16("reply-send"), | |
| 1650 string16(), | |
| 1651 ASCIIToUTF16("submit"), | |
| 1652 0))); | |
| 1653 } | |
| 1654 | |
| 1655 // This test sends a FormData object to FillForm with a field changed from | |
| 1656 // those in the cached WebFormElement. In this case, we only fill out the | |
| 1657 // fields that match between the FormData object and the WebFormElement. | |
| 1658 TEST_F(FormManagerTest, FillFormChangedFormDataFields) { | |
| 1659 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 1660 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 1661 " <INPUT type=\"text\" id=\"middlename\"/>" | |
| 1662 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 1663 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1664 "</FORM>"); | |
| 1665 | |
| 1666 WebFrame* web_frame = GetMainFrame(); | |
| 1667 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1668 | |
| 1669 FormManager form_manager; | |
| 1670 form_manager.ExtractForms(web_frame); | |
| 1671 | |
| 1672 // Verify that we have the form. | |
| 1673 std::vector<FormData> forms; | |
| 1674 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1675 ASSERT_EQ(1U, forms.size()); | |
| 1676 | |
| 1677 // After the field modification, the fields in |form| will look like: | |
| 1678 // firstname | |
| 1679 // middlename | |
| 1680 // lastname | |
| 1681 FormData* form = &forms[0]; | |
| 1682 | |
| 1683 // Fill the form. | |
| 1684 form->fields[0].set_value(ASCIIToUTF16("Brother")); | |
| 1685 form->fields[1].set_value(ASCIIToUTF16("Joseph")); | |
| 1686 form->fields[2].set_value(ASCIIToUTF16("Jonathan")); | |
| 1687 | |
| 1688 // Alter the label and name used for matching. | |
| 1689 form->fields[1].set_label(ASCIIToUTF16("bogus")); | |
| 1690 form->fields[1].set_name(ASCIIToUTF16("bogus")); | |
| 1691 | |
| 1692 EXPECT_TRUE(form_manager.FillForm(*form, WebNode())); | |
| 1693 | |
| 1694 // Get the input element we want to find. | |
| 1695 WebElement element = web_frame->document().getElementById("firstname"); | |
| 1696 WebInputElement input_element = element.to<WebInputElement>(); | |
| 1697 | |
| 1698 // Find the newly-filled form that contains the input element. | |
| 1699 FormData form2; | |
| 1700 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1701 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 1702 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 1703 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 1704 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 1705 | |
| 1706 const std::vector<FormField>& fields = form2.fields; | |
| 1707 ASSERT_EQ(4U, fields.size()); | |
| 1708 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), | |
| 1709 ASCIIToUTF16("firstname"), | |
| 1710 ASCIIToUTF16("Brother"), | |
| 1711 ASCIIToUTF16("text"), | |
| 1712 20))); | |
| 1713 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), | |
| 1714 ASCIIToUTF16("middlename"), | |
| 1715 string16(), | |
| 1716 ASCIIToUTF16("text"), | |
| 1717 20))); | |
| 1718 EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(), | |
| 1719 ASCIIToUTF16("lastname"), | |
| 1720 ASCIIToUTF16("Jonathan"), | |
| 1721 ASCIIToUTF16("text"), | |
| 1722 20))); | |
| 1723 EXPECT_TRUE(fields[3].StrictlyEqualsHack(FormField(string16(), | |
| 1724 ASCIIToUTF16("reply-send"), | |
| 1725 string16(), | |
| 1726 ASCIIToUTF16("submit"), | |
| 1727 0))); | |
| 1728 } | |
| 1729 | |
| 1730 // This test sends a FormData object to FillForm with fewer fields than are in | |
| 1731 // the cached WebFormElement. In this case, we only fill out the fields that | |
| 1732 // match between the FormData object and the WebFormElement. | |
| 1733 TEST_F(FormManagerTest, FillFormExtraFieldInCache) { | |
| 1734 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 1735 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 1736 " <INPUT type=\"text\" id=\"middlename\"/>" | |
| 1737 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 1738 " <INPUT type=\"text\" id=\"postfix\"/>" | |
| 1739 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 1740 "</FORM>"); | |
| 1741 | |
| 1742 WebFrame* web_frame = GetMainFrame(); | |
| 1743 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1744 | |
| 1745 FormManager form_manager; | |
| 1746 form_manager.ExtractForms(web_frame); | |
| 1747 | |
| 1748 // Verify that we have the form. | |
| 1749 std::vector<FormData> forms; | |
| 1750 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1751 ASSERT_EQ(1U, forms.size()); | |
| 1752 | |
| 1753 // After the field modification, the fields in |form| will look like: | |
| 1754 // firstname | |
| 1755 // middlename | |
| 1756 // lastname | |
| 1757 FormData* form = &forms[0]; | |
| 1758 form->fields.pop_back(); | |
| 1759 | |
| 1760 // Fill the form. | |
| 1761 form->fields[0].set_value(ASCIIToUTF16("Brother")); | |
| 1762 form->fields[1].set_value(ASCIIToUTF16("Joseph")); | |
| 1763 form->fields[2].set_value(ASCIIToUTF16("Jonathan")); | |
| 1764 EXPECT_TRUE(form_manager.FillForm(*form, WebNode())); | |
| 1765 | |
| 1766 // Get the input element we want to find. | |
| 1767 WebElement element = web_frame->document().getElementById("firstname"); | |
| 1768 WebInputElement input_element = element.to<WebInputElement>(); | |
| 1769 | |
| 1770 // Find the newly-filled form that contains the input element. | |
| 1771 FormData form2; | |
| 1772 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1773 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 1774 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 1775 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 1776 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 1777 | |
| 1778 const std::vector<FormField>& fields = form2.fields; | |
| 1779 ASSERT_EQ(5U, fields.size()); | |
| 1780 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), | |
| 1781 ASCIIToUTF16("firstname"), | |
| 1782 ASCIIToUTF16("Brother"), | |
| 1783 ASCIIToUTF16("text"), | |
| 1784 20))); | |
| 1785 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), | |
| 1786 ASCIIToUTF16("middlename"), | |
| 1787 ASCIIToUTF16("Joseph"), | |
| 1788 ASCIIToUTF16("text"), | |
| 1789 20))); | |
| 1790 EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(), | |
| 1791 ASCIIToUTF16("lastname"), | |
| 1792 ASCIIToUTF16("Jonathan"), | |
| 1793 ASCIIToUTF16("text"), | |
| 1794 20))); | |
| 1795 EXPECT_TRUE(fields[3].StrictlyEqualsHack(FormField(string16(), | |
| 1796 ASCIIToUTF16("postfix"), | |
| 1797 string16(), | |
| 1798 ASCIIToUTF16("text"), | |
| 1799 20))); | |
| 1800 EXPECT_TRUE(fields[4].StrictlyEqualsHack(FormField(string16(), | |
| 1801 ASCIIToUTF16("reply-send"), | |
| 1802 string16(), | |
| 1803 ASCIIToUTF16("submit"), | |
| 1804 0))); | |
| 1805 } | |
| 1806 | |
| 1807 TEST_F(FormManagerTest, FillFormEmptyName) { | |
| 1808 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 1809 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 1810 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 1811 " <INPUT type=\"submit\" value=\"Send\"/>" | |
| 1812 "</FORM>"); | |
| 1813 | |
| 1814 WebFrame* web_frame = GetMainFrame(); | |
| 1815 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1816 | |
| 1817 FormManager form_manager; | |
| 1818 form_manager.ExtractForms(web_frame); | |
| 1819 | |
| 1820 // Verify that we have the form. | |
| 1821 std::vector<FormData> forms; | |
| 1822 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1823 ASSERT_EQ(1U, forms.size()); | |
| 1824 | |
| 1825 // Get the input element we want to find. | |
| 1826 WebElement element = web_frame->document().getElementById("firstname"); | |
| 1827 WebInputElement input_element = element.to<WebInputElement>(); | |
| 1828 | |
| 1829 // Find the form that contains the input element. | |
| 1830 FormData form; | |
| 1831 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1832 input_element, FormManager::REQUIRE_NONE, &form)); | |
| 1833 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 1834 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 1835 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
| 1836 | |
| 1837 const std::vector<FormField>& fields = form.fields; | |
| 1838 ASSERT_EQ(3U, fields.size()); | |
| 1839 EXPECT_EQ(FormField(string16(), | |
| 1840 ASCIIToUTF16("firstname"), | |
| 1841 string16(), | |
| 1842 ASCIIToUTF16("text"), | |
| 1843 20), | |
| 1844 fields[0]); | |
| 1845 EXPECT_EQ(FormField(string16(), | |
| 1846 ASCIIToUTF16("lastname"), | |
| 1847 string16(), | |
| 1848 ASCIIToUTF16("text"), | |
| 1849 20), | |
| 1850 fields[1]); | |
| 1851 EXPECT_EQ(FormField(string16(), | |
| 1852 string16(), | |
| 1853 ASCIIToUTF16("Send"), | |
| 1854 ASCIIToUTF16("submit"), | |
| 1855 0), | |
| 1856 fields[2]); | |
| 1857 | |
| 1858 // Fill the form. | |
| 1859 form.fields[0].set_value(ASCIIToUTF16("Wyatt")); | |
| 1860 form.fields[1].set_value(ASCIIToUTF16("Earp")); | |
| 1861 EXPECT_TRUE(form_manager.FillForm(form, WebNode())); | |
| 1862 | |
| 1863 // Find the newly-filled form that contains the input element. | |
| 1864 FormData form2; | |
| 1865 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1866 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 1867 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 1868 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 1869 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 1870 | |
| 1871 const std::vector<FormField>& fields2 = form2.fields; | |
| 1872 ASSERT_EQ(3U, fields2.size()); | |
| 1873 EXPECT_EQ(FormField(string16(), | |
| 1874 ASCIIToUTF16("firstname"), | |
| 1875 ASCIIToUTF16("Wyatt"), | |
| 1876 ASCIIToUTF16("text"), | |
| 1877 20), | |
| 1878 fields2[0]); | |
| 1879 EXPECT_EQ(FormField(string16(), | |
| 1880 ASCIIToUTF16("lastname"), | |
| 1881 ASCIIToUTF16("Earp"), | |
| 1882 ASCIIToUTF16("text"), | |
| 1883 20), | |
| 1884 fields2[1]); | |
| 1885 EXPECT_EQ(FormField(string16(), | |
| 1886 string16(), | |
| 1887 ASCIIToUTF16("Send"), | |
| 1888 ASCIIToUTF16("submit"), | |
| 1889 0), | |
| 1890 fields2[2]); | |
| 1891 } | |
| 1892 | |
| 1893 TEST_F(FormManagerTest, FillFormEmptyFormNames) { | |
| 1894 LoadHTML("<FORM action=\"http://buh.com\" method=\"post\">" | |
| 1895 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 1896 " <INPUT type=\"text\" id=\"middlename\"/>" | |
| 1897 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 1898 " <INPUT type=\"submit\" value=\"Send\"/>" | |
| 1899 "</FORM>" | |
| 1900 "<FORM action=\"http://abc.com\" method=\"post\">" | |
| 1901 " <INPUT type=\"text\" id=\"apple\"/>" | |
| 1902 " <INPUT type=\"text\" id=\"banana\"/>" | |
| 1903 " <INPUT type=\"submit\" value=\"Send\"/>" | |
| 1904 "</FORM>"); | |
| 1905 | |
| 1906 WebFrame* web_frame = GetMainFrame(); | |
| 1907 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 1908 | |
| 1909 FormManager form_manager; | |
| 1910 form_manager.ExtractForms(web_frame); | |
| 1911 | |
| 1912 // Verify that we have the form. | |
| 1913 std::vector<FormData> forms; | |
| 1914 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 1915 ASSERT_EQ(2U, forms.size()); | |
| 1916 | |
| 1917 // Get the input element we want to find. | |
| 1918 WebElement element = web_frame->document().getElementById("apple"); | |
| 1919 WebInputElement input_element = element.to<WebInputElement>(); | |
| 1920 | |
| 1921 // Find the form that contains the input element. | |
| 1922 FormData form; | |
| 1923 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1924 input_element, FormManager::REQUIRE_NONE, &form)); | |
| 1925 EXPECT_EQ(string16(), form.name); | |
| 1926 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 1927 EXPECT_EQ(GURL("http://abc.com"), form.action); | |
| 1928 | |
| 1929 const std::vector<FormField>& fields = form.fields; | |
| 1930 ASSERT_EQ(3U, fields.size()); | |
| 1931 EXPECT_EQ(FormField(string16(), | |
| 1932 ASCIIToUTF16("apple"), | |
| 1933 string16(), | |
| 1934 ASCIIToUTF16("text"), | |
| 1935 20), | |
| 1936 fields[0]); | |
| 1937 EXPECT_EQ(FormField(string16(), | |
| 1938 ASCIIToUTF16("banana"), | |
| 1939 string16(), | |
| 1940 ASCIIToUTF16("text"), | |
| 1941 20), | |
| 1942 fields[1]); | |
| 1943 EXPECT_EQ(FormField(string16(), | |
| 1944 string16(), | |
| 1945 ASCIIToUTF16("Send"), | |
| 1946 ASCIIToUTF16("submit"), | |
| 1947 0), | |
| 1948 fields[2]); | |
| 1949 | |
| 1950 // Fill the form. | |
| 1951 form.fields[0].set_value(ASCIIToUTF16("Red")); | |
| 1952 form.fields[1].set_value(ASCIIToUTF16("Yellow")); | |
| 1953 EXPECT_TRUE(form_manager.FillForm(form, WebNode())); | |
| 1954 | |
| 1955 // Find the newly-filled form that contains the input element. | |
| 1956 FormData form2; | |
| 1957 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 1958 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 1959 EXPECT_EQ(string16(), form2.name); | |
| 1960 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 1961 EXPECT_EQ(GURL("http://abc.com"), form2.action); | |
| 1962 | |
| 1963 const std::vector<FormField>& fields2 = form2.fields; | |
| 1964 ASSERT_EQ(3U, fields2.size()); | |
| 1965 EXPECT_EQ(FormField(string16(), | |
| 1966 ASCIIToUTF16("apple"), | |
| 1967 ASCIIToUTF16("Red"), | |
| 1968 ASCIIToUTF16("text"), | |
| 1969 20), | |
| 1970 fields2[0]); | |
| 1971 EXPECT_EQ(FormField(string16(), | |
| 1972 ASCIIToUTF16("banana"), | |
| 1973 ASCIIToUTF16("Yellow"), | |
| 1974 ASCIIToUTF16("text"), | |
| 1975 20), | |
| 1976 fields2[1]); | |
| 1977 EXPECT_EQ(FormField(string16(), | |
| 1978 string16(), | |
| 1979 ASCIIToUTF16("Send"), | |
| 1980 ASCIIToUTF16("submit"), | |
| 1981 0), | |
| 1982 fields2[2]); | |
| 1983 } | |
| 1984 | |
| 1985 TEST_F(FormManagerTest, ThreePartPhone) { | |
| 1986 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 1987 " Phone:" | |
| 1988 " <input type=\"text\" name=\"dayphone1\">" | |
| 1989 " -" | |
| 1990 " <input type=\"text\" name=\"dayphone2\">" | |
| 1991 " -" | |
| 1992 " <input type=\"text\" name=\"dayphone3\">" | |
| 1993 " ext.:" | |
| 1994 " <input type=\"text\" name=\"dayphone4\">" | |
| 1995 " <input type=\"submit\" name=\"reply-send\" value=\"Send\">" | |
| 1996 "</FORM>"); | |
| 1997 | |
| 1998 | |
| 1999 WebFrame* frame = GetMainFrame(); | |
| 2000 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); | |
| 2001 | |
| 2002 WebVector<WebFormElement> forms; | |
| 2003 frame->forms(forms); | |
| 2004 ASSERT_EQ(1U, forms.size()); | |
| 2005 | |
| 2006 FormData form; | |
| 2007 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], | |
| 2008 FormManager::REQUIRE_NONE, | |
| 2009 true, | |
| 2010 &form)); | |
| 2011 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 2012 EXPECT_EQ(GURL(frame->url()), form.origin); | |
| 2013 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 2014 | |
| 2015 const std::vector<FormField>& fields = form.fields; | |
| 2016 ASSERT_EQ(5U, fields.size()); | |
| 2017 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), | |
| 2018 ASCIIToUTF16("dayphone1"), | |
| 2019 string16(), | |
| 2020 ASCIIToUTF16("text"), | |
| 2021 20), | |
| 2022 fields[0]); | |
| 2023 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | |
| 2024 ASCIIToUTF16("dayphone2"), | |
| 2025 string16(), | |
| 2026 ASCIIToUTF16("text"), | |
| 2027 20), | |
| 2028 fields[1]); | |
| 2029 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | |
| 2030 ASCIIToUTF16("dayphone3"), | |
| 2031 string16(), | |
| 2032 ASCIIToUTF16("text"), | |
| 2033 20), | |
| 2034 fields[2]); | |
| 2035 EXPECT_EQ(FormField(ASCIIToUTF16("ext.:"), | |
| 2036 ASCIIToUTF16("dayphone4"), | |
| 2037 string16(), | |
| 2038 ASCIIToUTF16("text"), | |
| 2039 20), | |
| 2040 fields[3]); | |
| 2041 EXPECT_EQ(FormField(string16(), | |
| 2042 ASCIIToUTF16("reply-send"), | |
| 2043 ASCIIToUTF16("Send"), | |
| 2044 ASCIIToUTF16("submit"), | |
| 2045 0), | |
| 2046 fields[4]); | |
| 2047 } | |
| 2048 | |
| 2049 | |
| 2050 TEST_F(FormManagerTest, SizeFields) { | |
| 2051 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 2052 " Phone:" | |
| 2053 " <input type=\"text\" size=\"3\" name=\"dayphone1\">" | |
| 2054 " -" | |
| 2055 " <input type=\"text\" size=\"3\" name=\"dayphone2\">" | |
| 2056 " -" | |
| 2057 " <input type=\"text\" size=\"4\" name=\"dayphone3\">" | |
| 2058 " ext.:" | |
| 2059 " <input type=\"text\" size=\"5\" name=\"dayphone4\">" | |
| 2060 " <input type=\"text\" name=\"default1\">" | |
| 2061 " <input type=\"text\" size=\"-1\" name=\"invalid1\">" | |
| 2062 " <input type=\"submit\" name=\"reply-send\" value=\"Send\">" | |
| 2063 "</FORM>"); | |
| 2064 | |
| 2065 | |
| 2066 WebFrame* frame = GetMainFrame(); | |
| 2067 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); | |
| 2068 | |
| 2069 WebVector<WebFormElement> forms; | |
| 2070 frame->forms(forms); | |
| 2071 ASSERT_EQ(1U, forms.size()); | |
| 2072 | |
| 2073 FormData form; | |
| 2074 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], | |
| 2075 FormManager::REQUIRE_NONE, | |
| 2076 true, | |
| 2077 &form)); | |
| 2078 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 2079 EXPECT_EQ(GURL(frame->url()), form.origin); | |
| 2080 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 2081 | |
| 2082 const std::vector<FormField>& fields = form.fields; | |
| 2083 ASSERT_EQ(7U, fields.size()); | |
| 2084 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), | |
| 2085 ASCIIToUTF16("dayphone1"), | |
| 2086 string16(), | |
| 2087 ASCIIToUTF16("text"), | |
| 2088 3), | |
| 2089 fields[0]); | |
| 2090 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | |
| 2091 ASCIIToUTF16("dayphone2"), | |
| 2092 string16(), | |
| 2093 ASCIIToUTF16("text"), | |
| 2094 3), | |
| 2095 fields[1]); | |
| 2096 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | |
| 2097 ASCIIToUTF16("dayphone3"), | |
| 2098 string16(), | |
| 2099 ASCIIToUTF16("text"), | |
| 2100 4), | |
| 2101 fields[2]); | |
| 2102 EXPECT_EQ(FormField(ASCIIToUTF16("ext.:"), | |
| 2103 ASCIIToUTF16("dayphone4"), | |
| 2104 string16(), | |
| 2105 ASCIIToUTF16("text"), | |
| 2106 5), | |
| 2107 fields[3]); | |
| 2108 // When unspecified |size|, default is 20. | |
| 2109 EXPECT_EQ(FormField(string16(), | |
| 2110 ASCIIToUTF16("default1"), | |
| 2111 string16(), | |
| 2112 ASCIIToUTF16("text"), | |
| 2113 20), | |
| 2114 fields[4]); | |
| 2115 // When invalid |size| same value is returned. | |
| 2116 EXPECT_EQ(FormField(string16(), | |
| 2117 ASCIIToUTF16("invalid1"), | |
| 2118 string16(), | |
| 2119 ASCIIToUTF16("text"), | |
| 2120 -1), | |
| 2121 fields[5]); | |
| 2122 EXPECT_EQ(FormField(string16(), | |
| 2123 ASCIIToUTF16("reply-send"), | |
| 2124 ASCIIToUTF16("Send"), | |
| 2125 ASCIIToUTF16("submit"), | |
| 2126 0), | |
| 2127 fields[6]); | |
| 2128 } | |
| 2129 | |
| 2130 // This test re-creates the experience of typing in a field then selecting a | |
| 2131 // profile from the AutoFill suggestions popup. The field that is being typed | |
| 2132 // into should be filled even though it's not technically empty. | |
| 2133 TEST_F(FormManagerTest, FillFormNonEmptyField) { | |
| 2134 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 2135 " <INPUT type=\"text\" id=\"firstname\"/>" | |
| 2136 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 2137 " <INPUT type=\"submit\" value=\"Send\"/>" | |
| 2138 "</FORM>"); | |
| 2139 | |
| 2140 WebFrame* web_frame = GetMainFrame(); | |
| 2141 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 2142 | |
| 2143 FormManager form_manager; | |
| 2144 form_manager.ExtractForms(web_frame); | |
| 2145 | |
| 2146 // Verify that we have the form. | |
| 2147 std::vector<FormData> forms; | |
| 2148 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 2149 ASSERT_EQ(1U, forms.size()); | |
| 2150 | |
| 2151 // Get the input element we want to find. | |
| 2152 WebElement element = web_frame->document().getElementById("firstname"); | |
| 2153 WebInputElement input_element = element.to<WebInputElement>(); | |
| 2154 | |
| 2155 // Simulate typing by modifying the field value. | |
| 2156 input_element.setValue(ASCIIToUTF16("Wy")); | |
| 2157 | |
| 2158 // Find the form that contains the input element. | |
| 2159 FormData form; | |
| 2160 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 2161 input_element, FormManager::REQUIRE_NONE, &form)); | |
| 2162 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 2163 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 2164 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
| 2165 | |
| 2166 const std::vector<FormField>& fields = form.fields; | |
| 2167 ASSERT_EQ(3U, fields.size()); | |
| 2168 EXPECT_EQ(FormField(string16(), | |
| 2169 ASCIIToUTF16("firstname"), | |
| 2170 string16(), | |
| 2171 ASCIIToUTF16("text"), | |
| 2172 20), | |
| 2173 fields[0]); | |
| 2174 EXPECT_EQ(FormField(string16(), | |
| 2175 ASCIIToUTF16("lastname"), | |
| 2176 string16(), | |
| 2177 ASCIIToUTF16("text"), | |
| 2178 20), | |
| 2179 fields[1]); | |
| 2180 EXPECT_EQ(FormField(string16(), | |
| 2181 string16(), | |
| 2182 ASCIIToUTF16("Send"), | |
| 2183 ASCIIToUTF16("submit"), | |
| 2184 0), | |
| 2185 fields[2]); | |
| 2186 | |
| 2187 // Fill the form. | |
| 2188 form.fields[0].set_value(ASCIIToUTF16("Wyatt")); | |
| 2189 form.fields[1].set_value(ASCIIToUTF16("Earp")); | |
| 2190 EXPECT_TRUE(form_manager.FillForm(form, input_element)); | |
| 2191 | |
| 2192 // Find the newly-filled form that contains the input element. | |
| 2193 FormData form2; | |
| 2194 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 2195 input_element, FormManager::REQUIRE_NONE, &form2)); | |
| 2196 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 2197 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 2198 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 2199 | |
| 2200 const std::vector<FormField>& fields2 = form2.fields; | |
| 2201 ASSERT_EQ(3U, fields2.size()); | |
| 2202 EXPECT_EQ(FormField(string16(), | |
| 2203 ASCIIToUTF16("firstname"), | |
| 2204 ASCIIToUTF16("Wyatt"), | |
| 2205 ASCIIToUTF16("text"), | |
| 2206 20), | |
| 2207 fields2[0]); | |
| 2208 EXPECT_EQ(FormField(string16(), | |
| 2209 ASCIIToUTF16("lastname"), | |
| 2210 ASCIIToUTF16("Earp"), | |
| 2211 ASCIIToUTF16("text"), | |
| 2212 20), | |
| 2213 fields2[1]); | |
| 2214 EXPECT_EQ(FormField(string16(), | |
| 2215 string16(), | |
| 2216 ASCIIToUTF16("Send"), | |
| 2217 ASCIIToUTF16("submit"), | |
| 2218 0), | |
| 2219 fields2[2]); | |
| 2220 } | |
| 2221 | |
| 2222 TEST_F(FormManagerTest, ClearFormWithNode) { | |
| 2223 LoadHTML( | |
| 2224 "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 2225 " <INPUT type=\"text\" id=\"firstname\" value=\"Wyatt\"/>" | |
| 2226 " <INPUT type=\"text\" id=\"lastname\" value=\"Earp\"/>" | |
| 2227 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noAC\" value=\"one\"/>" | |
| 2228 " <INPUT type=\"text\" id=\"notenabled\" disabled=\"disabled\">" | |
| 2229 " <INPUT type=\"hidden\" id=\"notvisible\" value=\"apple\">" | |
| 2230 " <INPUT type=\"submit\" value=\"Send\"/>" | |
| 2231 "</FORM>"); | |
| 2232 | |
| 2233 WebFrame* web_frame = GetMainFrame(); | |
| 2234 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 2235 | |
| 2236 FormManager form_manager; | |
| 2237 form_manager.ExtractForms(web_frame); | |
| 2238 | |
| 2239 // Verify that we have the form. | |
| 2240 std::vector<FormData> forms; | |
| 2241 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 2242 ASSERT_EQ(1U, forms.size()); | |
| 2243 | |
| 2244 // Set the auto-filled attribute on the firstname element. | |
| 2245 WebInputElement firstname = | |
| 2246 web_frame->document().getElementById("firstname").to<WebInputElement>(); | |
| 2247 firstname.setAutofilled(true); | |
| 2248 | |
| 2249 // Set the value of the disabled attribute. | |
| 2250 WebInputElement notenabled = | |
| 2251 web_frame->document().getElementById("notenabled").to<WebInputElement>(); | |
| 2252 notenabled.setValue(WebString::fromUTF8("no clear")); | |
| 2253 | |
| 2254 // Clear the form. | |
| 2255 EXPECT_TRUE(form_manager.ClearFormWithNode(firstname)); | |
| 2256 | |
| 2257 // Verify that the auto-filled attribute has been turned off. | |
| 2258 EXPECT_FALSE(firstname.isAutofilled()); | |
| 2259 | |
| 2260 // Verify the form is cleared. | |
| 2261 FormData form2; | |
| 2262 EXPECT_TRUE(form_manager.FindFormWithFormControlElement( | |
| 2263 firstname, FormManager::REQUIRE_NONE, &form2)); | |
| 2264 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
| 2265 EXPECT_EQ(GURL(web_frame->url()), form2.origin); | |
| 2266 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
| 2267 | |
| 2268 const std::vector<FormField>& fields2 = form2.fields; | |
| 2269 ASSERT_EQ(6U, fields2.size()); | |
| 2270 EXPECT_TRUE(fields2[0].StrictlyEqualsHack( | |
| 2271 FormField(string16(), | |
| 2272 ASCIIToUTF16("firstname"), | |
| 2273 string16(), | |
| 2274 ASCIIToUTF16("text"), | |
| 2275 20))); | |
| 2276 EXPECT_TRUE(fields2[1].StrictlyEqualsHack( | |
| 2277 FormField(string16(), | |
| 2278 ASCIIToUTF16("lastname"), | |
| 2279 string16(), | |
| 2280 ASCIIToUTF16("text"), | |
| 2281 20))); | |
| 2282 EXPECT_TRUE(fields2[2].StrictlyEqualsHack( | |
| 2283 FormField(string16(), | |
| 2284 ASCIIToUTF16("noAC"), | |
| 2285 string16(), | |
| 2286 ASCIIToUTF16("text"), | |
| 2287 20))); | |
| 2288 EXPECT_TRUE(fields2[3].StrictlyEqualsHack( | |
| 2289 FormField(string16(), | |
| 2290 ASCIIToUTF16("notenabled"), | |
| 2291 ASCIIToUTF16("no clear"), | |
| 2292 ASCIIToUTF16("text"), | |
| 2293 20))); | |
| 2294 EXPECT_TRUE(fields2[4].StrictlyEqualsHack( | |
| 2295 FormField(string16(), | |
| 2296 ASCIIToUTF16("notvisible"), | |
| 2297 ASCIIToUTF16("apple"), | |
| 2298 ASCIIToUTF16("hidden"), | |
| 2299 0))); | |
| 2300 EXPECT_TRUE(fields2[5].StrictlyEqualsHack( | |
| 2301 FormField(string16(), | |
| 2302 string16(), | |
| 2303 string16(), | |
| 2304 ASCIIToUTF16("submit"), | |
| 2305 0))); | |
| 2306 } | |
| 2307 | |
| 2308 TEST_F(FormManagerTest, ClearPreviewedFormWithNode) { | |
| 2309 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 2310 " <INPUT type=\"text\" id=\"firstname\" value=\"Wyatt\"/>" | |
| 2311 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 2312 " <INPUT type=\"text\" id=\"email\"/>" | |
| 2313 " <INPUT type=\"submit\" value=\"Send\"/>" | |
| 2314 "</FORM>"); | |
| 2315 | |
| 2316 WebFrame* web_frame = GetMainFrame(); | |
| 2317 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 2318 | |
| 2319 FormManager form_manager; | |
| 2320 form_manager.ExtractForms(web_frame); | |
| 2321 | |
| 2322 // Verify that we have the form. | |
| 2323 std::vector<FormData> forms; | |
| 2324 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 2325 ASSERT_EQ(1U, forms.size()); | |
| 2326 | |
| 2327 // Set the auto-filled attribute. | |
| 2328 WebInputElement firstname = | |
| 2329 web_frame->document().getElementById("firstname").to<WebInputElement>(); | |
| 2330 firstname.setAutofilled(true); | |
| 2331 WebInputElement lastname = | |
| 2332 web_frame->document().getElementById("lastname").to<WebInputElement>(); | |
| 2333 lastname.setAutofilled(true); | |
| 2334 WebInputElement email = | |
| 2335 web_frame->document().getElementById("email").to<WebInputElement>(); | |
| 2336 email.setAutofilled(true); | |
| 2337 | |
| 2338 // Set the suggested values on two of the elements. | |
| 2339 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); | |
| 2340 email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); | |
| 2341 | |
| 2342 // Clear the previewed fields. | |
| 2343 EXPECT_TRUE(form_manager.ClearPreviewedFormWithNode(firstname)); | |
| 2344 | |
| 2345 // Fields with non-empty values are not modified. | |
| 2346 EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); | |
| 2347 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); | |
| 2348 EXPECT_TRUE(firstname.isAutofilled()); | |
| 2349 | |
| 2350 // Verify the previewed fields are cleared. | |
| 2351 EXPECT_TRUE(lastname.value().isEmpty()); | |
| 2352 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); | |
| 2353 EXPECT_FALSE(lastname.isAutofilled()); | |
| 2354 EXPECT_TRUE(email.value().isEmpty()); | |
| 2355 EXPECT_TRUE(email.suggestedValue().isEmpty()); | |
| 2356 EXPECT_FALSE(email.isAutofilled()); | |
| 2357 } | |
| 2358 | |
| 2359 TEST_F(FormManagerTest, FormWithNodeIsAutoFilled) { | |
| 2360 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" | |
| 2361 " <INPUT type=\"text\" id=\"firstname\" value=\"Wyatt\"/>" | |
| 2362 " <INPUT type=\"text\" id=\"lastname\"/>" | |
| 2363 " <INPUT type=\"text\" id=\"email\"/>" | |
| 2364 " <INPUT type=\"submit\" value=\"Send\"/>" | |
| 2365 "</FORM>"); | |
| 2366 | |
| 2367 WebFrame* web_frame = GetMainFrame(); | |
| 2368 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 2369 | |
| 2370 FormManager form_manager; | |
| 2371 form_manager.ExtractForms(web_frame); | |
| 2372 | |
| 2373 // Verify that we have the form. | |
| 2374 std::vector<FormData> forms; | |
| 2375 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 2376 ASSERT_EQ(1U, forms.size()); | |
| 2377 | |
| 2378 WebInputElement firstname = | |
| 2379 web_frame->document().getElementById("firstname").to<WebInputElement>(); | |
| 2380 | |
| 2381 // Auto-filled attribute not set yet. | |
| 2382 EXPECT_FALSE(form_manager.FormWithNodeIsAutoFilled(firstname)); | |
| 2383 | |
| 2384 // Set the auto-filled attribute. | |
| 2385 firstname.setAutofilled(true); | |
| 2386 | |
| 2387 EXPECT_TRUE(form_manager.FormWithNodeIsAutoFilled(firstname)); | |
| 2388 } | |
| 2389 | |
| 2390 TEST_F(FormManagerTest, LabelsHiddenFields) { | |
| 2391 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 2392 " <LABEL for=\"firstname\"> First name: </LABEL>" | |
| 2393 " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>" | |
| 2394 " <LABEL for=\"lastname\"> Last name: </LABEL>" | |
| 2395 " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>" | |
| 2396 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 2397 "</FORM>"); | |
| 2398 | |
| 2399 WebFrame* web_frame = GetMainFrame(); | |
| 2400 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 2401 | |
| 2402 FormManager form_manager; | |
| 2403 form_manager.ExtractForms(web_frame); | |
| 2404 | |
| 2405 std::vector<FormData> forms; | |
| 2406 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
| 2407 ASSERT_EQ(1U, forms.size()); | |
| 2408 | |
| 2409 const FormData& form = forms[0]; | |
| 2410 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
| 2411 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
| 2412 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
| 2413 | |
| 2414 const std::vector<FormField>& fields = form.fields; | |
| 2415 ASSERT_EQ(3U, fields.size()); | |
| 2416 EXPECT_TRUE(fields[0].StrictlyEqualsHack( | |
| 2417 FormField(string16(), | |
| 2418 ASCIIToUTF16("firstname"), | |
| 2419 ASCIIToUTF16("John"), | |
| 2420 ASCIIToUTF16("hidden"), | |
| 2421 0))); | |
| 2422 EXPECT_TRUE(fields[1].StrictlyEqualsHack( | |
| 2423 FormField(string16(), | |
| 2424 ASCIIToUTF16("lastname"), | |
| 2425 ASCIIToUTF16("Smith"), | |
| 2426 ASCIIToUTF16("hidden"), | |
| 2427 0))); | |
| 2428 EXPECT_TRUE(fields[2].StrictlyEqualsHack( | |
| 2429 FormField(string16(), | |
| 2430 ASCIIToUTF16("reply-send"), | |
| 2431 string16(), | |
| 2432 ASCIIToUTF16("submit"), | |
| 2433 0))); | |
| 2434 } | |
| 2435 | |
| 2436 TEST_F(FormManagerTest, LabelForElementHidden) { | |
| 2437 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | |
| 2438 " <LABEL for=\"firstname\"> First name: </LABEL>" | |
| 2439 " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>" | |
| 2440 " <LABEL for=\"lastname\"> Last name: </LABEL>" | |
| 2441 " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>" | |
| 2442 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | |
| 2443 "</FORM>"); | |
| 2444 | |
| 2445 WebFrame* web_frame = GetMainFrame(); | |
| 2446 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
| 2447 | |
| 2448 WebElement e = web_frame->document().getElementById("firstname"); | |
| 2449 WebFormControlElement firstname = e.to<WebFormControlElement>(); | |
| 2450 | |
| 2451 // Hidden form control element should not have a label set. | |
| 2452 FormManager form_manager; | |
| 2453 EXPECT_EQ(string16(), form_manager.LabelForElement(firstname)); | |
| 2454 } | |
| 2455 | |
| 2456 } // namespace | |
| OLD | NEW |